From a26f1abca0a8c7df99dc68bb44d7c58f0de3f787 Mon Sep 17 00:00:00 2001 From: Quarto GHA Workflow Runner Date: Wed, 24 Jul 2024 16:13:01 +0000 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- external/DownloadDopplerScattData.html | 2 +- external/ECCO_cloud_direct_access_s3.html | 2 +- external/ECCO_download_data.html | 2 +- external/Introduction_to_xarray.html | 2 +- external/July_2022_Earthdata_Webinar.html | 2 +- external/SWOT_SSH_dashboard.html | 2 +- external/SWOT_to_kerchunk.html | 2 +- external/VisualizeDopplerScattData.html | 2 +- external/cof-zarr-reformat.html | 2 +- external/insitu_dataviz_demo.html | 2 +- external/zarr-eosdis-store.html | 2 +- external/zarr_access.html | 2 +- quarto_text/SWOT.html | 8 +- search.json | 7334 ++++++++++---------- site_libs/bootstrap/bootstrap-dark.min.css | 2 +- site_libs/bootstrap/bootstrap.min.css | 2 +- sitemap.xml | 468 +- 18 files changed, 3920 insertions(+), 3920 deletions(-) diff --git a/.nojekyll b/.nojekyll index 90786532..988518c3 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -40c71ae4 \ No newline at end of file +dd29852a \ No newline at end of file diff --git a/external/DownloadDopplerScattData.html b/external/DownloadDopplerScattData.html index b07891a2..1a7937c4 100644 --- a/external/DownloadDopplerScattData.html +++ b/external/DownloadDopplerScattData.html @@ -1094,7 +1094,7 @@

S-MODE Workshop: Science Case Study Airborne Part 1

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop

diff --git a/external/ECCO_cloud_direct_access_s3.html b/external/ECCO_cloud_direct_access_s3.html index a4e9dc2e..2812e223 100644 --- a/external/ECCO_cloud_direct_access_s3.html +++ b/external/ECCO_cloud_direct_access_s3.html @@ -1103,7 +1103,7 @@

Direct Access to ECCO V4r4 Datasets in the Cloud

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, ECCO.

diff --git a/external/ECCO_download_data.html b/external/ECCO_download_data.html index 25dd93c8..dabc8790 100644 --- a/external/ECCO_download_data.html +++ b/external/ECCO_download_data.html @@ -1098,7 +1098,7 @@

Access to ECCO V4r4 Datasets on a Local Machine

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, ECCO.

diff --git a/external/Introduction_to_xarray.html b/external/Introduction_to_xarray.html index caee1f54..f634386c 100644 --- a/external/Introduction_to_xarray.html +++ b/external/Introduction_to_xarray.html @@ -1097,7 +1097,7 @@

Xarray

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from NASA Openscapes 2021 Cloud Hackathon Repository

diff --git a/external/July_2022_Earthdata_Webinar.html b/external/July_2022_Earthdata_Webinar.html index b9c7d4d1..ada98d66 100644 --- a/external/July_2022_Earthdata_Webinar.html +++ b/external/July_2022_Earthdata_Webinar.html @@ -1154,7 +1154,7 @@

Earthdata Webinar

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, the-coding-club

diff --git a/external/SWOT_SSH_dashboard.html b/external/SWOT_SSH_dashboard.html index 2f78fadc..8bf3bc7e 100644 --- a/external/SWOT_SSH_dashboard.html +++ b/external/SWOT_SSH_dashboard.html @@ -1114,7 +1114,7 @@

Integrating Dask, Kerchunk, Zarr and Xarray

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.

diff --git a/external/SWOT_to_kerchunk.html b/external/SWOT_to_kerchunk.html index 47aed86e..49c03fd4 100644 --- a/external/SWOT_to_kerchunk.html +++ b/external/SWOT_to_kerchunk.html @@ -1116,7 +1116,7 @@

Kerchunk JSON Generation

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.

diff --git a/external/VisualizeDopplerScattData.html b/external/VisualizeDopplerScattData.html index 4c3f40ab..53c28215 100644 --- a/external/VisualizeDopplerScattData.html +++ b/external/VisualizeDopplerScattData.html @@ -1095,7 +1095,7 @@

S-MODE Workshop: Science Case Study Airborne Part 2

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop

diff --git a/external/cof-zarr-reformat.html b/external/cof-zarr-reformat.html index bd5383ed..ba3d1df2 100644 --- a/external/cof-zarr-reformat.html +++ b/external/cof-zarr-reformat.html @@ -1097,7 +1097,7 @@

COF Zarr Access via Reformat

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, ECCO.

diff --git a/external/insitu_dataviz_demo.html b/external/insitu_dataviz_demo.html index e031267e..227cc20f 100644 --- a/external/insitu_dataviz_demo.html +++ b/external/insitu_dataviz_demo.html @@ -1099,7 +1099,7 @@

S-MODE Workshop: Science Case Study In Situ

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop

diff --git a/external/zarr-eosdis-store.html b/external/zarr-eosdis-store.html index e5f49477..f2fa3443 100644 --- a/external/zarr-eosdis-store.html +++ b/external/zarr-eosdis-store.html @@ -1088,7 +1088,7 @@

Zarr Example

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from NASA’s Zarr EOSDIS store notebook

diff --git a/external/zarr_access.html b/external/zarr_access.html index 78bf68cf..a2977ab2 100644 --- a/external/zarr_access.html +++ b/external/zarr_access.html @@ -1107,7 +1107,7 @@

Zarr Access for NetCDF4 files

-

imported on: 2024-07-22

+

imported on: 2024-07-24

This notebook is from NASA Openscapes 2021 Cloud Hackathon Repository

diff --git a/quarto_text/SWOT.html b/quarto_text/SWOT.html index e569cb02..14670606 100644 --- a/quarto_text/SWOT.html +++ b/quarto_text/SWOT.html @@ -1242,11 +1242,11 @@

Access &
-
-

Access SWOT Hydrology data in the cloud | locally

+
+

Basic Access SWOT Hydrology data in the cloud | locally

-
-

Access SWOT Oceanography data in the cloud | locally

+
+

Basic Access SWOT Oceanography data in the cloud | locally

SWOT Raster Multifile Access & Quality Flag Application in the cloud | locally

diff --git a/search.json b/search.json index b03024c5..8b0649f0 100644 --- a/search.json +++ b/search.json @@ -1,473 +1,505 @@ [ { - "objectID": "index.html#welcome", - "href": "index.html#welcome", - "title": "PO.DAAC Cookbook", - "section": "Welcome!", - "text": "Welcome!\nWelcome to the tutorial repository for the Physical Oceanography Distributed Active Archive Center (PO.DAAC)! Our goal is to make NASA’s ocean, climate, and surface water data universally accessible and meaningful.\nThis site is under active, open development. Stay tuned for more and ever-evolving content!", + "objectID": "quarto_text/SMAP.html#background", + "href": "quarto_text/SMAP.html#background", + "title": "SMAP", + "section": "Background", + "text": "Background\nThe Soil Moisture Active Passive (SMAP) satellite is designed to principally measure soil moisture and freeze/thaw state from space for all non-liquid water surfaces globally within the top layer of the Earth. The mission additionally provides a value-added Level 4 terrestrial carbon dataset derived from SMAP observations. More information can be found on PO.DAAC’s SMAP webpage.", "crumbs": [ - "Welcome" + "Tutorials", + "Dataset Specific", + "SMAP" ] }, { - "objectID": "index.html#about-the-cookbook", - "href": "index.html#about-the-cookbook", - "title": "PO.DAAC Cookbook", - "section": "About the Cookbook", - "text": "About the Cookbook\nThe PO.DAAC Cookbook is a place to learn about & experiment with the NASA Earthdata datasets we host. All data can be accessed freely in the cloud or downloaded locally. The How To section gives bite-sized pieces of code created in collaboration with the NASA Earthdata Cloud Cookbook community. Tutorials connect these pieces together to form example workflows specific to PO.DAAC datasets both within the cloud and on a local machine. To learn more about the cloud specifically, see the Earthdata Cloud Primer.\nMost tutorials included in this cookbook are created with Python Jupyter Notebooks. All chapters in the cookbook are a combination of narrative, links, code, and outputs — and underlying each chapter is a file type that you can access on PO.DAAC GitHub (linked on the left navbar): Jupyter (.ipynb) or Quarto (.qmd) files.", + "objectID": "quarto_text/SMAP.html#data-resources-tutorials", + "href": "quarto_text/SMAP.html#data-resources-tutorials", + "title": "SMAP", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nVisualizing Ocean Salinity as Powerful Storms Wreak Havoc in California - Data in Action Use Case Notebook Tutorial with a local machine workflow\n\nThe Data in Action Story\n\n\n\nMonitoring Changes in the Arctic Using SMAP Satellite data and Saildrone - AWS cloud tutorial that compares salinity from the SMAP satellite and Saildrone in-situ measurements", "crumbs": [ - "Welcome" + "Tutorials", + "Dataset Specific", + "SMAP" ] }, { - "objectID": "index.html#about-po.daac", - "href": "index.html#about-po.daac", - "title": "PO.DAAC Cookbook", - "section": "About PO.DAAC", - "text": "About PO.DAAC\nThe Physical Oceanography Distributed Active Archive Center (PO.DAAC) is a NASA Earth Observing System Data and Information System (EOSDIS) data center managed by the Earth Science Data and Information System (ESDIS) Project. The PO.DAAC is operated by Jet Propulsion Laboratory (JPL) in Pasadena, California.\nFor a brief overview of PO.DAAC’s history, see The Evolution of the PO.DAAC: Seasat to SWOT.", + "objectID": "quarto_text/SMAP.html#additional-resources", + "href": "quarto_text/SMAP.html#additional-resources", + "title": "SMAP", + "section": "Additional Resources", + "text": "Additional Resources\nNASA Mission Page\nData in Action: Using Coastal Surface Salinity to Monitor Global Water Cycle Changes", "crumbs": [ - "Welcome" + "Tutorials", + "Dataset Specific", + "SMAP" ] }, { - "objectID": "index.html#citation", - "href": "index.html#citation", - "title": "PO.DAAC Cookbook", - "section": "Citation", - "text": "Citation\nPlease cite the PO.DAAC Cookbook through the project’s Zenodo archive using DOI: 10.5281/zenodo.10530664. This DOI represents all versions, and will always resolve to the latest one.\nThe citation will look something like:\n\nNickles, C., Taglialatela, C., McNelis, J., Gangl, M., Ou, C., Tarpinian, N., McDonald, V., Henze, D., Tebaldi, N., Greguska, F., Perez, S., Wang, J., Armstrong, E., Sanchez, J., Walschots, Z., Liu, S., & Gentemann, C. (2024). podaac/tutorials: PO.DAAC Cookbook v2024.01 (v2024.01.18). Zenodo. https://doi.org/10.5281/zenodo.10530664\n\nPlease visit the Cookbook’s DOI link to get the most recent version - the one above is not automatically generated and may be out of date as we release updated versions of the Cookbook.\n\nDisclaimer\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "objectID": "quarto_text/Questions.html", + "href": "quarto_text/Questions.html", + "title": "Questions?", + "section": "", + "text": "Earthdata Forum - For general questions about PO.DAAC data or data access, see the Earthdata Forum and specify PO.DAAC.\n\n\nTutorials GitHub Issues Page - For technical questions about contributing to the Cookbook or reporting issues about any tutorials in the Cookbook, create a new GitHub Issue in our podaac/tutorials repository.", "crumbs": [ - "Welcome" + "Questions?" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#summary", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#summary", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Summary", - "text": "Summary\n\nThis notebook will show direct access of PO.DAAC archived products in the Earthdata Cloud in AWS Simple Storage Service (S3).\n\n\nIn this demo, we will showcase the usage of the Sentinel 6 product:\n\n\nSentinel-6A MF Jason-CS L2 P4 Altimeter Low Resolution (LR) NTC Ocean Surface Topography F08 Data Product - shortname JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08\n\n\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and plot the sea surface height anomaly.", + "objectID": "quarto_text/DataSubscriberDownloader.html#introduction", + "href": "quarto_text/DataSubscriberDownloader.html#introduction", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Introduction", + "text": "Introduction\n\nDownloader\nThe Downloader is useful if you need to download PO.DAAC data once in a while or prefer to do it “on-demand”. The Downloader makes no assumptions about the last time run or what is new in the archive, it simply uses the provided requests and downloads all matching data.\n\n\nSubscriber\nThe subscriber is useful for users who need to continuously pull the latest data from the PO.DAAC archive. If you feed data into a model or real time process, the subscriber allows you to repeatedly run the script and only download the latest data.\n\n\nInstallation\nBoth subscriber and downloader require Python >= 3.7.\nThe subscriber and downloader scripts are available in the pypi python repository, it can be installed via pip:\npip install podaac-data-subscriber\nyou should now have access to the downloader and subscriber Command line interfaces.\n\nNote: If after installation, the podaac-data-subscriber or podaac-data-downloader commands are not available, you may need to add the script location to the PATH. This could be due to a User Install of the python package, which is common on shared systems where python packages are installed for the user (not the system). See Installing to the User Site and User Installs for more information on finding the location of installed scripts and adding them to the PATH.\n\nTo use the Subscriber or Downloader, you will need to have an Earthdata login account. You will also need a netrc file with your Earthdata Login credentials to access the data. Follow these authentication instructions to create your netrc if you do not have one already.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#requirement", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#requirement", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Requirement", - "text": "Requirement\n\nThis tutorial can only be run in an AWS cloud instance running in us-west-2 region.", + "objectID": "quarto_text/DataSubscriberDownloader.html#command-cmd-line-examples", + "href": "quarto_text/DataSubscriberDownloader.html#command-cmd-line-examples", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Command (cmd) Line Examples", + "text": "Command (cmd) Line Examples\nThe dataset listing pages on the PO.DAAC Portal provide cmd line examples for each dataset respectively. For example, on a MUR SST dataset landing page, if you click the Download icon under Capabilities on the right side, the following script for the subscriber should be visible:\npodaac-data-subscriber -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2002-08-31T21:00:00Z\nDownloading simulated SWOT Raster data over a specified region and time:\npodaac-data-downloader -c SWOT_SIMULATED_NA_CONTINENT_L2_HR_Raster_V1 -d ./SWOT_SIMULATED_NA_CONTINENT_L2_HR_Raster_V1 --start-date 2022-08-02T00:00:00Z --end-date 2022-08-22T00:00:00Z -b=\"-97,32.5,-96.5,33\"\nSubscribing to the [GRACE-FO Monthly Ocean Bottom Pressure Anomaly Dataset]:(https://podaac.jpl.nasa.gov/dataset/TELLUS_GRFO_L3_CSR_RL06_OCN_v04)\npodaac-data-subscriber -c TELLUS_GRFO_L3_CSR_RL06_OCN_v04 -d ./data/TELLUS_GRFO_L3_CSR_RL06_OCN_v04 --start-date 2018-05-22T00:00:00Z", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#learning-objectives", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#learning-objectives", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Learning Objectives:", - "text": "Learning Objectives:\n\nAuthenticate for earthaccess Python Library using your NASA Earthdata Login.\n\n\nAccess DAAC data directly from the in-region S3 bucket without moving or downloading any files to your local (cloud) workspace.\n\n\nNote: no files are being downloaded off the cloud, rather, we are working with the data in the AWS cloud.", + "objectID": "quarto_text/DataSubscriberDownloader.html#tutorial-examples-utilizing-the-po.daac-subscriberdownloader", + "href": "quarto_text/DataSubscriberDownloader.html#tutorial-examples-utilizing-the-po.daac-subscriberdownloader", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Tutorial Examples Utilizing the PO.DAAC Subscriber/Downloader:", + "text": "Tutorial Examples Utilizing the PO.DAAC Subscriber/Downloader:\n\nSWOT NetCDF to Geotiff Conversion", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#libraries-needed", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#libraries-needed", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Libraries Needed:", - "text": "Libraries Needed:\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline", + "objectID": "quarto_text/DataSubscriberDownloader.html#documentation", + "href": "quarto_text/DataSubscriberDownloader.html#documentation", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Documentation", + "text": "Documentation", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#earthdata-login", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#earthdata-login", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Earthdata Login", - "text": "Earthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", + "objectID": "quarto_text/DataSubscriberDownloader.html#step-2-run-the-script", + "href": "quarto_text/DataSubscriberDownloader.html#step-2-run-the-script", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Step 2: Run the Script", + "text": "Step 2: Run the Script\nUsage:\nusage: PO.DAAC bulk-data downloader [-h] -c COLLECTION -d OUTPUTDIRECTORY [--cycle SEARCH_CYCLES] [-sd STARTDATE] [-ed ENDDATE] [-f] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-e EXTENSIONS] [-gr GRANULENAME] [--process PROCESS_CMD] [--version] [--verbose]\n [-p PROVIDER] [--limit LIMIT] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n--cycle SEARCH_CYCLES\n Cycle number for determining downloads. can be repeated for multiple cycles \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --cycle must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the downloader.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nUnlike the ‘subscriber’, no ‘state’ is maintained for the downloader. if you re-run the downloader you’ll re-download all of the files again, unlike the subscriber which will download newly ingested data since the last run.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#sentinel-6a-sea-surface-height-anomaly-data", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#sentinel-6a-sea-surface-height-anomaly-data", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "1. Sentinel 6A Sea Surface Height Anomaly Data", - "text": "1. Sentinel 6A Sea Surface Height Anomaly Data", + "objectID": "quarto_text/DataSubscriberDownloader.html#note-netrc-file", + "href": "quarto_text/DataSubscriberDownloader.html#note-netrc-file", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Note: netrc file", + "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#access-files-without-any-downloads-to-your-running-instance", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#access-files-without-any-downloads-to-your-running-instance", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Access Files without any Downloads to your running instance", - "text": "Access Files without any Downloads to your running instance\n\nHere, we use the earthaccess Python library to search for without downloading any files.\n\n#contain links for each granules\nssh_data = earthaccess.search_data(short_name = 'JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08',\n temporal = (\"2023-02-18 12:00:00\", \"2023-02-19 12:00:00\"),\n )\n\nGranules found: 22", + "objectID": "quarto_text/DataSubscriberDownloader.html#advanced-usage", + "href": "quarto_text/DataSubscriberDownloader.html#advanced-usage", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Advanced Usage", + "text": "Advanced Usage\n\nDownload data by filename\nIf you’re aware of a file you want to download, you can use the -gr option to download by a filename. The -c (COLLECTION) and -d (directory) options are still required.\nThe -gr option works by taking the file name, removing the suffix and searching for a CMR entry called the granuleUR. Some examples of this include:\n\n\n\n\n\n\n\n\nCollection\nFilename\nCMR GranuleUR\n\n\n\n\nMUR25-JPL-L4-GLOB-v04.2\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2\n\n\nJASON_CS_S6A_L2_ALT_HR_STD_OST_NRT_F\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07.nc\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07\n\n\n\nBecause of this behavior, granules without data suffixes and granules where the the UR does not directly follow this convention may not work as anticipated. We will be adding the ability to download by granuleUR in a future enhancement.\nThe -gr option supports wildcard search patterns (using ? for single- and * for multi-character expansion) to select and download multiple granules based on the filename pattern. This feature is supported through wildcard search functionality provided through CMR, which is described in the CMR Search API documentation.\n\n\nDownload data by cycle\nSome PO.DAAC datasets are better suited for cycles based search instead of start and end times. To enabled this, we’ve added ‘cycle’ based downloading to the data-downloader. The following example will download data from cycle 42:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42\nThe cycle parameter can be repeated to specify multiple cycles:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42 --cycle 43 --cycle 44\n\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z -ed 2014-07-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nDownloader behavior when a file already exists\nBy default, when the downloader is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the downloader will skip downloading that file.\nThis can drastically reduce the time for the downloader to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the downloader to always download matching files, by using –force/-f.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -f\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-downloader -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\" -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#extract-and-grab-first-link", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#extract-and-grab-first-link", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Extract and grab first link", - "text": "Extract and grab first link\n\n# extracting links (url)\ndata_links = [granule.data_links(access=\"direct\") for granule in ssh_data]\n\n#picks first link\nfile_path = data_links[0] \nfile_path\n\n['s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08/S6A_P4_2__LR_STD__NT_084_001_20230218T160856_20230218T170509_F08.nc']", + "objectID": "quarto_text/DataSubscriberDownloader.html#run-the-script", + "href": "quarto_text/DataSubscriberDownloader.html#run-the-script", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Run the Script", + "text": "Run the Script\nUsage:\nusage: PO.DAAC data subscriber [-h] -c COLLECTION -d OUTPUTDIRECTORY [-f] [-sd STARTDATE] [-ed ENDDATE] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-m MINUTES] [-e EXTENSIONS] [--process PROCESS_CMD] [--version] [--verbose] [-p PROVIDER] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n-m MINUTES, --minutes MINUTES\n How far back in time, in minutes, should the script look for data. If running this script as a cron, this value should be equal to or greater than how often your cron runs. \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --minutes must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the subscriber.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nEvery time the script runs successfully (that is, no errors), a .update__<collectionname> file is created in your download directory with the last run timestamp. This timestamp will be used the next time the script is run. It will look for data between the timestamp in that file and the current time to determine new files to download.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#authenticate-from-aws", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#authenticate-from-aws", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Authenticate from AWS", - "text": "Authenticate from AWS\n\n#authenticate and get short term credientials to bucket (podaac-ops...)\nfs_s3 = earthaccess.get_s3fs_session(results=ssh_data)", + "objectID": "quarto_text/DataSubscriberDownloader.html#note-cmr-times", + "href": "quarto_text/DataSubscriberDownloader.html#note-cmr-times", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Note: CMR times", + "text": "Note: CMR times\nThere are numerous ‘times’ available to query on in CMR. For the default subscriber, we look at the ‘created at’ field, which will look for when a granule file was ingested into the archive. This means as PO.DAAC gets data, your subscriber will also get data, regardless of the time range within the granule itself.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#read-file", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#read-file", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Read file", - "text": "Read file\n\n#reading file into memory\nfs_s3.open(file_path[0])\n\n<File-like object S3FileSystem, podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08/S6A_P4_2__LR_STD__NT_084_001_20230218T160856_20230218T170509_F08.nc>", + "objectID": "quarto_text/DataSubscriberDownloader.html#note-netrc-file-1", + "href": "quarto_text/DataSubscriberDownloader.html#note-netrc-file-1", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Note: netrc file", + "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#load-with-xarray", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#load-with-xarray", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Load with xarray", - "text": "Load with xarray\n\nThe variable ‘ssha’ is located in the group ‘data_01’ and within the subgroup of ‘ku’. Here, we create variables that will access the group and the subgroups.\n\n# Load the netCDF file using xarray\nku_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01/ku')\nc_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01/c')\ndata01_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01')", + "objectID": "quarto_text/DataSubscriberDownloader.html#advanced-usage-1", + "href": "quarto_text/DataSubscriberDownloader.html#advanced-usage-1", + "title": "PO.DAAC Data Subscriber/Downloader", + "section": "Advanced Usage", + "text": "Advanced Usage\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nSubscriber behavior when a file already exists\nBy default, when the subscriber is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the subscriber will skip downloading that file.\nThis can drastically reduce the time for the subscriber to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the subscriber to always download matching files, by using –force/-f.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -f\n\n\nRunning as a Cron job\nTo automatically run and update a local file system with data files from a collection, one can use a syntax like the following:\n10 * * * * podaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d /path/to/data/VIIRS_N20-OSPO-L2P-v2.61 -e .nc -e .h5 -m 60 -b=\"-180,-90,180,90\" --verbose >> ~/.subscriber.log\n\nThis will run every hour at ten minutes passed, and output will be appended to a local file called ~/.subscriber.log\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\"\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov", "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "How To", + "Download/Subscribe" ] }, { - "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#plot-sea-surface-height-anomaly-ssha", - "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#plot-sea-surface-height-anomaly-ssha", - "title": "Access Sentinel 6 Data in the Cloud", - "section": "Plot sea surface height anomaly (ssha)", - "text": "Plot sea surface height anomaly (ssha)\n\n# Access the 'ssha' variable under 'data_01' and 'ku'\nssha = ku_ds['ssha']\n\n# Plot the 'ssha'\nplt.figure(figsize=(10, 5))\nplt.scatter(data01_ds.longitude, data01_ds.latitude, c = ssha, cmap = 'coolwarm', vmin=-0.2, vmax=0.2)\nplt.colorbar(label='Sea Surface Height Anomaly (ssha)')\nplt.title('Sea Surface Height Anomaly (ssha)')\nplt.xlabel('Longitude Index')\nplt.ylabel('Latitude Index')\nplt.show()\n\n\n\n\n\n\n\n\n\nssha.plot()\n\n\n\n\n\n\n\n\n\n# Create a plot with a specific projection\nfig = plt.figure(figsize=(10, 5))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\nax.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree()) # Set the extent to global\n\n# Add features to the map\nax.add_feature(cfeature.LAND)\nax.add_feature(cfeature.OCEAN) # Correct attribute for oceans\nax.add_feature(cfeature.COASTLINE)\nax.add_feature(cfeature.BORDERS, linestyle=':')\n\n# Plot the 'ssha' with longitude and latitude from your dataset\nscatter = ax.scatter(data01_ds.longitude, data01_ds.latitude, c=ssha, cmap='coolwarm', transform=ccrs.PlateCarree())\n\n# Add a colorbar\ncbar = plt.colorbar(scatter, ax=ax, orientation='vertical', fraction=0.046, pad=0.04)\ncbar.set_label('Sea Surface Height Anomaly (ssha)')\n\n# Set titles and labels\nplt.title('Sea Surface Height Anomaly (ssha)')\nax.set_xlabel('Longitude')\nax.set_ylabel('Latitude')\n\n# Show the plot\nplt.show()", + "objectID": "quarto_text/CloudvsLocalWorkflows.html", + "href": "quarto_text/CloudvsLocalWorkflows.html", + "title": "Cloud vs. Local Workflows", + "section": "", + "text": "Tutorials showcasing the same workflows in in different locations: in the cloud hosted by Amazon Web Services (AWS) or on a local machine downloaded from the cloud.\nNote: NASA Earthdata is hosted in the us-west-2 region in the cloud.\n\nExamples: SWOT Oceanography & Hydrology Data Exploration\nAccess SWOT Hydrology data Cloud Version | Local Version\nAccess SWOT Oceanography data Cloud Version | Local Version\nSWOT Raster Multifile Access & Quality Flag Application Cloud Version | Local Version\n\n\nExample: Amazon Estuary Exploration\nThese tutorials explore the relationships between land water equivalent thickness, river height, sea surface salinity, and sea surface temperature in the Amazon River estuary and coastal region from multiple datasets (GRACE-FO, Pre-SWOT MEaSUREs, OISSS, & MODIS).\nCloud Version | Local Version\n\n\nExample: Lake Extent\nThese tutorials explore OPERA Dynamic Surface Water Extent (DSWx) product: how to search for, access, visualize, and mosaic OPERA data over lake Powell.\nCloud Version | Local Version\n\n\nExample: Reservoir Surface Area\nThese tutorials estimate reservoir surface area from Harmonized Landsat-Sentinel (HLS) Imagery.\nCloud Version | Local Version", "crumbs": [ "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access in Cloud" + "Cloud vs. Local Workflows" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#before-you-start", - "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#before-you-start", - "title": "\nTable of Contents\n", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an Earthdata account https://urs.earthdata.nasa.gov.\nAccounts are free to create and take just a moment to set up.", + "objectID": "quarto_text/DatasetSpecificExamples.html#missions-with-dataset-specific-examples", + "href": "quarto_text/DatasetSpecificExamples.html#missions-with-dataset-specific-examples", + "title": "Dataset Specific", + "section": "Missions with Dataset-specific Examples:", + "text": "Missions with Dataset-specific Examples:\n\nECCO - Estimating the Circulation and Climate of the Ocean\nGHRSST - Group for High Resolution Sea Surface Temperature\nOPERA - Observational Products for End-Users from Remote Sensing Analysis\nSentinel-6A Michael Freilich Jason-CS\nSMAP - Soil Moisture Active Passive\nS-MODE - Submesoscale Ocean Dynamics and Vertical Transport Experiment\nSWOT - Surface Water and Ocean Topography", "crumbs": [ "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access by Cycle/Pass" + "Dataset Specific" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#import-libraries", - "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#import-libraries", - "title": "\nTable of Contents\n", - "section": "Import Libraries", - "text": "Import Libraries\n\nimport requests\nfrom os import makedirs\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", + "objectID": "quarto_text/DatasetSpecificExamples.html#gis-storymaps-of-select-datasets", + "href": "quarto_text/DatasetSpecificExamples.html#gis-storymaps-of-select-datasets", + "title": "Dataset Specific", + "section": "GIS StoryMaps of Select Datasets:", + "text": "GIS StoryMaps of Select Datasets:\nPO.DAAC GIS StoryMap Collection Page", + "crumbs": [ + "Tutorials", + "Dataset Specific" + ] + }, + { + "objectID": "quarto_text/Experimental.html", + "href": "quarto_text/Experimental.html", + "title": "In Development", + "section": "", + "text": "Content will appear as it is being developed!", + "crumbs": [ + "In Development" + ] + }, + { + "objectID": "quarto_text/SMODE.html#background", + "href": "quarto_text/SMODE.html#background", + "title": "S-MODE", + "section": "Background", + "text": "Background\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) is a NASA Earth Venture Suborbital (EVS-3) mission that utilizes research aircraft equipped with state-of-the-art remote sensing instruments, a research vessel, Wave Gliders, Saildrones, and many other in situ assets. These instruments contribute to an unprecedented view of the physics of submesoscale eddies and fronts, and their effects on vertical transport in the upper ocean. The S-MODE investigation is composed of a Pilot Campaign (Fall 2021) and two Intensive Operating Periods (IOP-1 and IOP-2, Fall 2022 and Spring 2023). Each field campaign is between 3-4 weeks in duration. The scientific area of interest is located about 150 miles off the coast of San Francisco\nMore information can be found on PO.DAAC’s SMODE webpage.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access by Cycle/Pass" + "S-MODE" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#authentication-with-earthaccess", - "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#authentication-with-earthaccess", - "title": "\nTable of Contents\n", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", + "objectID": "quarto_text/SMODE.html#data-resources-tutorials", + "href": "quarto_text/SMODE.html#data-resources-tutorials", + "title": "S-MODE", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nScience Case Study Airborne\nThe DownloadDopplerScattData.ipynb notebook walks through creating the .netrc file and downloading the Dopplerscatt data used in this case study. The VisualizeDopplerScattData.ipynb notebook contains the Airborne Science Case Study data visualization and discussion. Instructions for installing the airborne material in a conda environment are contained in this Airborne Case Study README.\n\n\nScience Case Study In Situ\nThe insitu_dataviz_demo.ipynb notebook contains the In Situ Science Case Study data visualization and discussion. This notebook also contains sample code to run the PO.DAAC Data Downloader to download Saildrone data. Instructions for installing the necessary Python packages, and more information on obtaining S-MODE data are in the In Situ Case Study README.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access by Cycle/Pass" + "S-MODE" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#find-granules-by-cyclepass-number", - "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#find-granules-by-cyclepass-number", - "title": "\nTable of Contents\n", - "section": "Find granules by cycle/pass number", - "text": "Find granules by cycle/pass number\nThe CMR Search API provides for searching ingested granules by their cycle and pass numbers. A third parameter, the tile identifier, is provisioned for use during the upcoming SWOT mission but isn’t used by CMR Search at this time. Read more about these orbit identifiers here.\nPasses within a cycle are unique, there will be no repeats until the next cycle. Tile numbers are only unique within a pass, so if you’re looking only at tile numbers there will be over 300 per cycle, but only 1 per pass.\nInfo below may only apply to NRT use case:\n\nThis workflow/notebook can be run routinely to maintain a time series of NRT data, downloading new granules as they become available in CMR.\nThe notebook writes/overwrites a file .update to the target data directory with each successful run. The file tracks to date and time of the most recent update to the time series of NRT granules using a timestamp in the format yyyy-mm-ddThh:mm:ssZ.\nThe timestamp matches the value used for the created_at parameter in the last successful run. This parameter finds the granules created within a range of datetimes. This workflow leverages the created_at parameter to search backwards in time for new granules ingested between the time of our timestamp and now.\n\nThe variables in the cell below determine the workflow behavior on its initial run:\n\ntrackcycle and trackpass: Set the cycle and pass numbers to use for the CMR granule search.\ncmr: The domain of the target CMR instance, either cmr.earthdata.nasa.gov.\nccid: The unique CMR concept-id of the desired collection.\ndata: The path to a local directory in which to download/maintain a copy of the NRT granule time series.\n\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\n# this function returns a concept id for a particular dataset\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n#\n# This cell accepts parameters from command line with papermill: \n# https://papermill.readthedocs.io\n#\n# These variables should be set before the first run, then they \n# should be left alone. All subsequent runs expect the values \n# for cmr, ccid, data to be unchanged. The mins value has no \n# impact on subsequent runs.\n#\n\ntrackcycle = 25\ntrackpass = 1\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nccid = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ndata = \"resources/trackcycle\"\n\nThe variable data is pointed at a nearby folder resources/cyclepass by default. You should change data to a suitable download path on your file system. An unlucky sequence of git commands could disappear that folder and its downloads, if your not careful. Just change it.\nThe search retrieves granules ingested during the last n minutes. A file in your local data dir file that tracks updates to your data directory, if one file exists. The CMR Search falls back on the ten minute window if not.\n\n#timestamp = (datetime.utcnow()-timedelta(minutes=mins)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n#timestamp\n\nThis cell will replace the timestamp above with the one read from the .update file in the data directory, if it exists.\n\nif not isdir(data):\n print(f\"NOTE: Making new data directory at '{data}'. (This is the first run.)\")\n makedirs(data)\n#else:\n# try:\n# with open(f\"{data}/.update\", \"r\") as f:\n# timestamp = f.read()\n# except FileNotFoundError:\n# print(\"WARN: No .update in the data directory. (Is this the first run?)\")\n# else:\n# print(f\"NOTE: .update found in the data directory. (The last run was at {timestamp}.)\")\n\nNOTE: Making new data directory at 'resources/trackcycle'. (This is the first run.)\n\n\nThere are several ways to query for CMR updates that occured during a given timeframe. Read on in the CMR Search documentation:\n\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-new-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-revised-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-production-date (Granules)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-created-at (Granules)\n\nThe created_at parameter works for our purposes. It’s a granule search parameter that returns the records ingested since the input timestamp.\n\nparams = {\n 'scroll': \"true\",\n 'page_size': 2000,\n 'sort_key': \"-start_date\",\n 'collection_concept_id': ccid, \n #'created_at': timestamp,\n # Limit results to granules matching cycle, pass numbers:\n 'cycle': trackcycle,\n 'passes[0][pass]': trackpass,\n}\n\nparams\n\n{'scroll': 'true',\n 'page_size': 2000,\n 'sort_key': '-start_date',\n 'collection_concept_id': 'C1968980576-POCLOUD',\n 'cycle': 25,\n 'passes[0][pass]': 1}\n\n\nGet the query parameters as a string and then the complete search url:\n\nquery = urlencode(params)\nurl = f\"https://{cmr}/search/granules.umm_json?{query}\"\nprint(url)\n\nhttps://cmr.earthdata.nasa.gov/search/granules.umm_json?scroll=true&page_size=2000&sort_key=-start_date&collection_concept_id=C1968980576-POCLOUD&cycle=25&passes%5B0%5D%5Bpass%5D=1\n\n\nDownload the granule records that match our search parameters.\n\nwith urlopen(url) as f:\n results = loads(f.read().decode())\n\nprint(f\"{results['hits']} granules results for '{ccid}' cycle '{trackcycle}' and pass '{trackpass}'.\")\n\n1 granules results for 'C1968980576-POCLOUD' cycle '25' and pass '1'.\n\n\nNeatly print the first granule’s data for reference (assuming at least one was returned).\n\nif len(results['items'])>0:\n #print(dumps(results['items'][0], indent=2)) #print whole record\n print(dumps(results['items'][0]['umm'][\"RelatedUrls\"], indent=2)) #print associated URLs\n \n # Also, replace timestamp with one corresponding to time of the search.\n #timestamp = datetime.utcnow().strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n[\n {\n \"URL\": \"s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Type\": \"GET DATA VIA DIRECT ACCESS\",\n \"Description\": \"This link provides direct download access via S3 to the granule.\"\n },\n {\n \"URL\": \"s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Type\": \"GET DATA VIA DIRECT ACCESS\",\n \"Description\": \"This link provides direct download access via S3 to the granule.\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Type\": \"GET DATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.xfdumanifest.xml\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.xfdumanifest.xml\",\n \"Type\": \"EXTENDED METADATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Type\": \"GET DATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/s3credentials\",\n \"Description\": \"api endpoint to retrieve temporary credentials valid for same-region direct s3 access\",\n \"Type\": \"VIEW RELATED INFORMATION\"\n },\n {\n \"URL\": \"https://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02\",\n \"Type\": \"USE SERVICE API\",\n \"Subtype\": \"OPENDAP DATA\",\n \"Description\": \"OPeNDAP request URL\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.ssha.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.swh_ocean.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.sea_state_bias.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.atm_cor_sig0.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.sig0_ocean.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n }\n]\n\n\nThe link for http access denoted by \"Type\": \"GET DATA\" in the list of RelatedUrls.\nGrab the download URL, but do it in a way that’ll work for search results returning any number of granule records:\n\ndownloads = []\n\nfor l in results['items'][0]['umm'][\"RelatedUrls\"]:\n #if the link starts with the following, it is the download link we want\n if 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/' in l['URL']: \n #we want the .nc file\n if '.nc' in l['URL']:\n downloads.append(l['URL'])\ndownloads\n\n['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc']\n\n\nFinish by downloading the files to the data directory in a loop. Overwrite .update with a new timestamp on success.\n\nfor f in downloads:\n try:\n earthaccess.download([f[0]], f\"{data}/{basename(f)}\")\n except Exception as e:\n print(f\"[{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n else:\n print(f\"[{datetime.now()}] SUCCESS: {f}\")\n\n\n\n\nError while downloading the file h\nTraceback (most recent call last):\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/earthaccess/store.py\", line 483, in _download_file\n with session.get(\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 600, in get\n return self.request(\"GET\", url, **kwargs)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 573, in request\n prep = self.prepare_request(req)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 484, in prepare_request\n p.prepare(\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/models.py\", line 368, in prepare\n self.prepare_url(url, params)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/models.py\", line 439, in prepare_url\n raise MissingSchema(\nrequests.exceptions.MissingSchema: Invalid URL 'h': No scheme supplied. Perhaps you meant http://h?\n\n\n\n\n\n\n\n\n\n[2023-08-02 14:11:23.926892] SUCCESS: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\n\n\nIf there were updates to the local time series during this run and no exceptions were raised during the download loop, then overwrite the timestamp file that tracks updates to the data folder (resources/nrt/.update):\n\n#if len(results['items'])>0:\n# with open(f\"{data}/.update\", \"w\") as f:\n# f.write(timestamp)", + "objectID": "quarto_text/SMODE.html#additional-resources", + "href": "quarto_text/SMODE.html#additional-resources", + "title": "S-MODE", + "section": "Additional Resources", + "text": "Additional Resources\n\nData in Action Story\nA Closer Look at the Sub-Mesoscale Ocean Dynamics Experiment (S-MODE)\n\n\n2022 S-MODE Open Data Workshop\nhttps://espo.nasa.gov/s-mode/content/S-MODE_2022_Open_Data_Workshop - Recordings and Presentations\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) science team hosted a virtual Open Data Workshop on 1 December 2022 from 11:00am – 1:00pm ET to share about the S-MODE mission, to learn about its instrumentation, and find out how to access and use its data products.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access by Cycle/Pass" + "S-MODE" ] }, { - "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#scale-scientific-analysis-in-the-cloud-with-aws-lambda", - "href": "notebooks/aws_lambda_sst/docs/documentation.html#scale-scientific-analysis-in-the-cloud-with-aws-lambda", - "title": "AWS Lambda", - "section": "Scale Scientific Analysis in the Cloud with AWS Lambda", - "text": "Scale Scientific Analysis in the Cloud with AWS Lambda\n\nUser Guide for Deploying AWS Services in end-user Amazon accounts\n\n\nIntroduction\n\nAudience\nMotivation\nGlobal Mean Sea Surface Temperature\nCost Estimates\n\n\n\nArchitecture\n\nDiagram\nRepository Structure\n\n\n\nDeployment Instructions\n\nCreate an AWS Account\nDeploy AWS Services\n\nDeploy using Terraform (recommended)\nDeploy using AWS Console (manual setup)\n\nCreate the Lambda function\nTest the Lambda function in the AWS Console\nLaunch an EC2 instance\nClone this repository to the EC2 instance\nLog in to JPL AWS from the EC2 terminal\nRun the Notebook\nModify Lambda function and update Docker Container\n\n\n\nResources\n\nAWS Services\n\nLambda\nIAM\nS3\nSystems Manager Parameter Store\nEC2\nECR\n\n\n\nOther Services\n\nDocker\nTerraform\nJupyter Notebook", + "objectID": "quarto_text/Advanced.html", + "href": "quarto_text/Advanced.html", + "title": "Advanced Cloud", + "section": "", + "text": "AWS Lambda\n\nUser Guide to Scale Scientific Analysis in the Cloud - user guide for deploying AWS services in end-user Amazon accounts\nNotebook Demonstration - This tutorial demonstrates how to plot a timeseries of global mean sea surface temperature values using AWS Lambda to perform the global mean computation using the MUR 25km dataset.\n\n\n\nZarr\n\nTutorial for NetCDF4 Files - Teaches about the Zarr cloud optimized format\n\n\n\nDask and Coiled\n\nIntroduction to Dask Tutorial - covers the basics of using Dask for parallel computing with NASA Earth Data completely in the cloud\nDask Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using dask.delayed(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC.\nDask Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are performed on a single VM with a local Dask cluster.\nCoiled Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using coiled.function(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC. This replicates the analysis from the Dask Function Replication Example, but changes the method of parallel computation. Instead of using a local cluster on a single VM (Dask), many VM’s are combined into a distributed cluster (Coiled).\nCoiled Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are distributed over many VM’s using Coiled’s coiled.cluster().\n\n\n\nUsing Kerchunk, Zarr & Dask in the Cloud\n\nKerchunk JSON Generation - Generates a Kerchunk JSON file for a single PO.DAAC Collection, creates output for input in following tutorial.\nIntegrating Dask, Kerchunk, Zarr and Xarray - Efficiently visualize a whole collection of data in an interactive dashboard via cloud-optimized formats.\n\n\n\nHarmony-py\n\nSubsetting tutorial - a tutorial for a Python library that integrates with NASA’s Harmony Services.", "crumbs": [ - "Advanced Cloud", - "AWS Lambda" + "Advanced Cloud" ] }, { - "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#introduction-1", - "href": "notebooks/aws_lambda_sst/docs/documentation.html#introduction-1", - "title": "AWS Lambda", - "section": "Introduction", - "text": "Introduction\n\nAudience\nThis guide is intended for novice cloud users who do not have experience using Amazon Web Services (AWS).\nThis guide assumes intermediate knowledge of the following topics:\n\nRunning python scripts on a server\nFamiliarity with the command line\nJupyter notebooks\n\nThis guide assumes conceptual understanding of the following topics:\n\nOrganizing code into functions\nIdentity management (administering users/roles)\nVirtual machines\n\nUsers who have less experience with these topics may need support from their institution’s IT department to configure these services.\n\n\nMotivation\nPO.DAAC has recently migrated all data products to the NASA Earthdata Amazon Web Services (AWS) Cloud. This move has enabled improvements to PO.DAAC’s internal processes and infrastructure to better scale ingest, archive, publication, and distribution of mission data.\nMoving data to the cloud also opens up new cloud-computing workflows and capabilities for end-users to do scientific research and analysis. However, many end-users continue to download data to analyze locally. This tutorial demonstrates one pathway for using AWS cloud computing services to perform data analysis on large oceanography datasets.\n\n\nGlobal Mean Sea Surface Temperature\nMany scientific workflows begin with reducing the data in some way. Here we calculate the global mean sea surface temperature for the GHRSST Level 4 MUR 0.25deg Global Foundation Sea Surface Temperature Analysis (v4.2) dataset as an example of the type of analysis that can be done using AWS Lambda.\n\n\nCost Estimates\nAWS provides a calculator to estimate the cost of running using cloud services. Using the cost estimator, running this tutorial one time as-configured to create a one year time series may result in a charge of $0.72 USD.\nScaling up to create a 10-year time series one time would increase the cost to $7.22 USD.\nRunning a seasonal analysis where you create a time series of the past 3 months, and repeat every month, is estimated to cost $0.18 USD per month, or $2.16 USD per year.\nNote that costs will vary depending on the services you set up and how often you run them.\nThe AWS Free Tier includes access to a number of services for free/trial usage, but it works by charging you when you exceed the allotted free resources, rather than stopping services and access after the free credits have been used. This makes it relatively common to be charged for unexpected usage costs. Students especially are urged to work with an organizational AWS account where guardrails and costs are covered by the institution.\nAWS has guides on avoiding unexpected charges, and tracking your free tier usage.\nPO.DAAC is not liable for any costs incurred by users running this tutorial.", + "objectID": "quarto_text/TechGuides.html#cloning-this-github-repository", + "href": "quarto_text/TechGuides.html#cloning-this-github-repository", + "title": "Tech Guides", + "section": "Cloning this GitHub Repository", + "text": "Cloning this GitHub Repository\nCloning the podaac/tutorials repository allows you to have a copy of all the PO.DAAC Cookbook Notebook tutorials on your own machine to use. Follow these instructions to clone our repository from GitHub documentation, selecting your machine type and what method you would like to use to clone at the top (GitHub Desktop is a useful interface if you would rather not use the command line).\nThe link for this particular repository is: https://github.com/podaac/tutorials.git In the command line or Git Bash change the working directory to the location where you would want the cloned directory and then type:\n$ git clone https://github.com/podaac/tutorials", "crumbs": [ - "Advanced Cloud", - "AWS Lambda" + "Tech Guides" ] }, { - "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#architecture-1", - "href": "notebooks/aws_lambda_sst/docs/documentation.html#architecture-1", - "title": "AWS Lambda", - "section": "Architecture", - "text": "Architecture\n\nDiagram\nThe architecture diagram in Figure 1 demonstrates how all of the components used in this tutorial fit together.\n\n\n\nFigure - Architecture\n\n\nFigure 1. Deployment architecture for required AWS services and supporting infrastructure.\n\n\nRepository Structure\nThe code files for this tutorial are available on GitHub in the PO.DAAC Tutorials repository under /notebooks/aws_lambda_sst/\nFiles:\nsst.py : the code to be run by AWS Lambda. This gets packaged in a Docker container to be deployed to AWS.\nsst-global-mean-exploratory.ipynb : a notebook that explores the MUR25 dataset and runs through the global mean calculation offline. This notebook can be run locally outside of AWS to trial run the code deployed to Lambda in sst.py\npodaac-lambda-invoke-sst-global-mean.ipynb : the main notebook to invoke the Lambda code. Finds the files in Earthdata cloud, invokes Lambda on each, and plots the results as a timeseries. This notebook must be run from inside an AWS EC2 instance in the us-west-2 region.\nDockerfile : the instructions for Docker to build the container image with to deploy to AWS Lambda\nrequirements.txt : the required python packages to include in the Dockerfile. Note that these may be different than the packages required to run the notebooks\nterraform : terraform deploys AWS infrastructure. This folder contains the terraform configuration files:\n\nterraform.tfvars\nmain.tf\nsst-lambda.tf\nvariables.tf", + "objectID": "quarto_text/TechGuides.html#tech-how-tos-useful-introductions", + "href": "quarto_text/TechGuides.html#tech-how-tos-useful-introductions", + "title": "Tech Guides", + "section": "Tech How To’s & Useful Introductions", + "text": "Tech How To’s & Useful Introductions\n\nHow to Set Up an EC2 Instance - Earthdata Webinar outlining how to set up your own AWS cloud computer, an Elastic Computer Cloud (EC2)\nNASA earthaccess - a Python package to search, preview and access NASA datasets (on-prem or in the cloud) with a few lines of code\nGet started with GitHub - develop and share code in a collaborative environment\nIntroduction to Xarray - A useful Python Package while working with NASA Earthdata\nJupyter Lab, RStudio Desktop, or Visual Studio Code - useful coding workspaces\nHow to scale your NASA data workflows on the cloud, in parallel - a Coiled example - Guide for NASA Cloud computing at scale. How to run existing NASA data workflows on the cloud, in parallel, with minimal code changes using Coiled. (Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.)", "crumbs": [ - "Advanced Cloud", - "AWS Lambda" + "Tech Guides" ] }, { - "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#deployment-instructions-1", - "href": "notebooks/aws_lambda_sst/docs/documentation.html#deployment-instructions-1", - "title": "AWS Lambda", - "section": "Deployment Instructions", - "text": "Deployment Instructions\n\n1. Create an AWS Account\nIf you are a member of an institution that has an Enterprise AWS Instance, contact your institution to have an account set up. We strongly recommend students use an institutional account to avoid unexpected charges.\nAlternatively, you can also use this tutorial with an AWS Free Tier account. This article describes the steps to create a new AWS account for an individual user.\nSee Cost Estimates for more information on using the AWS Free Tier, tracking usage, and estimating charges.\n\n\n2. Deploy AWS Services\nAWS Services can be set up using Terraform, or via the AWS Console. Using Terraform is recommended as it automates the deployment and makes it easier to reproduce. The AWS Console instructions are useful to better understand what Terraform is configuring in your account.\nStart by installing the AWS Command Line Interface (CLI) on your local system. Note that AWS recommends setting up IAM credentials to run the AWS CLI (see prerequisites). Configure the AWS CLI to set your access keys and session token in the ~/.aws/credentials file, which will be used by Terraform to set up the AWS Services. If you choose to set up a profile, note the name you choose.\n\nA. Deploy using Terraform (recommended)\nTerraform is a program that can automate setting up and managing cloud services.\n\nInstall Terraform on your local system\nFork the https://github.com/podaac/tutorials repository, clone to your local machine. Navigate to /notebooks/aws_lambda_sst/terraform/ in a terminal.\nInitialize Terraform\nEdit terraform.tfvars with the names you want to give the AWS Elastic Container Registry (ecr_repo), the AWS Lambda role (lambda_role), the prefix to use for the Earthdata login parameters, and your user profile if you set one up when configuring the AWS CLI:\n ecr_repo = \"podaac-sst\"\n lambda_role = \"podaac-sst-lambda-role\"\n prefix = \"podaac\"\n profile = \"\"\nRun the following command to initialize the terraform configuration files\n terraform init\nRun terraform plan to check infrastructure state:\n terraform plan -out=tfplan\nIf there are no modifications to the infrastructure required and everything looks correct, apply the plan:\n terraform apply tfplan\n\n\n\nB. Deploy using AWS Console (manual setup)\nAn alternative to using the included Terraform configuration is to manually configure each service in the AWS Console:\n\nCreate an S3 bucket\nIf your Lambda function produces output, it will need to be saved somewhere. S3 is a convenient starting place for object storage. Give your bucket a unique name, and ensure it is in the us-west-2 region if you will be accessing NASA Earthdata in the cloud. In this example the output bucket is named “podaac-sst”.\nSet up Earthdata login credentials in the AWS Systems Manager Parameter Store.\nIf your Lambda function will read data directly from the Earthdata cloud, it is convenient to set up your EDL credentials as parameters. This avoids the complication and security implications of hardcoding EDL credentials in the Lambda function or setting up a .netrc file in a Docker container. One consideration is that the Lambda function will access Earthdata via the same set of credentials every time, regardless of the end user.\nAn alternative pattern to consider in cases where the Lambda function is going to be run frequently, is to store the AWS session tokens and access keys in the AWS Parameter store instead of the EDL username and password. The Lambda code would need to be changed to read those parameters instead, and a script could be set up to periodically refresh the tokens before they expire.\nSet up the Elastic Container Registry (ECR)\nIf using a Docker container to deploy your Lambda, the Docker image can be deployed to the AWS ECR service so that the AWS Lambda service can reach it. Select a repository name (in this example we use “podaac-sst”). We recommend keeping tag immutability disabled so if you update the Docker image in the future it will overwrite the current version.\nCreate an IAM role for your Lambda function to run as\nSet various policies depending on the other AWS services the Lambda needs access to:\n\nIf you plan to read or write to an S3 bucket, the role needs read/write permission to S3. In this example we call the role podaac-sst-lambda-role, but it could be named anything.\nIf you store Earthdata login (EDL) credentials for the Lambda function in AWS Parameter Store, you need to set an ‘AllowGetPutParameter’ policy for the role.\nWe suggest also setting a Cloudwatch policy for the role to create logs.\nMore information on IAM policies, the JSON syntax to use and formatting conventions can be found in the AWS IAM documentation.\n\n\n\n\n\nFigure - Access Policy\n\n\nFigure 2. An example access policy that allows read (get) and write (put) access to the podaac-sst S3 bucket.\n\n\n\n3. Create the Lambda function\nThe Lambda function used in this tutorial contains large Python packages, so it is deployed using a Docker container. If you use different code that requires smaller package dependencies, you could package it as a zip file instead, or copy it directly into the Lambda function in the AWS Console. See this article for more information.\nThis tutorial contains a Dockerfile, which is a text file containing the instructions to build a Docker Image. This Dockerfile will create a Docker Image based on the AWS Lambda Python base image that contains the packages listed in the requirements.txt file, and will run the lambda_handler function from the sst.py code file.\n\nInstall Docker on your local system and make sure it is running.\nIn your terminal, navigate to /notebooks/aws_lambda_sst/\nBuild the container image by running the following command:\n docker build -t podaac-sst .\nLogin to the AWS ECR service you set up earlier from the command line\n docker login -u AWS https://<accountID>.dkr.ecr.us-west-2.amazonaws.com -p $(aws ecr get-login-password --region us-west-2)\nPush the Docker container to the ECR repository\n docker push <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst\nCreate the Lambda function by running the following command:\n aws lambda create-function \\\n --function-name podaac-sst \\\n --package-type Image \\\n --code ImageUri=<accountID>.dkr.ecr.us-east-1.amazonaws.com/podaac-sst:latest \\\n --role arn:aws:iam::<accountID>:role/podaac-sst-lambda-role\n\n\n\n4. Test the Lambda function in the AWS Console\nOpen the AWS Console in your web browser, and navigate to the Lambda service. You should see your function listed. Click on the name of your function, which should open a page similar to the one shown in Figure 3.\n\n\n\nFigure - Lambda console\n\n\nFigure 3. The podaac-sst Lambda function in the AWS Console.\nUnder Function Overview, click on the Test tab. Create a new event, and input the event JSON below. Change the values if you selected a different bucket name during setup.\n {\n \"input_granule_s3path\": \"s3://podaac-ops-cumulus-protected/MUR25-JPL-L4-GLOB-v04.2/20221201090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\",\n \"output_granule_s3bucket\": \"podaac-sst\",\n \"prefix\": \"podaac\"\n }\nClick the orange Test button to test the Lambda function. After a few seconds, you should see a message stating Executing function: succeeded (Figure 4). You can expand this section to see more details of the successful test. If the test fails, expand the message to troubleshoot.\n\n\n\nFigure - Lambda test\n\n\nFigure 4. A successful test of the podaac-sst Lambda function in the AWS Console.\n\n\n5. Launch an EC2 instance\nThere are instructions on setting up and connecting to an EC2 instance in this tutorial if you have not done this before. Connect to the EC2 instance via SSH, and start Jupyter Lab.\n\n\n6. Clone this repository to the EC2 instance\nCreate a fork of the https://github.com/podaac/tutorials repository, and clone it to your EC2 instance. Open the /notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.ipynb notebook.\n\n\n7. Log in to AWS from the EC2 terminal\nLog in to your AWS account from your EC2 terminal. See this article on configuring your credentials in the AWS CLI if you have not done so. This will set your access keys and session token in the ~/.aws/credentials file in your EC2 instance, which will be used to set up a boto3 session later in the workflow to read the resulting data from the S3 output bucket. You may need to refresh these credentials if it’s been more than 4 hours since you last set them.\n\n\n8. Run the Notebook\nOpen the /notebooks/aws_lambda_sst/podaac-lambda-example-sst-global-mean.ipynb notebook in Jupyter Lab in your EC-2 instance. You may need to install the Python packages listed in the import statements in the first cell. We recommend using conda-forge to install these packages to a new conda environment to avoid version conflicts.\nStep through the cells to query for granules from the MUR SST collection and invoke the Lambda function. You may need to check the number of output files in the S3 results bucket in the AWS Console to determine when Step 2 completes before moving to Step 3. Depending on the number of granules you are searching, this may take a few seconds to a few minutes.\nContinue through Step 3 of the notebook to plot the data.\nCongratulations! You configured, deployed, and ran an AWS Lambda function to generate a timeseries of global mean sea surface temperatures over time.\n\n\n9. Modify Lambda function and update Docker Container (Optional)\nTo make modifications to the Lambda function after it has been deployed:\n\nInstall Docker on your local system, and make sure it is running.\nModify the code in sst.py, and test your changes.\nBuild the Docker container:\ndocker build -t <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst .\nLog into JPL AWS ECR:\ndocker login -u AWS https://<accountID>.dkr.ecr.us-west-2.amazonaws.com -p $(aws ecr get-login-password –region us-west-2)\nPush most recent build (and modifications) to AWS ECR:\ndocker push <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst\nNavigate to the podaac-sst lambda function in the web console.\nClick on the “Image” tab.\nClick the “Deploy new image” button.\nMake sure the correct container image is selected (it usually is by default) and click the “Save” button.\nWait for the image to be deployed to the lambda function.\nTest as in Step 4.", + "objectID": "quarto_text/TechGuides.html#a-growing-list-of-resources", + "href": "quarto_text/TechGuides.html#a-growing-list-of-resources", + "title": "Tech Guides", + "section": "A Growing List of Resources", + "text": "A Growing List of Resources\n\nNASA Earthdata Cloud Cookbook - Tutorials & data recipes applicable to all NASA datasets\nNASA Earthdata: How to Cloud\nNASA Earthdata Cloud Primer - AWS cloud primer: helpful tutorials for how to set up your own EC2 cloud instance in AWS, attach storage, move files back and forth, and more.\nSetting up Jupyter Notebooks in a user EC2 instance in AWS - helpful blog post for setting up jupyter notebooks in an EC2 instance in AWS. (Builds on the Cloud Primer tutorials, which are missing that next step)\nRunning the NASA Cloud Workshop notebooks with mybinder.org - by Eli Holmes, 2021 Cloud Hackathon Participant who then set up working in Binder\nCloud Optimized Geospatial Formats Guide - Methods for Generating and Testing Cloud-Optimized Geospatial Formats", "crumbs": [ - "Advanced Cloud", - "AWS Lambda" + "Tech Guides" ] }, { - "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#additional-resources", - "href": "notebooks/aws_lambda_sst/docs/documentation.html#additional-resources", - "title": "AWS Lambda", + "objectID": "quarto_text/HowTo.html#how-do-i", + "href": "quarto_text/HowTo.html#how-do-i", + "title": "How To", + "section": "How do I", + "text": "How do I\n\nFind Data using Earthdata Search or using Code\nAuthenticate Programmatically\nAccess Data in the Cloud, locally or via OPeNDAP\nRead Data\nDownload/Subscribe to Data", + "crumbs": [ + "How To" + ] + }, + { + "objectID": "quarto_text/HowTo.html#additional-resources", + "href": "quarto_text/HowTo.html#additional-resources", + "title": "How To", "section": "Additional Resources", - "text": "Additional Resources\n\nAWS Services\n\nLambda : Serverless computing service\n\nLambda Getting Started Guide\nLambda Developer Guide\nLambda API Reference\n\n\n\nIAM : Identity and Access Management\n\nIAM User Guide\nIAM API Reference\nSetting IAM policies and permissions\n\n\n\nS3 : Simple Storage Service\n\nS3 Getting Started Guide\nS3 User Guide\n\n\n\nSystems Manager Parameter Store\n\nParameter Store User Guide\n\n\n\nEC2 : Elastic Compute Cloud\n\nEC2 User Guide for Linux\nEC2 API Reference\nEC2 Command Line Reference\n\n\n\nECR : Elastic Container Registry\n\nECR User Guide\nECR API Reference\n\n\n\n\nOther Services\n\nDocker\n\nGetting Started Guide\n\n\n\nTerraform\n\nIntro to Terraform\nTerraform Tutorial Library\n\n\n\nJupyter Notebook\n\nGet started with Project Jupyter\nJupyter Lab Documentation", + "text": "Additional Resources\nFor more “how to” guides applicable to all NASA datasets, including PO.DAAC, visit the NASA Earthdata Cloud Cookbook.", "crumbs": [ - "Advanced Cloud", - "AWS Lambda" + "How To" ] }, { - "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#prerequisite-steps-set-up-aws-infrastructure", - "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#prerequisite-steps-set-up-aws-infrastructure", - "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", - "section": "Prerequisite Steps: Set up AWS infrastructure", - "text": "Prerequisite Steps: Set up AWS infrastructure\nThis tutorial takes advantage of numerous AWS Services including Lambda, Parameter Store, Elastic Compute Cloud (EC2), Elastic Container Registry (ECR), and Simple Storage Service (S3).\nAfter setting up and deploying all of the services as described in the documentation, this notebook must be run in an EC2 instance to invoke the functions and plot the results.\n\nConnect to EC2 instance to run this notebook\nThis notebook cannot be run on a local computer, as it heavily depends on direct in-cloud access. To run this notebook in AWS, connect to an EC2 instance running in the us-west-2 region, following the instructions in this tutorial. Once you have connected to the EC2 instance, you can clone this repository into that environment, install the required packages, and run this notebook.", + "objectID": "quarto_text/cheatsheet.html#contents", + "href": "quarto_text/cheatsheet.html#contents", + "title": "Cheatsheets & Guides", + "section": "Contents:", + "text": "Contents:\nHere are some cheatsheets and guides helping visualize what working with NASA Earthdata Cloud data looks like, and how to get started!\n\nNASA Earthdata Cloud Overview\nCloud Access Pathways\nGetting Started Roadmaps: Cloud & Local Workflows\nTools & Services Roadmap\nCloud Terminology 101\nWorkflow Cheatsheet\nCheatsheet Terminology\n\n\nWhat is the NASA Earthdata Cloud?\nNASA Earthdata Cloud is the NASA archive of Earth observations and is hosted in Amazon Web Services (AWS) cloud with DAAC tools and services built for use “next to the data.” The NASA DAACs (data centers) are currently transitioning to this cloud-based environment. All PO.DAAC data will be housed in the cloud, and can be accessed through AWS. The cloud offers a scalable and effective way to address storage, network, and data movement concerns while offering a tremendous amount of flexibility to the user. Particularly if working with large data volumes, data access and processing would be more efficient if workflows are taking place in the cloud, avoiding having to download large data volumes. Data download will continue to be freely available to users, from the Earthdata Cloud archive.\n\n\nPublished Google Slide\n\n\nCloud Access Pathways\nThree pathway examples, to interact and access data (and services) from and within the NASA Earthdata Cloud, are illustrated in the diagram. Green arrows and icons indicate working locally, after downloading data to your local machine, servers, or compute/storage space. Orange arrows and icons highlight a workflow within the cloud, setting up your own AWS EC2 cloud instance, or virtual machine, in the cloud next to the data. Blue arrows and icons also indicate a within the cloud workflow, through shareable cloud environments such as Binder or JupyterHub set up in an AWS cloud region. Note that each of these may have a range of cost models. EOSDIS data are being stored in the us-west-2 region of AWS cloud; we recommend setting up your cloud computing environment in the same region as the data for free and easy in-cloud access.\n\n\nPublished Google Slide\nA note on costing: What is free and what do I have to budget for, now that data is archived in the cloud?\n\nDownloading data from the Earthdata Cloud archive in AWS, to your local computer environment or local storage (e.g. servers) is and will continue to be free for the user.\nAccessing the data directly in the cloud (from us-west-2 S3 region) is free. Users will need a NASA Earthdata Login account and AWS credentials to access, but there is no cost associated with these authentication steps, which are in place for security reasons.\nAccessing data in the cloud via EOSDIS or DAAC cloud-based tools and services such as the CMR API, Harmony API, OPenDAP API (from us-west-2 S3 region) is free to the user. Having the tools and services “next to the data” in the cloud enables DAACs to support data reduction and transformation, more efficiently, on behalf of the user, so users only access the data they need.\nCloud computing environments (i.e. virtual machines in the cloud) for working with data in the cloud (beyond direct or via services provided access) such as data analysis or running models with the data, is user responsibility, and should be considered in budgeting. I.e. User would need to set up a cloud compute environment (such as an EC2 instance or JupyterLab) and are responsible for any storage and computing costs.\n\nThis means that even though direct data access in the cloud is free to the user, they would first need to have a cloud computing environment/machine to execute the data access step from, and then continue their analysis.\nDepending on whether that cloud environment is provided by the user themselves, user’s institution, community hubs like Pangeo or NASA Openscapes JupyterLab sandbox, this element of the workflow may require user accountability, budgeting and user financial maintenance.\n\n\n\n\nGetting Started Roadmap\n\nCloud Workflow\nThe following is a conceptual roadmap for users getting started with NASA Earth Observations cloud-archived data using an in-cloud workflow (i.e. bringing user code into the cloud, avoiding data download and performing data workflows “next to the data”).\n\n\nPublished Google Slide\n\n\nLocal Workflow\nThe following is a conceptual roadmap for users getting started with NASA Earth Observations cloud-archived data using a local machine (e.g. laptop) workflow, as data storage and computational work.\n\n\n[Published Google Slide]((https://docs.google.com/presentation/d/e/2PACX-1vSpmQBM-BfRMdtut9qT2oc4uxxTDFpulXMCN6h_9TviDlujn-MZJ4gwX8ilHK1qg1hgvwrt_JXwlaVF/pub?start=false&loop=false&delayms=3000){target=“_blank”}\n\n\n\nTools & Services Roadmap\nBelow is a practical guide for learning about and selecting helpful tools or services for a given use case, focusing on how to find and access NASA Earthdata Cloud-archived data from local compute environment (e.g. laptop) or from a cloud computing workspace, with accompanying example tutorials. Once you follow your desired pathway, click on the respective blue notebook icon to get to the example tutorial. Note: these pathways are not exhaustive, there are many ways to accomplish these common steps, but these are some of our recommendations.\n\n\nPublished Google Slide\n\n\nCloud Terminology 101\nCloud Terminology 101 for those new to commonly used cloud computing terms and phrases.\n\n\nPublished Google Slide\n\n\nWorkflow Cheatsheet\nThe following is a practical reference guide with links to tutorials and informational websites for users who are starting to take the conceptual pieces and explore and implement in their own workflows.\n\n\nPublished Google Slide\n\n\nWorkflow Cheatsheet Terminology\nTerminology cheatsheet to explain terms commonly used in cloud computing and those located on the NASA Earthdata Cloud Cheatsheet. See also NASA Earthdata Glossary.\n\n\nPublished Google Slide", "crumbs": [ - "Advanced Cloud", - "AWS Lambda", - "Notebook" + "Cheatsheets & Guides" ] }, { - "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-1-log-in-to-earthdata", - "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-1-log-in-to-earthdata", - "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", - "section": "Step 1: Log in to Earthdata", - "text": "Step 1: Log in to Earthdata\nWe use the earthaccess Python library to handle Earthdata authentication for the initial query to find the granules of interest.\n\nimport earthaccess\nimport json\nimport boto3\nimport s3fs\nimport xarray as xr\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\n\n\nauth = earthaccess.login()\n\nEARTHDATA_USERNAME and EARTHDATA_PASSWORD are not set in the current environment, try setting them or use a different strategy (netrc, interactive)\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 06/16/2023\nUsing .netrc file for EDL\n\n\n\ngranules = earthaccess.search_data(\n short_name='MUR25-JPL-L4-GLOB-v04.2',\n cloud_hosted=True,\n temporal=(\"2022-01-01\", \"2023-01-01\")\n)\n\nGranules found: 365\n\n\n\ngranule_paths = [g.data_links(access='direct')[0] for g in granules]\n\n\nfor path in granule_paths:\n print(path)\n break\n\ns3://podaac-ops-cumulus-protected/MUR25-JPL-L4-GLOB-v04.2/20220101090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc", + "objectID": "quarto_text/GIS.html#gis-storymaps-of-select-datasets", + "href": "quarto_text/GIS.html#gis-storymaps-of-select-datasets", + "title": "GIS", + "section": "GIS StoryMaps of Select Datasets:", + "text": "GIS StoryMaps of Select Datasets:\n\nPO.DAAC GIS StoryMap Collection Page\n\nExploring Water Surface Extent with Satellite Data\nSWOT: Through a GIS Lens\nUtilizing GRACE data over the Colorado River Basin\nThe Oceans & Melting Glaciers: OMG & GRACE", "crumbs": [ - "Advanced Cloud", - "AWS Lambda", - "Notebook" + "Tutorials", + "GIS" ] }, { - "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-2-invoke-the-lambda-function", - "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-2-invoke-the-lambda-function", - "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", - "section": "Step 2: Invoke the Lambda function", - "text": "Step 2: Invoke the Lambda function\nSet up a boto3 session to connect to your AWS instance and invoke the Lambda function\n\nsession = boto3.Session(profile_name='saml-pub')\n\nlambda_client = session.client('lambda', region_name='us-west-2')\n\ns3_results_bucket = \"podaac-sst\"\n\nfor granule in granule_paths:\n lambda_payload = {\"input_granule_s3path\": granule, \"output_granule_s3bucket\": s3_results_bucket, \"prefix\":\"podaac\"}\n\n lambda_client.invoke(\n FunctionName=\"podaac-sst\",\n InvocationType=\"Event\",\n Payload=json.dumps(lambda_payload)\n )", + "objectID": "quarto_text/GIS.html#gis-walkthroughs", + "href": "quarto_text/GIS.html#gis-walkthroughs", + "title": "GIS", + "section": "GIS Walkthroughs", + "text": "GIS Walkthroughs\n\nMapping Sea Surface Temperature Anomalies in QGIS", "crumbs": [ - "Advanced Cloud", - "AWS Lambda", - "Notebook" + "Tutorials", + "GIS" ] }, { - "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-3-plot-results-as-timeseries", - "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-3-plot-results-as-timeseries", - "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", - "section": "Step 3: Plot results as timeseries", - "text": "Step 3: Plot results as timeseries\nOpen the resulting global mean files in xarray:\n\n# set up the connection to the S3 bucket holding the results\ns3_results = s3fs.S3FileSystem(\n anon=False,\n profile='saml-pub'\n)\n\ns3_files = s3_results.glob(\"s3://\" + s3_results_bucket + \"/MUR25/*\")\n\n\n# iterate through s3 files to create a fileset\nfileset = [s3_results.open(file) for file in s3_files]\n\n\n\n# open all files as an xarray dataset\ndata = xr.open_mfdataset(fileset, combine='by_coords', engine='scipy')\n\n\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 365)\nCoordinates:\n * time (time) datetime64[ns] 2022-01-01T09:00:00 ... 2023-01-01T09...\nData variables:\n analysed_sst (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>xarray.DatasetDimensions:time: 365Coordinates: (1)time(time)datetime64[ns]2022-01-01T09:00:00 ... 2023-01-...array(['2022-01-01T09:00:00.000000000', '2022-01-02T09:00:00.000000000',\n '2022-01-03T09:00:00.000000000', ..., '2022-12-30T09:00:00.000000000',\n '2022-12-31T09:00:00.000000000', '2023-01-01T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (1)analysed_sst(time)float64dask.array<chunksize=(1,), meta=np.ndarray>description :Area-weighted global mean sea surface temperature calculated using AWS Lambdaunits :celciusdate_created :Jun-06-2023\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.85 kiB\n8 B\n\n\nShape\n(365,)\n(1,)\n\n\nDask graph\n365 chunks in 731 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 365 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(DatetimeIndex(['2022-01-01 09:00:00', '2022-01-02 09:00:00',\n '2022-01-03 09:00:00', '2022-01-04 09:00:00',\n '2022-01-05 09:00:00', '2022-01-06 09:00:00',\n '2022-01-07 09:00:00', '2022-01-08 09:00:00',\n '2022-01-09 09:00:00', '2022-01-10 09:00:00',\n ...\n '2022-12-23 09:00:00', '2022-12-24 09:00:00',\n '2022-12-25 09:00:00', '2022-12-26 09:00:00',\n '2022-12-27 09:00:00', '2022-12-28 09:00:00',\n '2022-12-29 09:00:00', '2022-12-30 09:00:00',\n '2022-12-31 09:00:00', '2023-01-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=365, freq=None))Attributes: (0)\n\n\nPlot the data using matplotlib:\n\nmpl.rcParams.update({'font.size': 22})\n\n# set up the figure\nfig = plt.Figure(figsize=(20,5))\n\n# plot the data\nplt.plot(data.time, data.analysed_sst, linewidth='3')\nplt.title('Global Mean Sea Surface Temperature' + '\\n' + '2022, MUR25')\n\nplt.ylabel('degrees C')\nplt.xlabel('Date')\n\nText(0.5, 0, 'Date')", + "objectID": "quarto_text/GIS.html#gis-jupyter-notebook-tutorials", + "href": "quarto_text/GIS.html#gis-jupyter-notebook-tutorials", + "title": "GIS", + "section": "GIS Jupyter Notebook Tutorials", + "text": "GIS Jupyter Notebook Tutorials\n\nGIS SWOT shapefile exploration\nNetCDF to Geotiff Conversion: SWOT Data Example", "crumbs": [ - "Advanced Cloud", - "AWS Lambda", - "Notebook" + "Tutorials", + "GIS" ] }, { - "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html", - "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html", - "title": "Harmony EOSS L2SS API Tutorial", + "objectID": "notebooks/l2-regridding/reprojection notebook.html", + "href": "notebooks/l2-regridding/reprojection notebook.html", + "title": "Harmony API Introduction", "section": "", - "text": "This notebook will demonstrate how to subset Level 2 data using a sea surface temperature product from the following collection: MODIS_A-JPL-L2P-v2019.0, GHRSST Level 2P Global Sea Surface Skin Temperature from the Moderate Resolution Imaging Spectroradiometer (MODIS) on the NASA Aqua satellite (GDS2)." + "text": "This notebook provides an overview of the capabilities offered through the Harmony API and SWOT L2 Reproject tool. While written for SWOT L2 data, it works with most any level 2 data for projecting to a normal grid. In this tutorial we will use MODIS L2 data to show the native file projected to equal-area-cylindracal projection using both Nearest Neighbor and Bi-linear interpolation.\nStanding on the shoulders of previous authors: Amy Steiker, Patrick Quinn" }, { - "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#before-you-start", - "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#before-you-start", - "title": "Harmony EOSS L2SS API Tutorial", + "objectID": "notebooks/l2-regridding/reprojection notebook.html#before-you-start", + "href": "notebooks/l2-regridding/reprojection notebook.html#before-you-start", + "title": "Harmony API Introduction", "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nfrom urllib import request\nfrom http.cookiejar import CookieJar\nimport tempfile\nimport getpass\nimport netrc\nimport json\nimport requests\nimport sys\nimport shutil\nimport xarray as xr\n\n\nFind a granule for subsetting\nBelow we call out a specific granule (G2524986524-POCLOUD) on which we will use the podaac L2 subsetter. Finding this information would complicate the tutorial- but po.daac has a tutorial available for using the CMR API to find collections and granules of interest. Please see this tutorial for that information.\n\ncollection = 'C1940473819-POCLOUD'\nvariable = 'sea_surface_temperature'\nvenue = 'prod'\n\n\n# Defaults\ncmr_root = 'cmr.earthdata.nasa.gov'\nharmony_root = 'https://harmony.earthdata.nasa.gov'\nedl_root = 'urs.earthdata.nasa.gov'" + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." }, { - "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#subset-of-a-po.daac-granule", - "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#subset-of-a-po.daac-granule", - "title": "Harmony EOSS L2SS API Tutorial", - "section": "Subset of a PO.DAAC Granule", - "text": "Subset of a PO.DAAC Granule\nWe can now build onto the root URL in order to actually perform a transformation. The first transformation is a subset of a selected granule. At this time, this requires discovering the granule id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nAbove we show how to find a granule id for processing.\nNotes: The L2 subsetter current streams the data back to the user, and does not stage data in S3 for redirects. This is functionality we will be adding over time. It doesn’t work with URS backed files, which is coming in the next few weeks it only works on the show dataset, but\n\ncmr_url = \"https://\"+cmr_root+\"/search/granules.umm_json?collection_concept_id=\"+collection+\"&sort_key=-start_date&bounding_box=-90,-45.75,90,-45\"\n\nresponse = requests.get(cmr_url)\n\ngid=response.json()['items'][0]['meta']['concept-id']\nprint(response.json()['items'][0])\nprint(gid)\n\n{'meta': {'concept-type': 'granule', 'concept-id': 'G2525170373-POCLOUD', 'revision-id': 3, 'native-id': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'provider-id': 'POCLOUD', 'format': 'application/vnd.nasa.cmr.umm+json', 'revision-date': '2022-10-25T21:12:59.142Z'}, 'umm': {'TemporalExtent': {'RangeDateTime': {'EndingDateTime': '2022-10-25T18:54:58.000Z', 'BeginningDateTime': '2022-10-25T18:50:01.000Z'}}, 'MetadataSpecification': {'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.4', 'Name': 'UMM-G', 'Version': '1.6.4'}, 'GranuleUR': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'ProviderDates': [{'Type': 'Insert', 'Date': '2022-10-25T21:10:17.165Z'}, {'Type': 'Update', 'Date': '2022-10-25T21:10:17.165Z'}], 'SpatialExtent': {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -85.928, 'NorthBoundingCoordinate': -26.101, 'EastBoundingCoordinate': -54.117, 'SouthBoundingCoordinate': -47.37}], 'GPolygons': [{'Boundary': {'Points': [{'Longitude': -54.11689, 'Latitude': -43.06013}, {'Longitude': -58.42233, 'Latitude': -35.30318}, {'Longitude': -62.29779, 'Latitude': -26.1022}, {'Longitude': -73.93747, 'Latitude': -28.35286}, {'Longitude': -85.92834, 'Latitude': -29.50335}, {'Longitude': -84.04758, 'Latitude': -47.36956}, {'Longitude': -68.62455, 'Latitude': -46.17143}, {'Longitude': -54.11689, 'Latitude': -43.06013}]}}]}}}, 'DataGranule': {'ArchiveAndDistributionInformation': [{'SizeUnit': 'MB', 'Size': 20.64744758605957, 'Checksum': {'Value': 'e2d56b12c5fcbe7f10af1653834d76f6', 'Algorithm': 'MD5'}, 'SizeInBytes': 21650418, 'Name': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'}, {'SizeUnit': 'MB', 'Size': 9.34600830078125e-05, 'Checksum': {'Value': 'a3c500f11b4d0af678f9e8de11397c97', 'Algorithm': 'MD5'}, 'SizeInBytes': 98, 'Name': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'}], 'DayNightFlag': 'Unspecified', 'ProductionDateTime': '2022-10-25T21:06:25.000Z'}, 'CollectionReference': {'Version': '2019.0', 'ShortName': 'MODIS_A-JPL-L2P-v2019.0'}, 'RelatedUrls': [{'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Description': 'Download 20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Type': 'GET DATA'}, {'URL': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Description': 'This link provides direct download access via S3 to the granule', 'Type': 'GET DATA VIA DIRECT ACCESS'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Description': 'Download 20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Type': 'EXTENDED METADATA'}, {'URL': 's3://podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Description': 'This link provides direct download access via S3 to the granule', 'Type': 'EXTENDED METADATA'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/s3credentials', 'Description': 'api endpoint to retrieve temporary credentials valid for same-region direct s3 access', 'Type': 'VIEW RELATED INFORMATION'}, {'URL': 'https://opendap.earthdata.nasa.gov/collections/C1940473819-POCLOUD/granules/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'Type': 'USE SERVICE API', 'Subtype': 'OPENDAP DATA', 'Description': 'OPeNDAP request URL'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}]}}\nG2525170373-POCLOUD\n\n\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection_id = Collection(collection) \n\nrequest = Request(\n collection=collection_id,\n spatial=BBox(-90,-45.75,90,45), # lat: (-45.75:45), lon: (-90:90)\n granule_id=gid \n)\n\nrequest.is_valid()\n\nTrue\n\n\n\n# sumbit request and monitor job\njob_id = harmony_client.submit(request)\nprint('\\n Waiting for the job to finish. . .\\n')\nresponse = harmony_client.result_json(job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n\n Waiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n['C:\\\\Users\\\\nickles\\\\AppData\\\\Local\\\\Temp\\\\tmp2hna47qz\\\\20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4']\n\n\n\nds = xr.open_dataset(file_names[0])\nds\n\nlat_var = None\nlon_var = None\n\n# Determine the lat/lon coordinate names\nfor coord_name, coord in ds.coords.items():\n if 'units' not in coord.attrs:\n continue\n if coord.attrs['units'] == 'degrees_north':\n lat_var = coord_name\n if coord.attrs['units'] == 'degrees_east':\n lon_var = coord_name\n \n# If the lat/lon coordinates could not be determined, use l2ss-py get_coord_variable_names\nif not lat_var or not lon_var:\n from podaac.subsetter import subset\n lat_var_names, lon_var_names = subset.get_coord_variable_names(ds)\n lat_var = lat_var_names[0]\n lon_var = lon_var_names[0]\n\nprint(f'lat_var={lat_var}')\nprint(f'lon_var={lon_var}')\n\nlat_var=lat\nlon_var=lon\n\n\n\nif ds[variable].size == 0:\n print(\"No data in subsetted region. Exiting\")\n sys.exit(0)\n\n\nimport matplotlib.pyplot as plt\nimport math\n\nfig, axes = plt.subplots(ncols=3, nrows=math.ceil((len(ds.data_vars)/3)))\nfig.set_size_inches((15,15))\n\nfor count, xvar in enumerate(ds.data_vars):\n if ds[xvar].dtype == \"timedelta64[ns]\":\n continue\n #ds[xvar].astype('timedelta64[D]').plot(ax=axes[int(count/3)][count%3])\n ds[xvar].plot(ax=axes[int(count/3)][count%3])" + "objectID": "notebooks/l2-regridding/reprojection notebook.html#import-packages", + "href": "notebooks/l2-regridding/reprojection notebook.html#import-packages", + "title": "Harmony API Introduction", + "section": "Import packages", + "text": "Import packages\n\nfrom urllib import request, parse\nfrom http.cookiejar import CookieJar\nimport getpass\nimport netrc\nimport os\nimport requests\nimport json\nimport pprint\nfrom osgeo import gdal\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport rasterio\nfrom rasterio.plot import show\nimport numpy as np\nimport os\nimport time\nfrom netCDF4 import Dataset\n%matplotlib inline" }, { - "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#verify-the-subsetting-worked", - "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#verify-the-subsetting-worked", - "title": "Harmony EOSS L2SS API Tutorial", - "section": "Verify the subsetting worked", - "text": "Verify the subsetting worked\nBounds used were:\n‘lat’: ‘(-45.75:45)’, ‘lon’: ‘(-90:90)’\n\nvar_ds = ds[variable]\nmsk = xr.ufuncs.logical_not(xr.ufuncs.isnan(var_ds.data.squeeze()))\n\nllat = ds[lat_var].where(msk)\nllon = ds[lon_var].where(msk)\n\nlat_max = llat.max()\nlat_min = llat.min()\n\nlon_min = llon.min()\nlon_max = llon.max()\n\nlon_min = (lon_min + 180) % 360 - 180\nlon_max = (lon_max + 180) % 360 - 180\n\nprint(lon_min)\nprint(lon_max)\nprint(lat_min)\nprint(lat_max)\n\nif lat_max <= 45 and lat_min >= -45.75:\n print(\"Successful Latitude subsetting\")\nelif xr.ufuncs.isnan(lat_max) and xr.ufuncs.isnan(lat_min):\n print(\"Partial Lat Success - no Data\")\nelse:\n assert False\n\n\nif lon_max <= 90 and lon_min >= -90:\n print(\"Successful Longitude subsetting\")\nelif xr.ufuncs.isnan(lon_max) and xr.ufuncs.isnan(lon_min):\n print(\"Partial Lon Success - no Data\")\nelse:\n assert False\n \n\n<xarray.DataArray 'lon' ()>\narray(-85.92834473)\n<xarray.DataArray 'lon' ()>\narray(-54.11688995)\n<xarray.DataArray 'lat' ()>\narray(-45.74999237)\n<xarray.DataArray 'lat' ()>\narray(-27.91536331)\nSuccessful Latitude subsetting\nSuccessful Longitude subsetting" + "objectID": "notebooks/l2-regridding/reprojection notebook.html#identify-a-data-collection-of-interest", + "href": "notebooks/l2-regridding/reprojection notebook.html#identify-a-data-collection-of-interest", + "title": "Harmony API Introduction", + "section": "Identify a data collection of interest", + "text": "Identify a data collection of interest\nA CMR collection ID is needed to request services through Harmony. The collection ID can be determined using the CMR API. We will query the corresponding ID of a known collection short name, MODIS_A-JPL-L2P-v2019.0.\n\nparams = {\n 'short_name': 'MODIS_A-JPL-L2P-v2019.0',\n 'provider_id': 'POCLOUD'\n} # parameter dictionary with known CMR short_name\n\ncmr_collections_url = 'https://cmr.earthdata.nasa.gov/search/collections.json'\ncmr_response = requests.get(cmr_collections_url, params=params)\ncmr_results = json.loads(cmr_response.content) # Get json response from CMR collection metadata\n\ncollectionlist = [el['id'] for el in cmr_results['feed']['entry']]\nharmony_collection_id = collectionlist[0]\nprint(harmony_collection_id)\n\nC1940473819-POCLOUD\n\n\nWe can also view the MODIS_A-JPL-L2P-v2019.0 collection metadata to glean more information about the collection:\n\npprint.pprint(cmr_results)\n\n{'feed': {'entry': [{'archive_center': 'NASA/JPL/PODAAC',\n 'associations': {'services': ['S1962070864-POCLOUD',\n 'S2004184019-POCLOUD',\n 'S2153799015-POCLOUD',\n 'S2227193226-POCLOUD'],\n 'tools': ['TL2108419875-POCLOUD',\n 'TL2092786348-POCLOUD'],\n 'variables': ['V1997812737-POCLOUD',\n 'V1997812697-POCLOUD',\n 'V2112014688-POCLOUD',\n 'V1997812756-POCLOUD',\n 'V1997812688-POCLOUD',\n 'V1997812670-POCLOUD',\n 'V1997812724-POCLOUD',\n 'V2112014684-POCLOUD',\n 'V1997812701-POCLOUD',\n 'V1997812681-POCLOUD',\n 'V2112014686-POCLOUD',\n 'V1997812663-POCLOUD',\n 'V1997812676-POCLOUD',\n 'V1997812744-POCLOUD',\n 'V1997812714-POCLOUD']},\n 'boxes': ['-90 -180 90 180'],\n 'browse_flag': True,\n 'cloud_hosted': True,\n 'collection_data_type': 'SCIENCE_QUALITY',\n 'consortiums': ['GEOSS', 'EOSDIS'],\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface Skin '\n 'Temperature from the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the '\n 'NASA Aqua satellite (GDS2)',\n 'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True,\n 'id': 'C1940473819-POCLOUD',\n 'links': [{'href': 'https://podaac.jpl.nasa.gov/Podaac/thumbnails/MODIS_A-JPL-L2P-v2019.0.jpg',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#'},\n {'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'orbit_parameters': {'inclination_angle': '98.1',\n 'number_of_orbits': '1.0',\n 'period': '98.4',\n 'swath_width': '2330.0'},\n 'organizations': ['NASA/JPL/PODAAC'],\n 'original_format': 'UMM_JSON',\n 'platforms': ['Aqua'],\n 'processing_level_id': '2',\n 'service_features': {'esi': {'has_formats': False,\n 'has_spatial_subsetting': False,\n 'has_temporal_subsetting': False,\n 'has_transforms': False,\n 'has_variables': False},\n 'harmony': {'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True},\n 'opendap': {'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True}},\n 'short_name': 'MODIS_A-JPL-L2P-v2019.0',\n 'summary': 'NASA produces skin sea surface temperature '\n '(SST) products from the Infrared (IR) '\n 'channels of the Moderate-resolution Imaging '\n 'Spectroradiometer (MODIS) onboard the Aqua '\n 'satellite. Aqua was launched by NASA on May '\n '4, 2002, into a sun synchronous, polar orbit '\n 'with a daylight ascending node at 1:30 pm, '\n 'formation flying in the A-train with other '\n 'Earth Observation Satellites (EOS), to study '\n 'the global dynamics of the Earth atmosphere, '\n 'land and oceans. MODIS captures data in 36 '\n 'spectral bands at a variety of spatial '\n 'resolutions. Two SST products can be present '\n 'in these files. The first is a skin SST '\n 'produced for both day and night (NSST) '\n 'observations, derived from the long wave IR '\n '11 and 12 micron wavelength channels, using a '\n 'modified nonlinear SST algorithm intended to '\n 'provide continuity of SST derived from '\n 'heritage and current NASA sensors. At night, '\n 'a second SST product is generated using the '\n 'mid-infrared 3.95 and 4.05 micron wavelength '\n 'channels which are unique to MODIS; the SST '\n 'derived from these measurements is identified '\n 'as SST4. The SST4 product has lower '\n 'uncertainty, but due to sun glint can only be '\n 'used at night. MODIS L2P SST data have a 1 km '\n 'spatial resolution at nadir and are stored in '\n '288 five minute granules per day. Full global '\n 'coverage is obtained every two days, with '\n 'coverage poleward of 32.3 degree being '\n 'complete each day. The production of MODIS '\n 'L2P SST files is part of the Group for High '\n 'Resolution Sea Surface Temperature (GHRSST) '\n 'project and is a joint collaboration between '\n 'the NASA Jet Propulsion Laboratory (JPL), the '\n 'NASA Ocean Biology Processing Group (OBPG), '\n 'and the Rosenstiel School of Marine and '\n 'Atmospheric Science (RSMAS). Researchers at '\n 'RSMAS are responsible for SST algorithm '\n 'development, error statistics and quality '\n 'flagging, while the OBPG, as the NASA ground '\n 'data system, is responsible for the '\n 'production of daily MODIS ocean products. JPL '\n 'acquires MODIS ocean granules from the OBPG '\n 'and reformats them to the GHRSST L2P netCDF '\n 'specification with complete metadata and '\n 'ancillary variables, and distributes the data '\n 'as the official Physical Oceanography Data '\n 'Archive (PO.DAAC) for SST. The R2019.0 '\n 'supersedes the previous R2014.0 datasets '\n 'which can be found at '\n 'https://doi.org/10.5067/GHMDA-2PJ02',\n 'time_start': '2002-07-04T00:00:00.000Z',\n 'title': 'GHRSST Level 2P Global Sea Surface Skin '\n 'Temperature from the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the NASA '\n 'Aqua satellite (GDS2)',\n 'updated': '2019-12-02T22:59:24.849Z',\n 'version_id': '2019.0'}],\n 'id': 'https://cmr.earthdata.nasa.gov:443/search/collections.json?short_name=MODIS_A-JPL-L2P-v2019.0&provider_id=POCLOUD',\n 'title': 'ECHO dataset metadata',\n 'updated': '2022-10-25T21:32:46.472Z'}}\n\n\nNext we get a granule ID from this collection, G2525170359-POCLOUD.\n\ncmr_url = \"https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=\"+harmony_collection_id+\"&sort_key=-start_date\"\n\nresponse = requests.get(cmr_url)\n\ngid=response.json()['items'][0]['meta']['concept-id']\nprint(gid)\n\nG2525170359-POCLOUD" }, { - "objectID": "notebooks/harmony_concatenation/Harmony_Concatenation.html#what-is-concise", - "href": "notebooks/harmony_concatenation/Harmony_Concatenation.html#what-is-concise", - "title": "Harmony EOSS Concise API Tutorial", - "section": "What is Concise?", - "text": "What is Concise?\nConcise is a Harmony service developed by PODAAC that allows users to concatenate multiple L2 granules together into a single granule. This concatenation is done by adding a new subset_index dimension to the resulting granule." + "objectID": "notebooks/l2-regridding/reprojection notebook.html#access-reprojected-data", + "href": "notebooks/l2-regridding/reprojection notebook.html#access-reprojected-data", + "title": "Harmony API Introduction", + "section": "Access reprojected data", + "text": "Access reprojected data\nThe Harmony API accepts reprojection requests with a given coordinate reference system using the outputCrs keyword. According to the Harmony API documentation, this keyword “recognizes CRS types that can be inferred by gdal, including EPSG codes, Proj4 strings, and OGC URLs (http://www.opengis.net/def/crs/…)”." }, { - "objectID": "notebooks/harmony_concatenation/Harmony_Concatenation.html#before-you-start", - "href": "notebooks/harmony_concatenation/Harmony_Concatenation.html#before-you-start", - "title": "Harmony EOSS Concise API Tutorial", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\nSet up libraries needed to run demo\n\nimport os\nfrom harmony import BBox, Client, Collection, Request, Environment\nimport xarray as xr\nimport netCDF4 as nc\nimport matplotlib.pyplot as plt\n\nSet up collection to run concise and how many granules to concatenate\n\ncollection_id = 'C1940473819-POCLOUD'\nmax_results = 5\n\nSetup harmony client to make our harmony request.\nCreate our request with the collection we want to concatenate, set concatenate to true, how many granules we want to concatenate, set skip preview to true so job doesn’t pause, and the format output we want.\nCheck to make sure our harmony request is valid.\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection = Collection(id=collection_id)\n\nrequest = Request(\n collection = collection,\n concatenate = True,\n max_results = max_results,\n skip_preview = True,\n format=\"application/x-netcdf4\",\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\n\njob1_id = harmony_client.submit(request)\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=d2e082a6b1cc5b8ebff64aba5ebfd18e' -H 'User-Agent: Darwin/20.6.0 python-requests/2.26.0 harmony-py/0.4.2 CPython/3.8.10' 'https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-netcdf4&maxResults=5&concatenate=true&skipPreview=true'\n\n\nAfter submitting the request it is possible to retrieve the current processing status by using the job ID returned from the submission.\nIf the request is still running, we can wait until the Harmony request has finished processing. This cell will wait until the request has finised.\n\nprint(f'\\n{job1_id}')\n\nprint(harmony_client.status(job1_id))\n\nprint('\\nWaiting for the job to finish')\nresults = harmony_client.result_json(job1_id, show_progress=True)\n\n\n848c36db-0fe4-472e-b0e4-51abfba08101\n{'status': 'running', 'message': 'CMR query identified 2406552 granules, but the request has been limited to process only the first 5 granules because you requested 5 maxResults.', 'progress': 0, 'created_at': datetime.datetime(2022, 7, 27, 21, 37, 40, 347000, tzinfo=tzutc()), 'updated_at': datetime.datetime(2022, 7, 27, 21, 37, 40, 577000, tzinfo=tzutc()), 'created_at_local': '2022-07-27T14:37:40-07:00', 'updated_at_local': '2022-07-27T14:37:40-07:00', 'data_expiration': datetime.datetime(2022, 8, 26, 21, 37, 40, 347000, tzinfo=tzutc()), 'data_expiration_local': '2022-08-26T14:37:40-07:00', 'request': 'https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-netcdf4&maxResults=5&concatenate=true&skipPreview=true', 'num_input_granules': 5}\n\nWaiting for the job to finish\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\nAfter the harmony job is finished we download the resulting concatenated granule file.\n\nprint('\\nDownloading results:')\nfilename = None\nfutures = harmony_client.download_all(job1_id, overwrite=True)\nfor f in futures:\n print(f)\n print(f.result()) # f.result() is a filename, in this case\n filename = f.result()\nprint('\\nDone downloading.')\n\n\nDownloading results:\n<Future at 0x108e8ac70 state=running>\nC1940473819-POCLOUD_merged.nc4\n\nDone downloading.\n\n\nWith the output file downloaded, now we can open concatenated granule using xarray to inspect some of the metadata.\nNote: In some of the collections the time variable has a time dimension and when we concatenate files we add a subset_index into the time dimension which causes the time variable have two dimension. Xarray doesn’t allow the time variable have two dimensions so when using xarray to open concatenated files the time variable might need to be dropped. The file can be open with netcdf library\n\n#some collections time variabe has a time dimension which can cause an exception when we concatenate and makes time two dimension\ntry:\n ds = xr.open_dataset(filename, decode_times=False)\nexcept xr.core.variable.MissingDimensionsError:\n ds = xr.open_dataset(filename, decode_times=False, drop_variables=['time'])\n\nprint(list(ds.variables))\n \nassert len(ds.coords['subset_index']) == max_results\n\n['subset_files', 'lat', 'lon', 'sea_surface_temperature', 'sst_dtime', 'quality_level', 'sses_bias', 'sses_standard_deviation', 'l2p_flags', 'sea_surface_temperature_4um', 'quality_level_4um', 'sses_bias_4um', 'sses_standard_deviation_4um', 'wind_speed', 'dt_analysis']\n\n\nAfter opening the file we can use matplotlib to create a plot for each subindex where each subindex represents the data for the granule file. We will plot sea_surface_temperature for each granule using subset_index dimension.\n\nvariable = None\nfor v in list(ds.variables):\n if v not in ['subset_files', 'lat', 'lon']:\n variable = v\n break;\n\nfor index in range(0, max_results):\n \n ds.isel(subset_index=index).plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=variable,\n s=1,\n levels=9,\n cmap=\"jet\",\n aspect=2.5,\n size=9\n )\n \n plt.xlim( 0., 360.)\n plt.ylim(-90., 90.)\n plt.show()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWe can also plot out the entire granule file which would plot all the data of the concatenated files.\n\nds.plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=variable,\n s=1,\n levels=9,\n cmap=\"jet\",\n aspect=2.5,\n size=9\n)\n\nplt.xlim( 0., 360.)\nplt.ylim(-90., 90.)\nplt.show()" + "objectID": "notebooks/l2-regridding/reprojection notebook.html#the-practice-datasets-below-used-for-this-tutorial-are-no-longer-supported-for-details-about-the-harmony-api-see-this-tutorial-from-the-2021-cloud-hackathon-or-this-tutorial-introducing-the-harmony-py-library.", + "href": "notebooks/l2-regridding/reprojection notebook.html#the-practice-datasets-below-used-for-this-tutorial-are-no-longer-supported-for-details-about-the-harmony-api-see-this-tutorial-from-the-2021-cloud-hackathon-or-this-tutorial-introducing-the-harmony-py-library.", + "title": "Harmony API Introduction", + "section": "The practice datasets below used for this tutorial are no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "text": "The practice datasets below used for this tutorial are no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.\nTwo examples below demonstrate inputting an EPSG code and Proj4 string using the global test granule from previous examples. First, let’s view the projection information of the granule in the native projection, using the variable subset example:" }, { - "objectID": "notebooks/MODIS_L2P_SST_DataCube.html#before-you-start", - "href": "notebooks/MODIS_L2P_SST_DataCube.html#before-you-start", - "title": "The following notebook is no longer supported, see this related notebook highlighting Zarr Data Cubes", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nfrom urllib import request, parse\nfrom http.cookiejar import CookieJar\nimport getpass\nimport netrc\nimport requests\nimport urllib\nimport json\nimport pprint\nimport time\nimport os\nfrom os import makedirs, path\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport shutil\nfrom osgeo import gdal, gdalconst\n#from nco import Nco\nimport glob\n#import shutil\nimport xarray as xr\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\n%matplotlib inline\n\n\n# Constants\n\n# the local download directory\ndownload_dir = \"./modis-datacube-output\"\n\n# URS, CMR, Harmony roots\nedl = \"urs.earthdata.nasa.gov\"\ncmr = \"cmr.earthdata.nasa.gov\"\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\ndownload_dir = os.path.abspath(download_dir) + os.path.sep\nPath(download_dir).mkdir(parents=True, exist_ok=True)" - }, + "objectID": "notebooks/l2-regridding/reprojection notebook.html#access-level-2-swath-regridded-data", + "href": "notebooks/l2-regridding/reprojection notebook.html#access-level-2-swath-regridded-data", + "title": "Harmony API Introduction", + "section": "Access Level 2 swath regridded data", + "text": "Access Level 2 swath regridded data\nMoving outside of the harmony/gdal service, we will now request regridding from the sds/swot-reproject service using the C1940473819-POCLOUD.\nThe Harmony API accepts several query parameters related to regridding and interpolation in addition to the reprojection parameters above:\ninterpolation=<String> - Both near and bilinear are valid options\nscaleSize=x,y - 2 comma separated numbers as floats\nscaleExtent=xmin,ymin,xmax,ymax - 4 comma separated numbers as floats\nwidth=<Float>\nheight=<Float>\nAn error is returned if both scaleSize and width/height parameters are both provided (only one or the other can be used).\nRequest reprojection to Europe Lambert Conformal Conic with a new scale extent and nearest neighbor interpolation:\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\n# URL encode string using urllib parse package\nproj_string = '+proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs' # proj4 of WGS 84 / NSIDC EASE-Grid 2.0 Global projection\n#l2proj_string = '+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'\nl2proj_encode = parse.quote(proj_string)\n\nregridConfig = {\n 'l2collection_id': 'C1940473819-POCLOUD',\n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'granuleid': 'G1234734747-POCLOUD',\n 'outputCrs': l2proj_encode,\n 'interpolation': 'near',\n 'width': 1000,\n 'height': 1000\n}\n\nregrid_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\nprint('Request URL', regrid_url)\nregrid_response = request.urlopen(regrid_url)\nregrid_results = regrid_response.read()\n\nRequest URL https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?&granuleid=G1234734747-POCLOUD&outputCrs=%2Bproj%3Dcea%20%2Blon_0%3D0%20%2Blat_ts%3D30%20%2Bx_0%3D0%20%2By_0%3D0%20%2Bellps%3DWGS84%20%2Btowgs84%3D0%2C0%2C0%2C0%2C0%2C0%2C0%20%2Bunits%3Dm%20%2Bno_defs&interpolation=near&height=1000&width=1000\n\n\n\n---------------------------------------------------------------------------\nHTTPError Traceback (most recent call last)\n~\\AppData\\Local\\Temp/ipykernel_25980/2681644789.py in <module>\n 19 regrid_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\n 20 print('Request URL', regrid_url)\n---> 21 regrid_response = request.urlopen(regrid_url)\n 22 regrid_results = regrid_response.read()\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)\n 220 else:\n 221 opener = _opener\n--> 222 return opener.open(url, data, timeout)\n 223 \n 224 def install_opener(opener):\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in open(self, fullurl, data, timeout)\n 529 for processor in self.process_response.get(protocol, []):\n 530 meth = getattr(processor, meth_name)\n--> 531 response = meth(req, response)\n 532 \n 533 return response\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_response(self, request, response)\n 638 # request was successfully received, understood, and accepted.\n 639 if not (200 <= code < 300):\n--> 640 response = self.parent.error(\n 641 'http', request, response, code, msg, hdrs)\n 642 \n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in error(self, proto, *args)\n 561 http_err = 0\n 562 args = (dict, proto, meth_name) + args\n--> 563 result = self._call_chain(*args)\n 564 if result:\n 565 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in _call_chain(self, chain, kind, meth_name, *args)\n 500 for handler in handlers:\n 501 func = getattr(handler, meth_name)\n--> 502 result = func(*args)\n 503 if result is not None:\n 504 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_error_302(self, req, fp, code, msg, headers)\n 753 fp.close()\n 754 \n--> 755 return self.parent.open(new, timeout=req.timeout)\n 756 \n 757 http_error_301 = http_error_303 = http_error_307 = http_error_302\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in open(self, fullurl, data, timeout)\n 529 for processor in self.process_response.get(protocol, []):\n 530 meth = getattr(processor, meth_name)\n--> 531 response = meth(req, response)\n 532 \n 533 return response\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_response(self, request, response)\n 638 # request was successfully received, understood, and accepted.\n 639 if not (200 <= code < 300):\n--> 640 response = self.parent.error(\n 641 'http', request, response, code, msg, hdrs)\n 642 \n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in error(self, proto, *args)\n 567 if http_err:\n 568 args = (dict, 'default', 'http_error_default') + orig_args\n--> 569 return self._call_chain(*args)\n 570 \n 571 # XXX probably also want an abstract factory that knows when it makes\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in _call_chain(self, chain, kind, meth_name, *args)\n 500 for handler in handlers:\n 501 func = getattr(handler, meth_name)\n--> 502 result = func(*args)\n 503 if result is not None:\n 504 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_error_default(self, req, fp, code, msg, hdrs)\n 647 class HTTPDefaultErrorHandler(BaseHandler):\n 648 def http_error_default(self, req, fp, code, msg, hdrs):\n--> 649 raise HTTPError(req.full_url, code, msg, hdrs, fp)\n 650 \n 651 class HTTPRedirectHandler(BaseHandler):\n\nHTTPError: HTTP Error 401: Unauthorized\n\n\n\nThis reprojected and regridded output is downloaded to the Harmony outputs directory and we can inspect a variable to check for projection and grid dimension:\n\nregrid_file_name = 'regrid-near.nc'\nregrid_filepath = str(regrid_file_name)\nfile_ = open(regrid_filepath, 'wb')\nfile_.write(regrid_results)\nfile_.close()\n\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\n# URL encode string using urllib parse package\nproj_string = '+proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs' # proj4 of WGS 84 / NSIDC EASE-Grid 2.0 Global projection\n#l2proj_string = '+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'\nl2proj_encode = parse.quote(proj_string)\n\nharmony_root = 'https://harmony.uat.earthdata.nasa.gov'\n\nregridConfig = {\n 'l2collection_id': 'C1234724470-POCLOUD',\n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'granuleid': 'G1234734747-POCLOUD',\n 'outputCrs': l2proj_encode,\n 'interpolation': 'bilinear',\n 'width': 1000,\n 'height': 1000\n}\n\nregrid_bi_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\nprint('Request URL', regrid_bi_url)\nregrid_bi_response = request.urlopen(regrid_bi_url)\nregrid_bi_results = regrid_bi_response.read()\n\n\nregrid_bi_file_name = 'regrid-bi.nc'\nregrid_bi_filepath = str(regrid_bi_file_name)\nfile_ = open(regrid_bi_filepath, 'wb')\nfile_.write(regrid_bi_results)\nfile_.close()\n\nPrint the x and y dimensions to confirm that the output matches the requested scale extent in meters:\n\nimport xarray as xr\nreproject_ds = xr.open_dataset(regrid_filepath, drop_variables='time')\nprint(reproject_ds)\n\n\nimport xarray as xr\nreproject_bi_ds = xr.open_dataset(regrid_bi_filepath, drop_variables='time')\nprint(reproject_bi_ds)\n\n\noriginal_ds = xr.open_dataset('20200131234501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc')\nprint(original_ds)\n\n\ng = reproject_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Nearest Neighbor Interpolation\")\n\n\ng= reproject_bi_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Bilinear Interpolation\")\n\n\ng = original_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Native File\")\n\n\ng= original_ds.sea_surface_temperature.plot(x=\"lon\", y=\"lat\", robust=True)\ng.axes.set_title(\"Native, projected to Lat/Lon\")" + }, { - "objectID": "notebooks/MODIS_L2P_SST_DataCube.html#perform-the-subsetting-operation-using-the-earthdata-harmony-service", - "href": "notebooks/MODIS_L2P_SST_DataCube.html#perform-the-subsetting-operation-using-the-earthdata-harmony-service", - "title": "The following notebook is no longer supported, see this related notebook highlighting Zarr Data Cubes", - "section": "Perform the subsetting operation using the Earthdata Harmony service", - "text": "Perform the subsetting operation using the Earthdata Harmony service\nHarmony allows us to use a CMR style query to find and subset all matching granules for a collection, datetime, and spatial bounding box.\n\ntry: \n harmonyConfig = {\n 'collection_id': ccid, \n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'lat': '(' + str(south) + \":\" + str(north) + ')',\n 'lon': '(' + str(west) + \":\" + str(east) + ')', \n 'start': start_time,\n 'stop': stop_time\n }\n\n # subset granule\n async_url = harmony_root + '/{collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?subset=lat{lat}&subset=lon{lon}&subset=time(\"{start}\":\"{stop}\")'.format(**harmonyConfig)\n\n print('Request URL', async_url)\n async_response = request.urlopen(async_url)\n async_results = async_response.read()\n async_json = json.loads(async_results)\n pprint.pprint(async_json)\n\n\nexcept urllib.error.HTTPError as e:\n print(f\" [{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n{e.read()}\\n\")\n raise e \nexcept Exception as e:\n print(f\" [{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n \n\nMonitor the Harmony job\n\njobConfig = {\n 'jobID': async_json['jobID']\n}\n\njob_url = harmony_root+'/jobs/{jobID}'.format(**jobConfig)\nprint('Job URL', job_url)\n\n\n\njob_response = request.urlopen(job_url)\njob_results = job_response.read()\njob_json = json.loads(job_results)\n\nprint('Job response:')\nprint()\npprint.pprint(job_json)\nwhile job_json['status'] == 'running' and job_json['progress'] < 100:\n print('Job status is running. Progress is ', job_json['progress'], '%. Trying again.')\n time.sleep(10)\n loop_response = request.urlopen(job_url)\n loop_results = loop_response.read()\n job_json = json.loads(loop_results)\n if job_json['status'] == 'running':\n continue\n\nDownload subsets to local computer\n\n# Download the data\nfile_urls = []\n\nfor job_result in job_json['links']:\n\n download_url = job_result['href']\n file_name = job_result['title']\n if file_name == 'Job Status':\n continue\n \n if file_name == 'STAC catalog':\n continue\n \n print(\"downloading \" + file_name)\n \n #store output in a defined directory with a meaninful filename based on orginal name\n out_file = download_dir + file_name\n print(out_file)\n file_urls.append(out_file)\n with request.urlopen(download_url) as response, open(out_file, 'wb') as output:\n shutil.copyfileobj(response, output) \n \n \n\nPerform resampling/reprojection on subsets using the GDAL module and gdal.Warp(). GDAL will only work on one variable (“layer”) at a time and also strip out important CF metadata and coordinate variables. Therefore we will use NCO tricks to correct these artifacts here and in the next steps. Use the ‘pynco’ module for NCO python bindings.\n\nnco = Nco()\n\n# Keyword args for gdal.Warp():\n# Set the output size in decimal degrees close to 1 km native resolution.\n# Use 'bilinear' interpolation (another option is 'cubicspline')\nkwargs = {'format': 'netCDF', 'copyMetadata': True, \n 'outputBounds': [west, south, east, north], \n 'xRes': 0.01,\n 'yRes' : 0.01,\n 'dstSRS':'+proj=longlat +datum=WGS84 +no_defs',\n 'resampleAlg': 'bilinear',\n }\nprint(kwargs)\n\nnc_vars = ['sea_surface_temperature', 'quality_level']\n\n# Loop through subsetted files (use file_urls as the loop list) and warp into defined region from kwargs{}\n\nfor i in range(len(file_urls)):\n for j in range(len(nc_vars)): \n variable = nc_vars[j]\n \n # input filename\n src_filename = file_urls[i] \n print(\"source filename: \", src_filename)\n \n # load the netCDF 'layer' like sea_surface_temperature (variable)\n nc_file = 'NETCDF:' + src_filename + ':' + variable\n print(nc_file)\n \n # try/catch for GDAL steps. Dont work on empty netCDF file from subsetting operation \n try:\n src = gdal.Open(nc_file, gdalconst.GA_ReadOnly)\n\n # set output filename\n out_filename = download_dir + 'subset_reproject-' + variable + '-' + basename(file_urls[i]) \n ds = gdal.Warp(out_filename, src, **kwargs)\n print(\"\")\n\n del ds\n del src \n \n # add time dimenson to 'Band1' using NCO\n nco.ncecat(input=out_filename, output='tmp.nc', options=['-v Band1 -u time'])\n nco.ncks(input='tmp.nc', output=out_filename, options=['-v Band1'])\n\n # use NCO to copy (append with -A ) the time variable to the output and make it a record dimension\n nco.ncks(input=src_filename, output=out_filename, options=['-v time -A --mk_rec_dmn time'])\n\n except Exception as e:\n #Errors can happen when downloading subsetted files because some might \n #not actually fall in the bounding box, and are returned 'empty'\n print(f\" [{datetime.now()}] FAILURE: \\n\")\n \n else:\n print(f\" [{datetime.now()}] SUCCESS for: {out_filename}\")\n print()\n\nAdd variable level CF metadata information that GDAL stripped out using NCO commands. Use the ‘pynco’ module for NCO python bindings.\n\nnco = Nco()\n\nsstConfig = {\n 'scale_factor': 0.005, \n 'add_offset': 273.15,\n 'valid_max': 10000,\n 'valid_min': -1000,\n 'long_name': 'sea surface temperature',\n 'standard_name': 'sea_surface_skin_temperature',\n 'coverage_content_type': 'physicalMeasurement'\n }\n\nqualityConfig = {\n 'valid_max': 0,\n 'valid_min': 5, \n 'flag_values': '0b, 1b, 2b, 3b, 4b, 5b',\n 'flag_meanings': 'no_data bad_data worst_quality low_quality acceptable_quality best_quality',\n 'long_name': 'quality level of SST pixel',\n 'coverage_content_type': 'qualityInformation'\n }\n \nnc_vars = ['sea_surface_temperature', 'quality_level']\nos.chdir(download_dir)\n\nfor i in range(len(nc_vars)): \n variable = nc_vars[i]\n reg_ex = \"subset*\" + variable + \"*\"\n for file in glob.glob(reg_ex):\n if variable == 'sea_surface_temperature':\n print(\" -> Updating \"+ file)\n nco.ncrename(input=file, output=file, options=['-v .Band1,sea_surface_temperature'])\n \n\n # update the SST variable attributes\n nco.ncatted(input=file, output=file, options=['-a scale_factor,'+ variable + ',o,f,{scale_factor}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a add_offset,'+ variable + ',o,f,{add_offset}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_min,'+ variable + ',o,s,{valid_min}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_max,'+ variable + ',o,s,{valid_max}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a long_name,'+ variable + ',o,c,\"{long_name}\"'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a standard_name,'+ variable + ',o,c,{standard_name}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a coverage_content_type,'+ variable + ',o,c,{coverage_content_type}'.format(**sstConfig)])\n \n elif variable == 'quality_level':\n print(\" -> Updating \"+ file)\n \n nco.ncrename(input=file, output=file, options=['-v .Band1,' + variable])\n\n # update the quality variable attributes\n nco.ncatted(input=file, output=file, options=['-a valid_min,'+ variable + ',o,s,{valid_min}'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_max,'+ variable + ',o,s,{valid_max}'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a long_name,'+ variable + ',o,c,\"{long_name}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a flag_values,'+ variable + ',o,c,\"{flag_values}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a flag_meanings,'+ variable + ',o,c,\"{flag_meanings}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a coverage_content_type,'+ variable + ',o,c,{coverage_content_type}'.format(**qualityConfig)])\n \n \nprint( \"-Done-\\n\")\n\nCreate the MODIS SST Data Cube. Copy variable(s) to SST target files and catenate all of them into a final output netCDF file using NCO.\n\nnco = Nco()\nos.chdir(download_dir)\n\n\n# Loop through the SST files and add variable quality_level to SST file (target)\nreg_ex = \"subset_reproject-sea_surface_temperature*\"\n\nprint( \"Copying quality_level variables to target sst files . . .\")\nfor sst_file in glob.glob(reg_ex): \n quality_file = sst_file.replace(\"sea_surface_temperature\", \"quality_level\") \n nco.ncks(input=quality_file, output=sst_file, options=['-v quality_level -A'])\n \n \n# Create the data cube using NCO ncrcat command\nprint(\". . . -Done- \\n\\nCreating MODIS SST data cube . . . \")\nnco.ncrcat(input=glob.glob(reg_ex), output='MODIS_SST.data-cube.nc')\nprint(\". . . -Done- \\n\")\n\n\nRead the data with xarray and perform some plotting\n\ndataCube = download_dir + 'MODIS_SST.data-cube.nc'\nxds = xr.open_dataset(dataCube)\n\n# create objects for subplots\nfig, axes = plt.subplots(ncols=2)\n\n# plot a time series at a specific location\nxds.sea_surface_temperature.isel(lat = 200, lon = 300).plot(ax=axes[0], marker = '.', linestyle = 'None')\n\n# a histogram of all points in region of interest\nxds.sea_surface_temperature.plot(ax=axes[1])\n\nplt.tight_layout()\nplt.draw()\n\n# filter the dataset using quality information (quality_level value 4 and 5 are best data)\nqc_dataset = xds.where((xds['sea_surface_temperature'] < 310) & (xds['quality_level'] >= 4))\n\n# re-plot the time series at a specific location and the regional histogram\nfig, axes = plt.subplots(ncols=2)\nqc_dataset.sea_surface_temperature.isel(lat = 200, lon = 300).plot(ax=axes[0], marker = '.', linestyle = 'None')\nqc_dataset.sea_surface_temperature.plot(ax=axes[1])\n\nplt.tight_layout()\nplt.draw()" + "objectID": "notebooks/aws_lambda_sst/sst-global-mean-exploratory.html", + "href": "notebooks/aws_lambda_sst/sst-global-mean-exploratory.html", + "title": "Calculate MUR25 Sea Surface Temperature Global Mean", + "section": "", + "text": "This notebook demonstrates how we calculate the area-weighted global mean sea surface temperature (SST) from the MUR25 L4 dataset.\nYou can run this on a local computer by downloading the data using the following command in your terminal:\npodaac-data-downloader -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2022-12-01T00:00:00Z --end-date 2022-12-31T23:00:00Z\n\nLoad required libraries and prepare data\n\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport xarray as xr\nfrom datetime import date\n\n\nds = xr.load_dataset('~/data/MUR25-JPL-L4-GLOB-v04.2/20221201090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 1, lat: 720, lon: 1440)\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\n * lat (lat) float32 -89.88 -89.62 -89.38 ... 89.38 89.62 89.88\n * lon (lon) float32 -179.9 -179.6 -179.4 ... 179.4 179.6 179.9\nData variables:\n analysed_sst (time, lat, lon) float32 nan nan nan ... 271.4 271.4 271.4\n analysis_error (time, lat, lon) float32 nan nan nan ... 0.34 0.34 0.34\n mask (time, lat, lon) float32 2.0 2.0 2.0 2.0 ... 9.0 9.0 9.0\n sea_ice_fraction (time, lat, lon) float32 nan nan nan ... 0.97 0.97 0.97\n sst_anomaly (time, lat, lon) float32 nan nan nan nan ... 0.0 0.0 0.0\nAttributes: (12/54)\n Conventions: CF-1.7, ACDD-1.3\n title: Daily 0.25-degree MUR SST, Final product\n summary: A low-resolution version of the MUR SST analy...\n keywords: Oceans > Ocean Temperature > Sea Surface Temp...\n keywords_vocabulary: NASA Global Change Master Directory (GCMD) Sc...\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadata Con...\n ... ...\n publisher_name: GHRSST Project Office\n publisher_url: https://www.ghrsst.org\n publisher_email: gpc@ghrsst.org\n file_quality_level: 3\n metadata_link: http://podaac.jpl.nasa.gov/ws/metadata/datase...\n acknowledgment: Please acknowledge the use of these data with...xarray.DatasetDimensions:time: 1lat: 720lon: 1440Coordinates: (3)time(time)datetime64[ns]2022-12-01T09:00:00long_name :reference time of sst fieldstandard_name :timecoverage_content_type :coordinateaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)lon(lon)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudecoverage_content_type :coordinateaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)Data variables: (5)analysed_sst(time, lat, lon)float32nan nan nan ... 271.4 271.4 271.4long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperaturecoverage_content_type :physicalMeasurementunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFarray([[[ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n ...,\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35],\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35],\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35]]],\n dtype=float32)analysis_error(time, lat, lon)float32nan nan nan nan ... 0.34 0.34 0.34long_name :estimated error standard deviation of analysed_sstcoverage_content_type :qualityInformationunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \"analysed_sst\"array([[[ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n ...,\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34],\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34],\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34]]], dtype=float32)mask(time, lat, lon)float322.0 2.0 2.0 2.0 ... 9.0 9.0 9.0 9.0long_name :sea/land field composite maskcoverage_content_type :referenceInformationvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_meanings :water land optional_lake_surface sea_ice optional_river_surfacecomment :flag interpretation as integer values: 1=water, 2=land, 5=lake, 9=water with ice in the grid, 13=lake with ice in the grid, 17=riversource :GMT \"grdlandmask\", ice flag from sea_ice_fraction dataarray([[[2., 2., 2., ..., 2., 2., 2.],\n [2., 2., 2., ..., 2., 2., 2.],\n [2., 2., 2., ..., 2., 2., 2.],\n ...,\n [9., 9., 9., ..., 9., 9., 9.],\n [9., 9., 9., ..., 9., 9., 9.],\n [9., 9., 9., ..., 9., 9., 9.]]], dtype=float32)sea_ice_fraction(time, lat, lon)float32nan nan nan nan ... 0.97 0.97 0.97long_name :sea ice area fractionstandard_name :sea_ice_area_fractioncoverage_content_type :auxiliaryInformationvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.array([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [0.96 , 0.96 , 0.96 , ..., 0.96 ,\n 0.96 , 0.96 ],\n [0.96 , 0.96 , 0.96 , ..., 0.96999997,\n 0.96999997, 0.96999997],\n [0.96 , 0.96 , 0.96 , ..., 0.96999997,\n 0.96999997, 0.96999997]]], dtype=float32)sst_anomaly(time, lat, lon)float32nan nan nan nan ... 0.0 0.0 0.0 0.0long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodcoverage_content_type :auxiliaryInformationunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]]], dtype=float32)Attributes: (54)Conventions :CF-1.7, ACDD-1.3title :Daily 0.25-degree MUR SST, Final productsummary :A low-resolution version of the MUR SST analysis, a merged, multi-sensor L4 Foundation SST analysis product from JPL.keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-B, Buoys/Shipsinstrument :MODIS, AMSR2, AVHRR, in-situsensor :MODIS, AMSR2, AVHRR, in-situprocessing_level :L4cdm_data_type :gridproduct_version :04.2references :Chin et al. (2017) \"Remote Sensing of Environment\", volulme 200, pages 154-169. http://dx.doi.org/10.1016/j.rse.2017.07.029creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govcreator_institution :Jet Propulsion Laboratoryinstitution :Jet Propulsion Laboratoryproject :NASA MEaSUREs and COVERAGEprogram :NASA Earth Science Data and Information System (ESDIS)southernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0geospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lon_min :-180.0geospatial_lon_max :180.0geospatial_lat_units :degrees northgeospatial_lat_resolution :0.25geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.25date_created :2022-12-10start_time :20221201T090000Zstop_time :20221201T090000Ztime_coverage_start :20221130T210000Ztime_coverage_end :20221201T210000Ztime_coverage_resolution :P1Dlicense :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR25-JPL-L4-GLOB-v04.2uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66comment :MUR = \"Multi-scale Ultra-high Resolution\"naming_authority :org.ghrsstgds_version_id :2.0netcdf_version_id :04.2spatial_resolution :0.25 degreespublisher_name :GHRSST Project Officepublisher_url :https://www.ghrsst.orgpublisher_email :gpc@ghrsst.orgfile_quality_level :3metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR25-JPL-L4-GLOB-v04.2acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs and COVERAGE programs.\n\n\n\n# select sst variable\nsst = ds.analysed_sst\n\n# convert to degrees Celcius\nsst = sst - 273.15\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 720, lon: 1440)>\narray([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878]]], dtype=float32)\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\n * lat (lat) float32 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88\n * lon (lon) float32 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9xarray.DataArray'analysed_sst'time: 1lat: 720lon: 1440nan nan nan nan nan nan nan nan ... -1.8 -1.8 -1.8 -1.8 -1.8 -1.8 -1.8array([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878]]], dtype=float32)Coordinates: (3)time(time)datetime64[ns]2022-12-01T09:00:00long_name :reference time of sst fieldstandard_name :timecoverage_content_type :coordinateaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)lon(lon)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudecoverage_content_type :coordinateaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)Attributes: (0)\n\n\n\n# plot the data\np = sst.plot(subplot_kws=dict(transform=ccrs.PlateCarree()))\n\n\n\n\n\n\n\n\n\n\nCalculate the area-weighted global mean\n\n# create the weights\n\nweights = np.cos(np.deg2rad(sst.lat))\nweights\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lat' (lat: 720)>\narray([0.00218172, 0.00654498, 0.01090811, 0.01527103, 0.01963366,\n 0.02399603, 0.02835783, 0.03271909, 0.03707973, 0.04143966,\n 0.04579892, 0.05015719, 0.0545145 , 0.05887078, 0.06322594,\n 0.06758001, 0.07193268, 0.07628398, 0.08063382, 0.08498225,\n 0.08932894, 0.09367393, 0.09801713, 0.10235848, 0.10669798,\n 0.11103535, 0.11537059, 0.11970364, 0.12403442, 0.12836295,\n 0.13268891, 0.13701235, 0.14133318, 0.14565133, 0.1499668 ,\n 0.15427932, 0.1585889 , 0.16289546, 0.16719891, 0.1714993 ,\n 0.1757963 , 0.18008997, 0.1843802 , 0.18866692, 0.19295016,\n 0.19722962, 0.20150532, 0.20577718, 0.21004525, 0.2143092 ,\n 0.21856907, 0.22282477, 0.22707623, 0.2313235 , 0.23556623,\n 0.23980448, 0.24403816, 0.24826722, 0.25249165, 0.25671116,\n 0.26092577, 0.26513544, 0.26934004, 0.27353963, 0.2777339 ,\n 0.28192288, 0.2861065 , 0.29028466, 0.2944574 , 0.29862443,\n 0.30278578, 0.30694136, 0.3110911 , 0.31523505, 0.31937286,\n 0.3235046 , 0.32763016, 0.33174962, 0.33586264, 0.33996928,\n 0.34406942, 0.34816304, 0.35225013, 0.3563304 , 0.36040387,\n 0.3644705 , 0.36853018, 0.37258297, 0.37662855, 0.38066694,\n 0.38469812, 0.38872194, 0.3927385 , 0.39674744, 0.40074885,\n 0.40474263, 0.4087287 , 0.4127071 , 0.4166775 , 0.42064002,\n...\n 0.40074885, 0.39674744, 0.3927385 , 0.38872194, 0.38469812,\n 0.38066694, 0.37662855, 0.37258297, 0.36853018, 0.3644705 ,\n 0.36040387, 0.3563304 , 0.35225013, 0.34816304, 0.34406942,\n 0.33996928, 0.33586264, 0.33174962, 0.32763016, 0.3235046 ,\n 0.31937286, 0.31523505, 0.3110911 , 0.30694136, 0.30278578,\n 0.29862443, 0.2944574 , 0.29028466, 0.2861065 , 0.28192288,\n 0.2777339 , 0.27353963, 0.26934004, 0.26513544, 0.26092577,\n 0.25671116, 0.25249165, 0.24826722, 0.24403816, 0.23980448,\n 0.23556623, 0.2313235 , 0.22707623, 0.22282477, 0.21856907,\n 0.2143092 , 0.21004525, 0.20577718, 0.20150532, 0.19722962,\n 0.19295016, 0.18866692, 0.1843802 , 0.18008997, 0.1757963 ,\n 0.1714993 , 0.16719891, 0.16289546, 0.1585889 , 0.15427932,\n 0.1499668 , 0.14565133, 0.14133318, 0.13701235, 0.13268891,\n 0.12836295, 0.12403442, 0.11970364, 0.11537059, 0.11103535,\n 0.10669798, 0.10235848, 0.09801713, 0.09367393, 0.08932894,\n 0.08498225, 0.08063382, 0.07628398, 0.07193268, 0.06758001,\n 0.06322594, 0.05887078, 0.0545145 , 0.05015719, 0.04579892,\n 0.04143966, 0.03707973, 0.03271909, 0.02835783, 0.02399603,\n 0.01963366, 0.01527103, 0.01090811, 0.00654498, 0.00218172],\n dtype=float32)\nCoordinates:\n * lat (lat) float32 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88\nAttributes:\n long_name: latitude\n standard_name: latitude\n coverage_content_type: coordinate\n axis: Y\n units: degrees_north\n valid_min: -90.0\n valid_max: 90.0\n comment: geolocations inherited from the input data withou...xarray.DataArray'lat'lat: 7200.002182 0.006545 0.01091 0.01527 ... 0.01091 0.006545 0.002182array([0.00218172, 0.00654498, 0.01090811, 0.01527103, 0.01963366,\n 0.02399603, 0.02835783, 0.03271909, 0.03707973, 0.04143966,\n 0.04579892, 0.05015719, 0.0545145 , 0.05887078, 0.06322594,\n 0.06758001, 0.07193268, 0.07628398, 0.08063382, 0.08498225,\n 0.08932894, 0.09367393, 0.09801713, 0.10235848, 0.10669798,\n 0.11103535, 0.11537059, 0.11970364, 0.12403442, 0.12836295,\n 0.13268891, 0.13701235, 0.14133318, 0.14565133, 0.1499668 ,\n 0.15427932, 0.1585889 , 0.16289546, 0.16719891, 0.1714993 ,\n 0.1757963 , 0.18008997, 0.1843802 , 0.18866692, 0.19295016,\n 0.19722962, 0.20150532, 0.20577718, 0.21004525, 0.2143092 ,\n 0.21856907, 0.22282477, 0.22707623, 0.2313235 , 0.23556623,\n 0.23980448, 0.24403816, 0.24826722, 0.25249165, 0.25671116,\n 0.26092577, 0.26513544, 0.26934004, 0.27353963, 0.2777339 ,\n 0.28192288, 0.2861065 , 0.29028466, 0.2944574 , 0.29862443,\n 0.30278578, 0.30694136, 0.3110911 , 0.31523505, 0.31937286,\n 0.3235046 , 0.32763016, 0.33174962, 0.33586264, 0.33996928,\n 0.34406942, 0.34816304, 0.35225013, 0.3563304 , 0.36040387,\n 0.3644705 , 0.36853018, 0.37258297, 0.37662855, 0.38066694,\n 0.38469812, 0.38872194, 0.3927385 , 0.39674744, 0.40074885,\n 0.40474263, 0.4087287 , 0.4127071 , 0.4166775 , 0.42064002,\n...\n 0.40074885, 0.39674744, 0.3927385 , 0.38872194, 0.38469812,\n 0.38066694, 0.37662855, 0.37258297, 0.36853018, 0.3644705 ,\n 0.36040387, 0.3563304 , 0.35225013, 0.34816304, 0.34406942,\n 0.33996928, 0.33586264, 0.33174962, 0.32763016, 0.3235046 ,\n 0.31937286, 0.31523505, 0.3110911 , 0.30694136, 0.30278578,\n 0.29862443, 0.2944574 , 0.29028466, 0.2861065 , 0.28192288,\n 0.2777339 , 0.27353963, 0.26934004, 0.26513544, 0.26092577,\n 0.25671116, 0.25249165, 0.24826722, 0.24403816, 0.23980448,\n 0.23556623, 0.2313235 , 0.22707623, 0.22282477, 0.21856907,\n 0.2143092 , 0.21004525, 0.20577718, 0.20150532, 0.19722962,\n 0.19295016, 0.18866692, 0.1843802 , 0.18008997, 0.1757963 ,\n 0.1714993 , 0.16719891, 0.16289546, 0.1585889 , 0.15427932,\n 0.1499668 , 0.14565133, 0.14133318, 0.13701235, 0.13268891,\n 0.12836295, 0.12403442, 0.11970364, 0.11537059, 0.11103535,\n 0.10669798, 0.10235848, 0.09801713, 0.09367393, 0.08932894,\n 0.08498225, 0.08063382, 0.07628398, 0.07193268, 0.06758001,\n 0.06322594, 0.05887078, 0.0545145 , 0.05015719, 0.04579892,\n 0.04143966, 0.03707973, 0.03271909, 0.02835783, 0.02399603,\n 0.01963366, 0.01527103, 0.01090811, 0.00654498, 0.00218172],\n dtype=float32)Coordinates: (1)lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)Attributes: (8)long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correction\n\n\n\nfor lat in sst.lat:\n l = lat.values\n if (l>60) or (l<-60):\n weights.loc[dict(lat=l)] = 0\n\n#weights\n\n\n# apply weights to data\nsst_weighted = sst.weighted(weights)\n\n# calculate the global mean on the weighted data\nsst_global_mean = sst_weighted.mean()\n\n# display the values\nsst_global_mean\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' ()>\narray(20.52885965)xarray.DataArray'analysed_sst'20.53array(20.52885965)Coordinates: (0)Attributes: (0)\n\n\n\n\nsst_out = sst_global_mean.expand_dims(time=ds.time)\nsst_out = sst_out.assign_attrs({\n \"description\": \"Area-weighted global mean sea surface temperature calculated using AWS Lambda\",\n \"units\": \"celcius\",\n \"date_created\": date.today().strftime(\"%b-%d-%Y\")\n})\nsst_out\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1)>\narray([20.52885965])\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\nAttributes:\n description: Area-weighted global mean sea surface temperature calculat...\n units: celcius\n date_created: Jun-09-2023xarray.DataArray'analysed_sst'time: 120.53array([20.52885965])Coordinates: (1)time(time)datetime64[ns]2022-12-01T09:00:00array(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (3)description :Area-weighted global mean sea surface temperature calculated using AWS Lambdaunits :celciusdate_created :Jun-09-2023" }, { - "objectID": "notebooks/podaac_cmr_tutorial.html", - "href": "notebooks/podaac_cmr_tutorial.html", - "title": "Introduction to Programmatic Common Metadata Repository Search", + "objectID": "notebooks/opendap/MUR-OPeNDAP.html", + "href": "notebooks/opendap/MUR-OPeNDAP.html", + "title": "OPeNDAP Access", "section": "", - "text": "This notebook will introduce you to programmatic Common Metadata Repository (CMR) search in python, using PO.DAAC Data as the example of data we’re interested in. While these tutorials focus on PO.DAAC data, the same strategies and code snippets can be used for other earthdata collections." + "text": "From the PO.DAAC Cookbook, to access the GitHub version of the notebook, follow this link.\n\n\nOPeNDAP Access\n\nNotebook Objectives:\n\nSearch the common metadata repository (CMR) for the MUR dataset\nObtain OPeNDAP links from CMR search\nDownload data from OPeNDAP links and open via xarray to visualize data\n\n\n#https://ghrc.nsstc.nasa.gov/opendap/globalir/data/2020/0525/globir.20146.0000\nfrom netCDF4 import Dataset\nimport xarray as xr\nimport dask\nimport os\nimport requests\nimport earthaccess\n\n#Allows us to visualize the dask progress for parallel operations\nfrom dask.diagnostics import ProgressBar\nProgressBar().register()\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nRequest link for OPeNDAP\n\n#CMR Link to use\n#https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=C1625128926-GHRC_CLOUD&temporal=2019-01-01T10:00:00Z,2019-12-31T23:59:59Z\nr = requests.get('https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=C1996881146-POCLOUD&temporal=2019-01-01T10:00:00Z,2019-02-01T00:00:00Z&pageSize=365')\nresponse_body = r.json()\n\n\nod_files = []\nfor itm in response_body['items']:\n for urls in itm['umm']['RelatedUrls']:\n if 'OPeNDAP' in urls['Description']:\n od_files.append(urls['URL'])\n\nod_files\n \n\n['https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190103090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190104090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190105090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190106090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190107090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190108090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190109090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190110090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190111090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190112090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190113090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190114090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190116090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190117090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190118090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190119090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190120090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190121090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190122090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190123090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190124090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190125090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190126090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190127090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190128090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190129090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190130090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190131090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190201090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1']\n\n\n\nlen(od_files)\n\n32\n\n\n\nfor f in od_files:\n print (\" opening \" + f)\n data_url = f'{f}.dap.nc4'\n \n \n # The notation below is [start index, step, end index]\n # lat[ /lat= 0..17998] start index. = -90\n # lon[ /lon= 0..35999] start index. = -180\n # time[ /time= 0..0] \n required_variables = {'analysed_sst[0:1:0][000:1:9000][000:1:9000]',\n 'analysis_error[0:1:0][000:1:9000][000:1:9000]',\n 'lat[000:1:9000]',\n 'lon[000:1:9000]',\n 'time[0:1:0]'}\n\n #upper latitude, left longitude, lower latitude, right longitude\n\n basename = os.path.basename(data_url)\n request_params = {'dap4.ce': ';'.join(required_variables)}\n #identity encoding to work around an issue with server side response compression (??)\n response = requests.get(data_url, params=request_params, headers={'Accept-Encoding': 'identity'})\n\n if response.ok:\n with open(basename, 'wb') as file_handler:\n file_handler.write(response.content)\n else:\n print(f'Request failed: {response.text}')\n\n\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190103090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190104090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190105090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190106090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190107090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190108090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190109090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190110090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190111090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190112090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190113090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190114090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190116090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190117090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190118090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190119090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190120090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190121090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190122090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190123090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190124090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190125090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190126090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190127090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190128090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190129090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190130090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190131090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190201090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n\n\n\nimport xarray as xr\ncloud_data = xr.open_mfdataset('*.dap.nc4', engine='h5netcdf')\n\n\ncloud_data\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 32, lat: 9001, lon: 9001)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... -0.01 0.0 0.01\n * lon (lon) float32 -180.0 -180.0 -180.0 ... -90.01 -90.0 -89.99\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-02-01T...\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>\nAttributes: (12/48)\n Conventions: CF-1.5\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: grid\n history_json: [{\"$schema\":\"https:\\/\\/harmony.earthdata.nasa...xarray.DatasetDimensions:time: 32lat: 9001lon: 9001Coordinates: (3)lat(lat)float32-89.99 -89.98 -89.97 ... 0.0 0.01long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :noneorigname :latfullnamepath :/latarray([-8.999e+01, -8.998e+01, -8.997e+01, ..., -1.000e-02, 0.000e+00,\n 1.000e-02], dtype=float32)lon(lon)float32-180.0 -180.0 ... -90.0 -89.99long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :noneorigname :lonfullnamepath :/lonarray([-179.99, -179.98, -179.97, ..., -90.01, -90. , -89.99],\n dtype=float32)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-02-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsorigname :timefullnamepath :/timearray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000',\n '2019-01-11T09:00:00.000000000', '2019-01-12T09:00:00.000000000',\n '2019-01-13T09:00:00.000000000', '2019-01-14T09:00:00.000000000',\n '2019-01-15T09:00:00.000000000', '2019-01-16T09:00:00.000000000',\n '2019-01-17T09:00:00.000000000', '2019-01-18T09:00:00.000000000',\n '2019-01-19T09:00:00.000000000', '2019-01-20T09:00:00.000000000',\n '2019-01-21T09:00:00.000000000', '2019-01-22T09:00:00.000000000',\n '2019-01-23T09:00:00.000000000', '2019-01-24T09:00:00.000000000',\n '2019-01-25T09:00:00.000000000', '2019-01-26T09:00:00.000000000',\n '2019-01-27T09:00:00.000000000', '2019-01-28T09:00:00.000000000',\n '2019-01-29T09:00:00.000000000', '2019-01-30T09:00:00.000000000',\n '2019-01-31T09:00:00.000000000', '2019-02-01T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAForigname :analysed_sstfullnamepath :/analysed_sst\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.66 GiB\n4.00 MiB\n\n\nShape\n(32, 9001, 9001)\n(1, 1024, 1024)\n\n\nDask graph\n2592 chunks in 65 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 9001 9001 32\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :noneorigname :analysis_errorfullnamepath :/analysis_error\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.66 GiB\n4.00 MiB\n\n\nShape\n(32, 9001, 9001)\n(1, 1024, 1024)\n\n\nDask graph\n2592 chunks in 65 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 9001 9001 32\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Float64Index([ -89.98999786376953, -89.9800033569336,\n -89.97000122070312, -89.95999908447266,\n -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531,\n -89.91000366210938, -89.9000015258789,\n ...\n -0.07999999821186066, -0.07000000029802322,\n -0.05999999865889549, -0.05000000074505806,\n -0.03999999910593033, -0.029999999329447746,\n -0.019999999552965164, -0.009999999776482582,\n 0.0, 0.009999999776482582],\n dtype='float64', name='lat', length=9001))lonPandasIndexPandasIndex(Float64Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n -90.08000183105469, -90.06999969482422, -90.05999755859375,\n -90.05000305175781, -90.04000091552734, -90.02999877929688,\n -90.0199966430664, -90.01000213623047, -90.0,\n -89.98999786376953],\n dtype='float64', name='lon', length=9001))timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00',\n '2019-01-11 09:00:00', '2019-01-12 09:00:00',\n '2019-01-13 09:00:00', '2019-01-14 09:00:00',\n '2019-01-15 09:00:00', '2019-01-16 09:00:00',\n '2019-01-17 09:00:00', '2019-01-18 09:00:00',\n '2019-01-19 09:00:00', '2019-01-20 09:00:00',\n '2019-01-21 09:00:00', '2019-01-22 09:00:00',\n '2019-01-23 09:00:00', '2019-01-24 09:00:00',\n '2019-01-25 09:00:00', '2019-01-26 09:00:00',\n '2019-01-27 09:00:00', '2019-01-28 09:00:00',\n '2019-01-29 09:00:00', '2019-01-30 09:00:00',\n '2019-01-31 09:00:00', '2019-02-01 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (48)Conventions :CF-1.5title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.\n2024-03-12 23:18:44 GMT hyrax-1.17.0-3 https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.dap.nc4?dap4.ce=analysed_sst%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blon%5B000%3A1%3A9000%5D%3Btime%5B0%3A1%3A0%5D%3Banalysis_error%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blat%5B000%3A1%3A9000%5D\ncomment :MUR = \\\"Multi-scale Ultra-high Reolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20190110T004403Zstart_time :20190101T090000Zstop_time :20190101T090000Ztime_coverage_start :20181231T210000Ztime_coverage_end :20190101T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, NOAA-19, MetOp-A, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01 degreesgeospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01 degreesacknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :gridhistory_json :[{\"$schema\":\"https:\\/\\/harmony.earthdata.nasa.gov\\/schemas\\/history\\/0.1.0\\/history-0.1.0.json\",\"date_time\":\"2024-03-12T23:18:44.042+0000\",\"program\":\"hyrax\",\"version\":\"1.17.0-3\",\"parameters\":[{\"request_url\":\"https:\\/\\/opendap.earthdata.nasa.gov\\/providers\\/POCLOUD\\/collections\\/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)\\/granules\\/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.dap.nc4?dap4.ce=analysed_sst%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blon%5B000%3A1%3A9000%5D%3Btime%5B0%3A1%3A0%5D%3Banalysis_error%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blat%5B000%3A1%3A9000%5D\"},{\"decoded_constraint\":\"dap4.ce=analysed_sst[0:1:0][000:1:9000][000:1:9000];lon[000:1:9000];time[0:1:0];analysis_error[0:1:0][000:1:9000][000:1:9000];lat[000:1:9000]\"}]}]\n\n\n\n#Histogram\ncloud_data['analysed_sst'].plot()\n\n\n# Choose one time segment, plot the data\ncloud_data['analysed_sst'].isel(time=4).plot()\n\n\n#Plot a single point over time\ncloud_data['analysed_sst'].isel(lat=7000, lon=7000).plot()", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "GHRSST", + "OPeNDAP Access" + ] }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#api-documentation", - "href": "notebooks/podaac_cmr_tutorial.html#api-documentation", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "API Documentation", - "text": "API Documentation\nThis tutorial is not meant to be a replacement for the official CMR documentation. Its features are well documented and that should be the first place to go for information. It can be found at https://cmr.earthdata.nasa.gov/search. Some users may find it easier to navigate the Earthdata Search interface, find data of interest, and then automate the results using scripts. We’d suggest visiting https://search.earthdata.nasa.gov/" + "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#cloud-level-2-subsetter-l2ss-api", + "href": "notebooks/Cloud L2SS subset and plot - JH.html#cloud-level-2-subsetter-l2ss-api", + "title": "This Notebook is no longer supported, a newer version exists here.", + "section": "Cloud Level 2 Subsetter (L2SS) API", + "text": "Cloud Level 2 Subsetter (L2SS) API\nThis will demonstrate how to subset swath/L2 data with the data and services hosted on the cloud." }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#cmr-background-information", - "href": "notebooks/podaac_cmr_tutorial.html#cmr-background-information", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "CMR Background information", - "text": "CMR Background information\nCMR houses metadata for the 12 different DAACs. These come in the following forms:\n\nCollections\nGranules\nVariables\nServices\nVisualizations\nTools\n\nThis tutorial will focus on Collections and Granules. for more information, see the https://earthdata.nasa.gov/learn/user-resources/glossary" + "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#before-beginning", + "href": "notebooks/Cloud L2SS subset and plot - JH.html#before-beginning", + "title": "This Notebook is no longer supported, a newer version exists here.", + "section": "Before Beginning", + "text": "Before Beginning\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nLearning Objective:\n\nSubset a specific file/granule that has already been found using the podaac L2 subsetter\n\n\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nfrom IPython.display import display, JSON\nimport tempfile\nimport shutil\nimport xarray as xr\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.axes_grid1 import make_axes_locatable\nfrom pandas.plotting import register_matplotlib_converters\nimport numpy as np" }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#collection-dataset-series", - "href": "notebooks/podaac_cmr_tutorial.html#collection-dataset-series", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "Collection / Dataset Series", - "text": "Collection / Dataset Series\nCollection of datasets sharing the same product specification. They are synonym of EO collections. They are named dataset series as they may be mapped to ‘dataset series’ according to the terminology defined in ISO 19113, ISO 19114 and ISO 19115." + "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#subset-of-a-po.daac-granule", + "href": "notebooks/Cloud L2SS subset and plot - JH.html#subset-of-a-po.daac-granule", + "title": "This Notebook is no longer supported, a newer version exists here.", + "section": "Subset of a PO.DAAC Granule", + "text": "Subset of a PO.DAAC Granule\nWe build onto the root URL in order to actually perform a transformation. The first transformation is a subset of a selected granule. At this time, this requires discovering the granule id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nNotes: The L2 subsetter current streams the data back to the user, and does not stage data in S3 for redirects. This is functionality we will be adding over time.\nCreate a Harmony-py client\n\nharmony_client = Client(env=Environment.PROD)\n\nWith the client created, we can contruct and validate the request. As this is a subsetting + concatenation request, we specify options on the request that define spatial bounds, variables we are interested in, temporal bounds, and indicated the result should be concatenated.\n\ncollection = Collection(id='C1940471193-POCLOUD') #Jason-1 GDR SSHA version E NetCDF\n\nrequest = Request(\n collection=collection,\n spatial=BBox(0,0,1,1), # 1 degree box\n granule_id='G1969371708-POCLOUD' #JA1_GPR_2PeP374_173_20120303_121639_20120303_125911.nc\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\njob_id = harmony_client.submit(request)\nprint(f'Job ID: {job_id}')\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=0c2f471216e220fc8ef81d7f18a5ddfb' -H 'User-Agent: Windows/10 CPython/3.8.12 harmony-py/0.4.2 python-requests/2.25.1' 'https://harmony.earthdata.nasa.gov/C1940471193-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%280%3A1%29&subset=lon%280%3A1%29&granuleId=G1969371708-POCLOUD'\nJob ID: 8fad49e8-c95f-4a98-8e99-d5b053d86de7\n\n\n\nprint(harmony_client.status(job_id))\n\nprint('\\nWaiting for the job to finish')\nresults = harmony_client.result_json(job_id, show_progress=True)\n\n{'status': 'running', 'message': 'The job is being processed', 'progress': 0, 'created_at': datetime.datetime(2022, 10, 25, 17, 5, 0, 76000, tzinfo=tzutc()), 'updated_at': datetime.datetime(2022, 10, 25, 17, 5, 0, 438000, tzinfo=tzutc()), 'created_at_local': '2022-10-25T10:05:00-07:00', 'updated_at_local': '2022-10-25T10:05:00-07:00', 'data_expiration': datetime.datetime(2022, 11, 24, 17, 5, 0, 76000, tzinfo=tzutc()), 'data_expiration_local': '2022-11-24T09:05:00-08:00', 'request': 'https://harmony.earthdata.nasa.gov/C1940471193-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat(0%3A1)&subset=lon(0%3A1)&granuleId=G1969371708-POCLOUD', 'num_input_granules': 1}\n\nWaiting for the job to finish\n\n\n [ Processing: 0% ] | | [|]\n\n\n\n---------------------------------------------------------------------------\nTimeoutError Traceback (most recent call last)\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 698 # Make the request on the httplib connection object.\n--> 699 httplib_response = self._make_request(\n 700 conn,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 444 # Otherwise it looks like a bug in the code.\n--> 445 six.raise_from(e, None)\n 446 except (SocketTimeout, BaseSSLError, SocketError) as e:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in raise_from(value, from_value)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 439 try:\n--> 440 httplib_response = conn.getresponse()\n 441 except BaseException as e:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in getresponse(self)\n 1347 try:\n-> 1348 response.begin()\n 1349 except ConnectionError:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in begin(self)\n 315 while True:\n--> 316 version, status, reason = self._read_status()\n 317 if status != CONTINUE:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in _read_status(self)\n 276 def _read_status(self):\n--> 277 line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n 278 if len(line) > _MAXLINE:\n\n~\\Anaconda3\\envs\\main\\lib\\socket.py in readinto(self, b)\n 668 try:\n--> 669 return self._sock.recv_into(b)\n 670 except timeout:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in recv_into(self, buffer, nbytes, flags)\n 1240 self.__class__)\n-> 1241 return self.read(nbytes, buffer)\n 1242 else:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in read(self, len, buffer)\n 1098 if buffer is not None:\n-> 1099 return self._sslobj.read(len, buffer)\n 1100 else:\n\nTimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond\n\nDuring handling of the above exception, another exception occurred:\n\nProtocolError Traceback (most recent call last)\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)\n 438 if not chunked:\n--> 439 resp = conn.urlopen(\n 440 method=request.method,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 754 \n--> 755 retries = retries.increment(\n 756 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\util\\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)\n 531 if read is False or not self._is_method_retryable(method):\n--> 532 raise six.reraise(type(error), error, _stacktrace)\n 533 elif read is not None:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in reraise(tp, value, tb)\n 768 if value.__traceback__ is not tb:\n--> 769 raise value.with_traceback(tb)\n 770 raise value\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 698 # Make the request on the httplib connection object.\n--> 699 httplib_response = self._make_request(\n 700 conn,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 444 # Otherwise it looks like a bug in the code.\n--> 445 six.raise_from(e, None)\n 446 except (SocketTimeout, BaseSSLError, SocketError) as e:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in raise_from(value, from_value)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 439 try:\n--> 440 httplib_response = conn.getresponse()\n 441 except BaseException as e:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in getresponse(self)\n 1347 try:\n-> 1348 response.begin()\n 1349 except ConnectionError:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in begin(self)\n 315 while True:\n--> 316 version, status, reason = self._read_status()\n 317 if status != CONTINUE:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in _read_status(self)\n 276 def _read_status(self):\n--> 277 line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n 278 if len(line) > _MAXLINE:\n\n~\\Anaconda3\\envs\\main\\lib\\socket.py in readinto(self, b)\n 668 try:\n--> 669 return self._sock.recv_into(b)\n 670 except timeout:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in recv_into(self, buffer, nbytes, flags)\n 1240 self.__class__)\n-> 1241 return self.read(nbytes, buffer)\n 1242 else:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in read(self, len, buffer)\n 1098 if buffer is not None:\n-> 1099 return self._sslobj.read(len, buffer)\n 1100 else:\n\nProtocolError: ('Connection aborted.', TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None))\n\nDuring handling of the above exception, another exception occurred:\n\nConnectionError Traceback (most recent call last)\n~\\AppData\\Local\\Temp/ipykernel_32124/2696161432.py in <module>\n 2 \n 3 print('\\nWaiting for the job to finish')\n----> 4 results = harmony_client.result_json(job_id, show_progress=True)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in result_json(self, job_id, show_progress, link_type)\n 834 \"\"\"\n 835 try:\n--> 836 self.wait_for_processing(job_id, show_progress)\n 837 except ProcessingFailedException:\n 838 pass\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in wait_for_processing(self, job_id, show_progress)\n 781 progress = 0\n 782 while progress < 100:\n--> 783 progress, status, message = self.progress(job_id)\n 784 if status == 'failed':\n 785 raise ProcessingFailedException(job_id, message)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in progress(self, job_id)\n 751 \"\"\"\n 752 session = self._session()\n--> 753 response = session.get(self._status_url(job_id))\n 754 if response.ok:\n 755 json = response.json()\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in get(self, url, **kwargs)\n 553 \n 554 kwargs.setdefault('allow_redirects', True)\n--> 555 return self.request('GET', url, **kwargs)\n 556 \n 557 def options(self, url, **kwargs):\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\n 540 }\n 541 send_kwargs.update(settings)\n--> 542 resp = self.send(prep, **send_kwargs)\n 543 \n 544 return resp\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in send(self, request, **kwargs)\n 653 \n 654 # Send the request\n--> 655 r = adapter.send(request, **kwargs)\n 656 \n 657 # Total elapsed time of the request (approximately)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)\n 496 \n 497 except (ProtocolError, socket.error) as err:\n--> 498 raise ConnectionError(err, request=request)\n 499 \n 500 except MaxRetryError as e:\n\nConnectionError: ('Connection aborted.', TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None))\n\n\n\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n\nds = xr.open_dataset(file_names[0])\nds\n\n\nds.ssha.plot()" }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#granule", - "href": "notebooks/podaac_cmr_tutorial.html#granule", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "Granule", - "text": "Granule\nThe smallest aggregation of data which is independently managed (i. e. described, inventoried, retrievable). Granules may be managed as logical granules and/or physical granules. See also Scene.\nNote that granule is often equivalent to Data Set." + "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#verify-the-subsetting-worked", + "href": "notebooks/Cloud L2SS subset and plot - JH.html#verify-the-subsetting-worked", + "title": "This Notebook is no longer supported, a newer version exists here.", + "section": "Verify the subsetting worked", + "text": "Verify the subsetting worked\nBounds are defined earlier\n\nlat_max = ds.lat.max()\nlat_min = ds.lat.min()\n\nlon_min = ds.lon.min()\nlon_max = ds.lon.max()\n\n\nif lat_max < bblat_max and lat_min > bblat_min:\n print(\"Successful Latitude subsetting\")\nelse:\n assert false\n\n \nif lon_max < bblon_max and lon_min > bblon_min:\n print(\"Successful Longitude subsetting\")\nelse:\n assert false" }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#data-set", - "href": "notebooks/podaac_cmr_tutorial.html#data-set", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "Data Set", - "text": "Data Set\nA logically meaningful grouping or collection of similar or related data. Data having all of the same characteristics (source or class of source, processing level, resolution, etc.) but different independent variable ranges and/or responding to a specific need are normally considered part of a single data set. A data set is typically composed by products from several missions, gathered together to respond to the overall coverage or revisit requirements from a specific group of users.\nIn the context of EO data preservation a data set consists of the data records of one mission, sensor, and product type and the associated knowledge(information, tools). See collection." + "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#plot-swath-onto-a-map", + "href": "notebooks/Cloud L2SS subset and plot - JH.html#plot-swath-onto-a-map", + "title": "This Notebook is no longer supported, a newer version exists here.", + "section": "Plot swath onto a map", + "text": "Plot swath onto a map\n\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\n\nplt.scatter(ds.lon, ds.lat, lw=2, c=ds.ssha)\nplt.colorbar()\nplt.clim(-0.3, 0.3)\n\nplt.show()" }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#what-does-all-of-this-mean", - "href": "notebooks/podaac_cmr_tutorial.html#what-does-all-of-this-mean", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "What does all of this mean?", - "text": "What does all of this mean?\nFor the most part, users want to discover collections of interest to them, usually defined by parameter (Sea Surface Temperature, Ocean Winds, Sea Surface Height, etc), Level, spatial and temporal coverage, etc. Lets show an example." + "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-concise", + "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-concise", + "title": "Harmony Concise + L2SS-Py Demo", + "section": "What is Concise?", + "text": "What is Concise?\nConcise is a Harmony service developed by PODAAC that allows users to concatenate multiple L2 granules together into a single granule. This concatenation is done by adding a new subset_index dimension to the resulting granule." }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#find-collections-by-parameter", - "href": "notebooks/podaac_cmr_tutorial.html#find-collections-by-parameter", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "Find collections by parameter", - "text": "Find collections by parameter\n\nfrom urllib import request\nimport json\nimport pprint\n\ncmr_url = \"https://cmr.earthdata.nasa.gov/search/\"\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\nThere’s a lot going on here. First off, the url:\nhttps://cmr.earthdata.nasa.gov/search/collections.umm_json?science_keywords[0][topic]=OCEANS\nThe basic premise is this: We are asking for all collections (../search/collections) that fall under the ‘OCEANS’ science topic as defined by GCMD. We are requesting this in the umm_json format (.umm_json). What we get back is a listing of those collections matching this. When last run, this was over 10900 collections! that’s a lot. Let’s get that down a bit…\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS&science_keywords[0][term]=Ocean%20Temperature&has_granules_or_cwic=true&page_size=50\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\nHere we’re now limiting the search to those with the Oceans topic as well as the ‘Ocean Temperature’ term. To limit this further, we are only searching for collections that contain granules (data). We do this by specifying\nhas_granules_or_cwic=true\nSo we are closing in on this. Let’s add a time range and find some PO.DAAC data:\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS&science_keywords[0][term]=Ocean%20Temperature&has_granules_or_cwic=true&temporal=2018-01-01T10:00:00Z,2019-01-01T10:00:00Z&provider_short_name=PODAAC&processing_level_id=4&page_size=50\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\n{ 'hits': 29,\n 'items': [ { 'meta': { 'concept-id': 'C1658476070-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+RAMSSA+Australian+Regional+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:28Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Australian '\n 'Bureau of Meteorology using optimal '\n 'interpolation (OI) on a regional 1/12 '\n 'degree grid over the Australian region '\n '(20N - 70S, 60E - 170W). This BLUELink '\n 'Regional Australian Multi-Sensor SST '\n 'Analysis (RAMSSA) v1.0 system blends '\n 'satellite SST observations from the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Advanced Along Track '\n 'Scanning Radiometer (AATSR), and, the '\n 'Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSRE), and in situ data '\n 'from ships, and drifting and moored buoy '\n 'from the Global Telecommunications System '\n '(GTS). The processing results in daily '\n 'foundation SST estimates that are largely '\n 'free of nocturnal cooling and diurnal '\n 'warming effects.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2008-01-24, '\n 'GHRSST '\n 'Level '\n '4 '\n 'RAMSSA '\n 'Australian '\n 'Regional '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHRAM-4FA01, '\n 'http://www.bom.gov.au/jshess/docs/2011/beggs_hres.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHRAM-4FA01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2008-01-29T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 RAMSSA Australian '\n 'Regional Foundation Sea Surface '\n 'Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'OCEANIA'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:25.914Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/AUS/ABOM/RAMSSA_09km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/AUS/ABOM/RAMSSA_09km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHRAM-4FA01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHRAM-4FA01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/AUS/ABOM/RAMSSA_09km/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'ABOM-L4HRfnd-AUS-RAMSSA_09km',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': 60.0},\n { 'EastBoundingCoordinate': -170.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657548743-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+GAMSSA+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:51Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Australian '\n 'Bureau of Meteorology using optimal '\n 'interpolation (OI) on a global 0.25 '\n 'degree grid. This BLUELink Global '\n 'Australian Multi-Sensor SST Analysis '\n '(GAMSSA) v1.0 system blends satellite SST '\n 'observations from the Advanced Very High '\n 'Resolution Radiometer (AVHRR), the '\n 'Advanced Along Track Scanning Radiometer '\n '(AATSR), and, the Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), and in '\n 'situ data from ships, and drifting and '\n 'moored buoy from the Global '\n 'Telecommunications System (GTS). In order '\n 'to produce a foundation SST estimate, the '\n 'AATSR skin SST data stream is converted '\n 'to foundation SST using the Donlon et al. '\n '(2002) skin to foundation temperature '\n 'conversion algorithms. These '\n 'empirically-derived algorithms apply a '\n 'small correction for the cool-skin effect '\n 'depending on surface wind speed, and '\n 'filter out SST values suspected to be '\n 'affected by diurnal warming by excluding '\n 'cases which have experienced recent '\n 'surface wind speeds of below 6 ms-1 '\n 'during the day and less than 2 ms-1 '\n 'during the night.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2008-07-28, '\n 'GHRSST '\n 'Level '\n '4 '\n 'GAMSSA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHGAM-4FA01, '\n 'http://www.bom.gov.au/australia/charts/bulletins/apob77.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGAM-4FA01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2008-08-01T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 GAMSSA Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:49.385Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/ABOM/GAMSSA_28km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/ABOM/GAMSSA_28km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access to the data '\n 'through OpenDAP '\n 'protocol',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'http://opendap.bom.gov.au:8080/thredds/catalog',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGAM-4FA01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_ABOM-L4LRfnd-GLOB-GAMSSA_28km.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGAM-4FA01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/ABOM/GAMSSA_28km/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'ABOM-L4LRfnd-GLOB-GAMSSA_28km',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-08-24T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1652971997-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+AVHRR_OI+Global+Blended+Sea+Surface+Temperature+Analysis+(GDS+version+2)+from+NCEI',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:02Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.25 degree grid at the NOAA '\n 'National Centers for Environmental '\n 'Information. This product uses optimal '\n 'interpolation (OI) by interpolating and '\n 'extrapolating SST observations from '\n 'different sources, resulting in a '\n 'smoothed complete field. The sources of '\n 'data are satellite (AVHRR) and in situ '\n 'platforms (i.e., ships and buoys), and '\n 'the specific datasets employed may change '\n 'over. At the marginal ice zone, sea ice '\n 'concentrations are used to generate proxy '\n 'SSTs. A preliminary version of this file '\n 'is produced in near-real time (1-day '\n 'latency), and then replaced with a final '\n 'version after 2 weeks. Note that this is '\n 'the AVHRR-ONLY (AVHRR-OI), available from '\n 'September 1, 1981, but there is a '\n 'companion SST product that includes '\n 'microwave satellite data, available from '\n 'June 2002.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information, '\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information, '\n '2016-04-20, '\n 'GHRSST '\n 'Level '\n '4 '\n 'AVHRR_OI '\n 'Global '\n 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2) '\n 'from '\n 'NCEI, '\n '10.5067/GHAAO-4BC02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHAAO-4BC02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1-828-271-4302'},\n { 'Type': 'Email',\n 'Value': 'Richard.W.Reynolds@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Richard',\n 'LastName': 'Reynolds',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2015-12-28T17:28:56.110Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 AVHRR_OI Global Blended '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2) from NCEI',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:10:59.809Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Journal publication',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/papers/daily-sst.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=AVHRR_OI-NCEI-L4-GLOB-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'Homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=5&t=219',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHAAO-4BC02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Daily 1/4 Degree '\n 'Optimum '\n 'Interpolation Sea '\n 'Surface Temperature '\n '(OISST)- Climate '\n 'Algorithm '\n 'Theoretical '\n 'Theoretical Basis '\n 'Document, NOAA '\n 'Climate Data Record '\n 'Program '\n 'CDRP-ATBD-0303 Rev. '\n '2 (2013)',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www1.ncdc.noaa.gov/pub/data/sds/cdr/CDRs/Sea_Surface_Temperature_Optimum_Interpolation/AlgorithmDescription.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Web site with '\n 'general description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/description.php',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Viva Banzon, Thomas '\n 'M. Smith, Toshio '\n 'Mike Chin, Chunying '\n 'Liu, and William '\n 'Hankins, A '\n 'long-term record of '\n 'blended satellite '\n 'and in situ '\n 'sea-surface '\n 'temperature for '\n 'climate monitoring, '\n 'modeling and '\n 'environmental '\n 'studies, Earth '\n 'Syst. Sci. Data, 8, '\n '165-176, 2016',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.earth-syst-sci-data.net/8/165/2016/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Reynolds, et '\n 'al.(2009)',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/sites/default/files/attachments/Reynolds2009_oisst_daily_v02r00_version2-features.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHAAO-4BC02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'AVHRR_OI-NCEI-L4-GLOB-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-09-01T00:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1652972273-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+CMC0.1deg+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:06Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature (SST) analysis produced daily '\n 'on an operational basis at the Canadian '\n 'Meteorological Center. This dataset '\n 'merges infrared satellite SST at varying '\n 'points in the time series from the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) from NOAA-18,19, the European '\n 'Meteorological Operational-A (METOP-A) '\n 'and Operational-B (METOP-B), and '\n 'microwave data from the Advanced '\n 'Microwave Scanning Radiometer 2 (AMSR2) '\n 'onboard the GCOM-W satellite in '\n 'conjunction with in situ observations of '\n 'SST from drifting buoys and ships from '\n 'the ICOADS program. It uses the previous '\n 'days analysis as the background field for '\n 'the statistical interpolation used to '\n 'assimilate the satellite and in situ '\n 'observations. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Canada '\n 'Meteorological '\n 'Center, '\n 'Canada '\n 'Meteorological '\n 'Center, '\n '2016-07-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'CMC0.1deg '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHCMC-4FM03, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHCMC-4FM03'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'CMC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '514-421-5002'},\n { 'Type': 'Email',\n 'Value': 'dorina.surcel-colan@canada.ca'}]},\n 'ContactPersons': [ { 'FirstName': 'Dorina',\n 'LastName': 'Colan',\n 'MiddleName': 'Surcel',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Canada Meteorological '\n 'Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2015-12-21T18:32:39.515Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 CMC0.1deg Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis (GDS version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:03.941Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/CMC/CMC0.1deg/v3',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/CMC/CMC0.1deg/v3',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=7',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Previous version '\n '(v2.0) with 0.2 '\n 'degree spatial '\n 'resolution starting '\n 'from Sept 1, 1991',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac.jpl.nasa.gov/dataset/CMC0.2deg-CMC-L4-GLOB-v2.0',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Sensitivity of '\n 'Ocean Surface '\n 'Salinity '\n 'Measurements From '\n 'Spaceborne L-Band '\n 'Radiometers to '\n 'Ancillary Sea '\n 'Surface Temperature',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/document/7547916/',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=CMC0.1deg-CMC-L4-GLOB-v3.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHCMC-4FM03',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHCMC-4FM03',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/CMC/CMC0.1deg/v3/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'CMC0.1deg-CMC-L4-GLOB-v3.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2016-01-01T00:00:00.000Z'}]}],\n 'Version': '3.0'}},\n { 'meta': { 'concept-id': 'C1653649473-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+DMI_OI+Global+Foundation+Sea+Surface+Temperature+Analysis++(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T19:03:13Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis by the Danish '\n 'Meteorological Institute (DMI) using an '\n 'optimal interpolation (OI) approach on a '\n 'global 0.05 degree grid. The analysis is '\n 'based upon nighttime GHRSST L2P skin and '\n 'subskin SST observations from several '\n 'satellites. The sensors include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Spinning Enhanced Visible '\n 'and Infrared Imager (SEVIRI), the '\n 'Advanced Microwave Scanning Radiometer 2 '\n '(AMSR2), the Visible Infrared Imager '\n 'Radiometer Suite (VIIRS), and the '\n 'Moderate Resolution Imaging '\n 'Spectroradiometer (MODIS) on Aqua. An ice '\n 'field from the EUMETSAT OSI-SAF is used '\n 'to mask out areas with ice. This dataset '\n 'adheres to the version 2 GHRSST Data '\n 'Processing Specification (GDS).',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'DMI, '\n 'Center '\n 'for '\n 'Ocean '\n 'and '\n 'Ice, '\n '2007-09-08, '\n 'GHRSST '\n 'Level '\n '4 '\n 'DMI_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGDM-4FD02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGDM-4FD02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Danish Meteorological '\n 'Institute'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+45-39157203'},\n { 'Type': 'Email',\n 'Value': 'jlh@dmi.dk'}]},\n 'ContactPersons': [ { 'FirstName': 'Jacob',\n 'LastName': 'Hoeyer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Danish Meteorological '\n 'Institute, Center for '\n 'Ocean and Ice'}],\n 'DataDates': [ { 'Date': '2013-02-14T00:57:45.743Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 DMI_OI Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T19:03:11.255Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/DMI/DMI_OI/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/DMI/DMI_OI/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=DMI_OI-DMI-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGDM-4FD02&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'OSI SAF homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.osi-saf.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'user services',\n 'Type': 'USE SERVICE API',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGDM-4FD02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/DMI/DMI_OI/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'DMI_OI-DMI-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2013-04-30T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1653205971-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+GAMSSA_28km+Global+Foundation+Sea+Surface+Temperature+Analysis+v1.0+dataset+(GDS2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T16:08:53Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis, produced daily on '\n 'an operational basis at the Australian '\n 'Bureau of Meteorology (BoM) using optimal '\n 'interpolation (OI) on a global 0.25 '\n 'degree grid. This Global Australian '\n 'Multi-Sensor SST Analysis (GAMSSA) v1.0 '\n 'system blends satellite SST observations '\n 'from passive infrared and passive '\n 'microwave radiometers with in situ data '\n 'from ships, drifting buoys and moorings '\n 'from the Global Telecommunications System '\n '(GTS). SST observations that have '\n 'experienced recent surface wind speeds '\n 'less than 6 m/s during the day or less '\n 'than 2 m/s during night are rejected from '\n 'the analysis. The processing results in '\n 'daily foundation SST estimates that are '\n 'largely free of nocturnal cooling and '\n 'diurnal warming effects. Sea ice '\n 'concentrations are supplied by the '\n 'NOAA/NCEP 12.7 km sea ice analysis. In '\n 'the absence of observations, the analysis '\n 'relaxes to the Reynolds and Smith (1994) '\n 'Monthly 1 degree SST climatology for 1961 '\n '- 1990.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF '\n '4.3',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2019-09-18, '\n 'GHRSST '\n 'Level '\n '4 '\n 'GAMSSA_28km '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n 'v1.0 '\n 'dataset '\n '(GDS2), '\n '10.5067/GHGAM-4FA1A, '\n 'http://www.bom.gov.au/australia/charts/bulletins/apob77.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGAM-4FA1A'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2019-08-23T23:59:16.644Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-08-23T23:59:16.644Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 GAMSSA_28km Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis v1.0 dataset (GDS2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T16:08:50.647Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/ABOM/GAMSSA/v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGAM-4FA1A',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=GAMSSA_28km-ABOM-L4-GLOB-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGAM-4FA1A',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/ABOM/GAMSSA/v1.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'GAMSSA_28km-ABOM-L4-GLOB-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-07-23T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657544973-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSPO+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:28Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Office of '\n 'Satellite and Product Operations (OSPO) '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. \\n'\n 'The Geo-Polar Blended Sea Surface '\n 'Temperature (SST) Analysis combines '\n 'multi-satellite retrievals of sea surface '\n 'temperature into a single analysis of '\n 'SST. This analysis uses both daytime and '\n 'nighttime data from sensors that include '\n 'the Advanced Very High Resolution '\n 'Radiometer (AVHRR), the Visible Infrared '\n 'Imager Radiometer Suite (VIIRS), the '\n 'Geostationary Operational Environmental '\n 'Satellite (GOES) imager, the Japanese '\n 'Advanced Meteorological Imager (JAMI) and '\n 'in situ data from ships, drifting and '\n 'moored buoys. This analysis was '\n 'specifically produced to be used as a '\n 'lower boundary condition in Numerical '\n 'Weather Prediction (NWP) models. This '\n 'dataset adheres to the GHRSST Data '\n 'Processing Specification (GDS) version 2 '\n 'format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Office '\n 'of '\n 'Satellite '\n 'Products '\n 'and '\n 'Operations, '\n 'The '\n 'GHRSST '\n 'Project '\n 'Office, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSPO '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGPB-4FO02, '\n 'www.osdpd.nesdis.noaa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGPB-4FO02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'OSPO'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-763-8102'},\n { 'Type': 'Email',\n 'Value': 'Eileen.maturi@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Eileen',\n 'LastName': 'Maturi',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA Office of '\n 'Satellite and Product '\n 'Operations'}],\n 'DataDates': [ { 'Date': '2014-08-05T02:38:36.840Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSPO Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:25.672Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Himawari '\n 'Imager',\n 'ShortName': 'AHI'}],\n 'LongName': 'Himawari Meteorological '\n 'Satellites',\n 'ShortName': 'Himawari',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-99.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '6000.0'}],\n 'LongName': 'null',\n 'ShortName': 'GOES-15 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '15',\n 'ShortName': 'GOES-15',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat-10',\n 'ShortName': 'METEOSAT-10',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGPB-4FO02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Fieguth, P. '\n 'Multiply-Rooted '\n 'Multiscale Models '\n 'for Large-Scale '\n 'Estimation, IEEE '\n 'Image Processing, '\n '10(11), 1676-1686, '\n '2001',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=967396',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Khellah, F., P.W. '\n 'Fieguth, M.J. '\n 'Murray and M.R. '\n 'Allen, Statistical '\n 'Processing of Large '\n 'Image Sequences, '\n 'IEEE Transactions '\n 'on Geoscience and '\n 'Remote Sensing, 12 '\n '(1), 80-93, 2005',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1369331',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Fieguth,P.W. et al. '\n 'Mapping '\n 'Mediterranean '\n 'altimeter data with '\n 'a multiresolution '\n 'optimal '\n 'interpolation '\n 'algorithm, J. '\n 'Atmos. Ocean Tech, '\n '15 (2): 535-546, '\n '1998',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/full/10.1175/1520-0426%281998%29015%3C0535%3AMMADWA%3E2.0.CO%3B2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=Geo_Polar_Blended-OSPO-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGPB-4FO02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'Geo_Polar_Blended-OSPO-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2014-06-02T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657544629-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSPO+Global+Nighttime+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:24Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Office of '\n 'Satellite and Product Operations (OSPO) '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Geo-Polar '\n 'Blended Sea Surface Temperature (SST) '\n 'Analysis combines multi-satellite '\n 'retrievals of sea surface temperature '\n 'into a single analysis of SST. This '\n 'analysis includes only nighttime data '\n 'from sensors that include the Advanced '\n 'Very High Resolution Radiometer (AVHRR), '\n 'the Visible Infrared Imager Radiometer '\n 'Suite (VIIRS), the Geostationary '\n 'Operational Environmental Satellite '\n '(GOES) imager, the Japanese Advanced '\n 'Meteorological Imager (JAMI) and in situ '\n 'data from ships, drifting and moored '\n 'buoys. This analysis was specifically '\n 'produced to be used as a lower boundary '\n 'condition in Numerical Weather Prediction '\n '(NWP) models. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Office '\n 'of '\n 'Satellite '\n 'Products '\n 'and '\n 'Operations, '\n 'The '\n 'GHRSST '\n 'Project '\n 'Office, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSPO '\n 'Global '\n 'Nighttime '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGPN-4FO02, '\n 'www.osdpd.nesdis.noaa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGPN-4FO02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'OSPO'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-763-8102'},\n { 'Type': 'Email',\n 'Value': 'Eileen.maturi@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Eileen',\n 'LastName': 'Maturi',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA Office of '\n 'Satellite and Product '\n 'Operations'}],\n 'DataDates': [ { 'Date': '2014-08-05T02:44:36.854Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSPO Global Nighttime '\n 'Foundation Sea Surface Temperature '\n 'Analysis (GDS version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:21.342Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Himawari '\n 'Imager',\n 'ShortName': 'AHI'}],\n 'LongName': 'Himawari Meteorological '\n 'Satellites',\n 'ShortName': 'Himawari',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-99.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '6000.0'}],\n 'LongName': 'null',\n 'ShortName': 'GOES-15 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '15',\n 'ShortName': 'GOES-15',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat-10',\n 'ShortName': 'METEOSAT-10',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Khellah, F., P.W. '\n 'Fieguth, M.J. '\n 'Murray and M.R. '\n 'Allen, Statistical '\n 'Processing of Large '\n 'Image Sequences, '\n 'IEEE Transactions '\n 'on Geoscience and '\n 'Remote Sensing, 12 '\n '(1), 80-93, 2005',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1369331',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=Geo_Polar_Blended_Night-OSPO-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Fieguth,P.W. et al. '\n 'Mapping '\n 'Mediterranean '\n 'altimeter data with '\n 'a multiresolution '\n 'optimal '\n 'interpolation '\n 'algorithm, J. '\n 'Atmos. Ocean Tech, '\n '15 (2): 535-546, '\n '1998',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/full/10.1175/1520-0426%281998%29015%3C0535%3AMMADWA%3E2.0.CO%3B2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Fieguth, P. '\n 'Multiply-Rooted '\n 'Multiscale Models '\n 'for Large-Scale '\n 'Estimation, IEEE '\n 'Image Processing, '\n '10(11), 1676-1686, '\n '2001',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=967396',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGPN-4FO02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGPN-4FO02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'Geo_Polar_Blended_Night-OSPO-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2014-06-02T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1650311564-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+G1SST+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-01T16:27:07Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis by the JPL OurOcean '\n 'group using a multi-scale two-dimensional '\n 'variational (MS-2DVAR) blending algorithm '\n 'on a global 0.009 degree grid. This '\n 'Global 1 km SST (G1SST) analysis uses '\n 'satellite data from sensors that include '\n 'the Advanced Very High Resolution '\n 'Radiometer (AVHRR), the Advanced Along '\n 'Track Scanning Radiometer (AATSR), the '\n 'Spinning Enhanced Visible and Infrared '\n 'Imager (SEVIRI), the Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), the '\n 'Tropical Rainfall Measuring Mission '\n 'Microwave Imager (TMI), the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS), the Geostationary Operational '\n 'Environmental Satellite (GOES) Imager, '\n 'the Multi-Functional Transport Satellite '\n '1R (MTSAT-1R) radiometer, and in situ '\n 'data from drifting and moored buoys.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'OurOcean '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2010-06-03, '\n 'GHRSST '\n 'Level '\n '4 '\n 'G1SST '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHG1S-4FP01, '\n 'http://ourocean.jpl.nasa.gov/SST/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHG1S-4FP01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'The OurOcean Team, '\n 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1 '\n '818 '\n '354 '\n '0327'},\n { 'Type': 'Email',\n 'Value': 'benyang.tang@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Benyang',\n 'LastName': 'Tang',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1 '\n '818 '\n '354 '\n '8168'},\n { 'Type': 'Email',\n 'Value': 'yi.chao@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Yi',\n 'LastName': 'Chao',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'}],\n 'DataDates': [ { 'Date': '2010-06-16T06:32:13.049Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 G1SST Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-01T16:27:04.718Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '12000.0'}],\n 'LongName': 'Multifunctional '\n 'Transport '\n 'Satellites '\n '1R '\n 'Imager',\n 'ShortName': 'MTSAT '\n '1R '\n 'Imager'}],\n 'LongName': 'Multi-functional '\n 'Transport Satellite 1 '\n 'Replacement',\n 'ShortName': 'MTSAT-1R',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'NDBC MOORED BUOY',\n 'ShortName': 'NDBC-MOORED-BUOY',\n 'Type': 'bouy, spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '12000.0'}],\n 'LongName': 'Multifunction '\n 'Transport '\n '2 '\n 'Imager',\n 'ShortName': 'MTSAT '\n '2 '\n 'Imager'}],\n 'LongName': 'The Multi-functional '\n 'Transport Satellite 2',\n 'ShortName': 'MTSAT-2',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/JPL_OUROCEAN/G1SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/JPL_OUROCEAN/G1SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Select (Sea Surface '\n 'Temperature - '\n 'Blended)',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'http://podaac-tools.jpl.nasa.gov/soto/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'OurOcean Team '\n 'homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ourocean.jpl.nasa.gov/sst',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHG1S-4FP01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_JPL_OUROCEAN-L4UHfnd-GLOB-G1SST_OI.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHG1S-4FP01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/JPL_OUROCEAN/G1SST/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'JPL_OUROCEAN-L4UHfnd-GLOB-G1SST',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 80.0,\n 'SouthBoundingCoordinate': -80.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2010-06-09T00:00:00.000Z'}]}],\n 'Version': '1'}},\n { 'meta': { 'concept-id': 'C1664741463-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MUR+Global+Foundation+Sea+Surface+Temperature+Analysis+(v4.1)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T15:46:40Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced as a '\n 'retrospective dataset (four day latency) '\n 'and near-real-time dataset (one day '\n 'latency) at the JPL Physical Oceanography '\n 'DAAC using wavelets as basis functions in '\n 'an optimal interpolation approach on a '\n 'global 0.01 degree grid. The version 4 '\n 'Multiscale Ultrahigh Resolution (MUR) L4 '\n 'analysis is based upon nighttime GHRSST '\n 'L2P skin and subskin SST observations '\n 'from several instruments including the '\n 'NASA Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSR-E), the JAXA '\n 'Advanced Microwave Scanning Radiometer 2 '\n 'on GCOM-W1, the Moderate Resolution '\n 'Imaging Spectroradiometers (MODIS) on the '\n 'NASA Aqua and Terra platforms, the US '\n 'Navy microwave WindSat radiometer, the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) on several NOAA satellites, and '\n 'in situ SST observations from the NOAA '\n 'iQuam project. The ice concentration data '\n 'are from the archives at the EUMETSAT '\n 'Ocean and Sea Ice Satellite Application '\n 'Facility (OSI SAF) High Latitude '\n 'Processing Center and are also used for '\n 'an improved SST parameterization for the '\n 'high-latitudes. The dataset also '\n 'contains additional variables for some '\n 'granules including a SST anomaly derived '\n 'from a MUR climatology and the temporal '\n 'distance to the nearest IR measurement '\n 'for each pixel.\\n'\n 'This dataset is funded by the NASA '\n 'MEaSUREs program ( '\n 'http://earthdata.nasa.gov/our-community/community-data-system-programs/measures-projects '\n '), and created by a team led by Dr. '\n 'Toshio M. Chin from JPL. It adheres to '\n 'the GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications. '\n 'Use the file global metadata \"history:\" '\n 'attribute to determine if a granule is '\n 'near-realtime or retrospective.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'MUR '\n 'MEaSUREs '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MUR '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(v4.1), '\n '10.5067/GHGMR-4FJ04, '\n 'http://mur.jpl.nasa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGMR-4FJ04'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': ' '\n '1-818-393-2510'},\n { 'Type': 'Email',\n 'Value': 'mike.chin@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Mike',\n 'LastName': 'Chin',\n 'MiddleName': 'noen',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2014-10-31T16:30:37.998Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MUR Global Foundation '\n 'Sea Surface Temperature Analysis (v4.1)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-06T15:46:37.263Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'MEaSUREs'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/JPL/MUR/v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'SOTO (State of the '\n 'Ocean) '\n 'Visualization',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/soto/#b=BlueMarble_ShadedRelief_Bathymetry&l=GHRSST_L4_MUR_Sea_Surface_Temperature(la=true)',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://github.com/nasa/podaac_tools_and_services/tree/master/subset_opendap',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGMR-4FJ04',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Homepage for the '\n 'NASA MEaSUREs '\n 'projects',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://science.nasa.gov/earth-science/earth-science-data/Earth-Science-Data-Records-Programs/MEaSUREs-Projects/',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MUR-JPL-L4-GLOB-v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Chin T.M., Milliff '\n 'R.F., Large W.G. '\n '(1998). '\n 'Basin-scale, '\n 'high-wavenumber sea '\n 'surface wind fields '\n 'from a '\n 'multiresolution '\n 'analysis of '\n 'scatterometer data. '\n 'Journal of '\n 'Atmospheric and '\n 'Oceanic Technology, '\n '15: 741-763',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Chin, Toshio '\n 'Michael, Jorge '\n 'Vazquez-Cuervo, and '\n 'Edward M. '\n 'Armstrong. A '\n 'multi-scale '\n 'high-resolution '\n 'analysis of global '\n 'sea surface '\n 'temperature. Remote '\n 'sensing of '\n 'environment 200 '\n '(2017): 154-169.',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://doi.org/10.1016/j.rse.2017.07.029',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'website',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGMR-4FJ04',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T09:00:00.000Z'}]}],\n 'Version': '4.1'}},\n { 'meta': { 'concept-id': 'C1646568487-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MUR+0.25deg+Global+Foundation+Sea+Surface+Temperature+Analysis+(v4.2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-10-17T15:10:57Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced as a '\n 'retrospective dataset (four day latency) '\n 'and near-real-time dataset (one day '\n 'latency) at the JPL Physical Oceanography '\n 'DAAC using wavelets as basis functions in '\n 'an optimal interpolation approach on a '\n 'global 0.25 degree grid. The version 4 '\n 'Multiscale Ultrahigh Resolution (MUR) L4 '\n 'analysis is based upon nighttime GHRSST '\n 'L2P skin and subskin SST observations '\n 'from several instruments including the '\n 'NASA Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSR-E), the JAXA '\n 'Advanced Microwave Scanning Radiometer 2 '\n 'on GCOM-W1, the Moderate Resolution '\n 'Imaging Spectroradiometers (MODIS) on the '\n 'NASA Aqua and Terra platforms, the US '\n 'Navy microwave WindSat radiometer, the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) on several NOAA satellites, and '\n 'in situ SST observations from the NOAA '\n 'iQuam project. The ice concentration data '\n 'are from the archives at the EUMETSAT '\n 'Ocean and Sea Ice Satellite Application '\n 'Facility (OSI SAF) High Latitude '\n 'Processing Center and are also used for '\n 'an improved SST parameterization for the '\n 'high-latitudes. The dataset also '\n 'contains an additional SST anomaly '\n 'variable derived from a MUR climatology.\\n'\n '\\n'\n '\\n'\n 'This dataset is funded by the NASA '\n 'MEaSUREs '\n 'program(http://earthdata.nasa.gov/our-community/community-data-system-programs/measures-projects), '\n 'and created by a team led by Dr. Toshio '\n 'M. Chin from JPL. It adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications. '\n 'Use the file global metadata \"history:\" '\n 'attribute to determine if a granule is '\n 'near-realtime or retrospective.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'MUR '\n 'MEaSUREs '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2018-10-17, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MUR '\n '0.25deg '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(v4.2), '\n '10.5067/GHM25-4FJ42, '\n 'http://mur.jpl.nasa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHM25-4FJ42'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': ' '\n '1-818-393-2510'},\n { 'Type': 'Email',\n 'Value': 'mike.chin@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Mike',\n 'LastName': 'Chin',\n 'MiddleName': 'noen',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2019-08-09T19:47:48.185Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-08-09T19:47:48.185Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MUR 0.25deg Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis (v4.2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-10-17T15:10:54.695Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'SPURS-I SVP Drifters',\n 'ShortName': 'Drifter',\n 'Type': 'BUOY'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR25/v4.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/JPL/MUR25/v4.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'R language read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'MUR Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://mur.rsmas.miami.edu',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'website',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'IDL read software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'MATLAB read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Homepage for the '\n 'NASA MEaSUREs '\n 'projects',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://science.nasa.gov/earth-science/earth-science-data/Earth-Science-Data-Records-Programs/MEaSUREs-Projects/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Algorithm '\n 'Theoretical Basis '\n 'Document',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/docs/Chin2017.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'THREDDS access URL',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MUR25-JPL-L4-GLOB-v04.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Chin T.M., Milliff '\n 'R.F., Large W.G. '\n '(1998). '\n 'Basin-scale, '\n 'high-wavenumber sea '\n 'surface wind fields '\n 'from a '\n 'multiresolution '\n 'analysis of '\n 'scatterometer data. '\n 'Journal of '\n 'Atmospheric and '\n 'Oceanic Technology, '\n '15: 741-763',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHM25-4FJ42',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=5&t=219',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHM25-4FJ42',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR25/v4.2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'MUR25-JPL-L4-GLOB-v04.2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T09:00:00.000Z'}]}],\n 'Version': '4.2'}},\n { 'meta': { 'concept-id': 'C1658476085-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MW_IR_OI+Global+Foundation+Sea+Surface+Temperature+analysis+version+5.0+from+REMSS',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:32Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.09-degree grid at Remote '\n 'Sensing Systems. This product uses '\n 'optimal interpolation (OI) from both '\n 'microwave (MW) sensors including the '\n 'Global Precipitation Measurement (GPM) '\n 'Microwave Imager (GMI), the Tropical '\n 'Rainfall Measuring Mission (TRMM) '\n 'Microwave Imager (TMI), the NASA Advanced '\n 'Microwave Scanning Radiometer-EOS '\n '(AMSRE), the Advanced Microwave Scanning '\n 'Radiometer 2 (AMSR2) onboard the GCOM-W1 '\n 'satellite, and WindSat operates on the '\n 'Coriolis satellite, and infrared (IR) '\n 'sensors such as the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the '\n 'NASA Aqua and Terra platform and the '\n 'Visible Infrared Imaging Radiometer Suite '\n '(VIIRS) on board the Suomi-NPP '\n 'satellite. The through-cloud '\n 'capabilities of microwave radiometers '\n 'provide a valuable picture of global sea '\n 'surface temperature (SST) while infrared '\n 'radiometers (i.e., MODIS) have a higher '\n 'spatial resolution. This analysis does '\n 'not use any in situ SST data such as '\n 'drifting buoy SST. Comparing with '\n 'previous version 4.0 dataset, the version '\n '5.0 has made the updates in several '\n 'areas, including the diurnal warming '\n 'model, the sensor-specific error '\n 'statistics (SSES) for each microwave '\n 'sensor, the sensor correlation model, and '\n 'the quality mask.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Remote '\n 'Sensing '\n 'Systems, '\n 'Remote '\n 'Sensing '\n 'Systems, '\n '2017-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MW_IR_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'analysis '\n 'version '\n '5.0 '\n 'from '\n 'REMSS, '\n '10.5067/GHMWI-4FR05, '\n 'http://www.remss.com'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHMWI-4FR05'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Remote Sensing '\n 'Systems'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '001 '\n '707 '\n '545 '\n '2904'},\n { 'Type': 'Email',\n 'Value': 'brewer@remss.com'}]},\n 'ContactPersons': [ { 'FirstName': 'Marty',\n 'LastName': 'Brewer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Remote Sensing '\n 'Systems'}],\n 'DataDates': [ { 'Date': '2017-09-30T00:13:19.814Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-09-30T00:13:19.814Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MW_IR_OI Global '\n 'Foundation Sea Surface Temperature '\n 'analysis version 5.0 from REMSS',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:30.012Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '95.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '65.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '904.0'}],\n 'LongName': 'GPM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'GMI'}],\n 'LongName': 'Global Precipitation '\n 'Measurement Core '\n 'Observatory',\n 'ShortName': 'GPM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHMWI-4FR04&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Microwave Infrared '\n 'OI SST Product '\n 'Description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.remss.com/measurements/sea-surface-temperature/oisst-description',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MW_IR_OI-REMSS-L4-GLOB-v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHMWI-4FR05',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'MW_IR_OI-REMSS-L4-GLOB-v5.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -179.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T00:00:00.000Z'}]}],\n 'Version': '5.0'}},\n { 'meta': { 'concept-id': 'C1658476097-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MW_OI+Global+Foundation+Sea+Surface+Temperature+analysis+version+5.0+from+REMSS',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:36Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.25-degree grid at Remote '\n 'Sensing Systems. This product uses '\n 'optimal interpolation (OI) from microwave '\n '(MW) sensors including the Global '\n 'Precipitation Measurement (GPM) Microwave '\n 'Imager (GMI), the Tropical Rainfall '\n 'Measuring Mission (TRMM) Microwave Imager '\n '(TMI), the NASA Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), the '\n 'Advanced Microwave Scanning Radiometer 2 '\n '(AMSR2) onboard the GCOM-W1 satellite, '\n 'and WindSat operates on the Coriolis '\n 'satellite. The through-cloud capabilities '\n 'of microwave radiometers provide a '\n 'valuable picture of global sea surface '\n 'temperature (SST). This analysis does not '\n 'use any in situ SST data such as drifting '\n 'buoy SST. Comparing with previous version '\n '4.0 dataset, the version 5.0 has made the '\n 'updates in several areas, including the '\n 'diurnal warming model, the '\n 'sensor-specific error statistics (SSES) '\n 'for each microwave sensor, the sensor '\n 'correlation model, and the quality mask.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Remote '\n 'Sensing '\n 'Systems, '\n 'Remote '\n 'Sensing '\n 'Systems, '\n '2017-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MW_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'analysis '\n 'version '\n '5.0 '\n 'from '\n 'REMSS, '\n '10.5067/GHMWO-4FR05, '\n 'http://www.remss.com'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHMWO-4FR05'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Remote Sensing '\n 'Systems'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '001 '\n '707 '\n '545 '\n '2904'},\n { 'Type': 'Email',\n 'Value': 'brewer@remss.com'}]},\n 'ContactPersons': [ { 'FirstName': 'Marty',\n 'LastName': 'Brewer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Remote Sensing '\n 'Systems'}],\n 'DataDates': [ { 'Date': '2017-10-17T01:11:38.234Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-10-17T01:11:38.234Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MW_OI Global Foundation '\n 'Sea Surface Temperature analysis '\n 'version 5.0 from REMSS',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:33.999Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '95.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '65.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '904.0'}],\n 'LongName': 'GPM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'GMI'}],\n 'LongName': 'Global Precipitation '\n 'Measurement Core '\n 'Observatory',\n 'ShortName': 'GPM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/REMSS/mw_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHMWO-4FR05',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MW_OI-REMSS-L4-GLOB-v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Full details of the '\n 'OISST Project',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.remss.com/measurements/sea-surface-temperature/oisst-description',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHMWO-4FR05',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_OI/v5.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'MW_OI-REMSS-L4-GLOB-v5.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1997-12-31T16:00:00.000Z'}]}],\n 'Version': '5.0'}},\n { 'meta': { 'concept-id': 'C1652972817-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+K10_SST+Global+1+meter+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:16Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Naval '\n 'Oceanographic Office (NAVOCEANO) on a '\n 'global 0.1 degree grid. The K10 L4 sea '\n 'surface temperature analysis uses SST '\n 'observations from the Advanced Very High '\n 'Resolution Radiometer (AVHRR), the '\n 'Advanced Microwave Scanning Radiometer '\n 'for EOS (AMSR-E), and the Geostationary '\n 'Operational Environmental Satellite '\n '(GOES) Imager. The age, reliability, and '\n 'resolution of the data are used in the '\n 'weighted average with the analysis tuned '\n 'to represent SST at 1 meter depth. AVHRR '\n 'Pathfinder 9km climatology is used when '\n 'no new satellite SST retrievals are '\n 'available after 34 days.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Naval '\n 'Oceanographic '\n 'Office, '\n 'Naval '\n 'Oceanographic '\n 'Office, '\n '2008-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'K10_SST '\n 'Global '\n '1 '\n 'meter '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHK10-41N01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHK10-41N01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Naval Oceanographic '\n 'Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '228-688-4859'},\n { 'Type': 'Email',\n 'Value': 'doug.may@navy.mil'}]},\n 'ContactPersons': [ { 'FirstName': 'Doug',\n 'LastName': 'May',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Naval Oceanographic '\n 'Office (NAVOCEANO)'}],\n 'DataDates': [ { 'Date': '2008-03-17T18:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 K10_SST Global 1 meter '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:08.267Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental '\n 'Satellite '\n '11-Imager',\n 'ShortName': 'GOES-11 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '11',\n 'ShortName': 'GOES-11',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/NAVO/K10_SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/NAVO/K10_SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHK10-41N01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_NAVO-L4HR1m-GLOB-K10_SST.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHK10-41N01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/NAVO/K10_SST/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea '\n 'Surface '\n 'Temperature '\n '1m',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'NAVO-L4HR1m-GLOB-K10_SST',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1658476026-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Black+Sea+High+Resolution+SST+L4+Analysis+0.0625+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:13Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.0625 deg. x '\n '0.0625 deg. horizontal resolution over '\n 'the Black Sea. The data are obtained from '\n 'infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Black sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Black '\n 'Sea '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.0625 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOHN-4GB20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOHN-4GB20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:50:32.594Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Black Sea High Resolution SST L4 '\n 'Analysis 0.0625 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:10.288Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_HR_NRT-GOS-L4-BLK-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GB20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOHN-4GB20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_HR_NRT-GOS-L4-BLK-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 42.375,\n 'NorthBoundingCoordinate': 48.812,\n 'SouthBoundingCoordinate': 38.75,\n 'WestBoundingCoordinate': 26.375}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476036-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Mediterranean+Sea+High+Resolution+SST+L4+Analysis+1/16deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:16Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.0625deg. x '\n '0.0625deg. horizontal resolution over the '\n 'Mediterranean Sea. The data are obtained '\n 'from infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Mediterranean sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Mediterranean '\n 'Sea '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '1/16deg '\n 'Resolution, '\n '10.5067/GHOHN-4GM20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOHN-4GM20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:06:51.859Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Mediterranean Sea High Resolution SST '\n 'L4 Analysis 1/16deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:14.375Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Project Homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_HR_NRT-GOS-L4-MED-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GM20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOHN-4GM20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_HR_NRT-GOS-L4-MED-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 36.25,\n 'NorthBoundingCoordinate': 46.0,\n 'SouthBoundingCoordinate': 30.25,\n 'WestBoundingCoordinate': -18.125}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476046-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Black+Sea+Ultra+High+Resolution+SST+L4+Analysis+0.01+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:20Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.01 deg. x '\n '0.01 deg. horizontal resolution over the '\n 'Black Sea. The data are obtained from '\n 'infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Black sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-06-03, '\n 'Black '\n 'Sea '\n 'Ultra '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.01 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOUN-4GB20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOUN-4GB20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:56:27.961Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Black Sea Ultra High Resolution SST L4 '\n 'Analysis 0.01 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:18.149Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOUN-4GB20',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_UHR_NRT-GOS-L4-BLK-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Project Homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Web site with '\n 'general description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/description.php',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOUN-4GB20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_UHR_NRT-GOS-L4-BLK-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 42.375,\n 'NorthBoundingCoordinate': 48.812,\n 'SouthBoundingCoordinate': 38.75,\n 'WestBoundingCoordinate': 26.375}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476058-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Mediterranean+Sea+Ultra+High+Resolution+SST+L4+Analysis+0.01+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:24Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.01 deg. x '\n '0.01deg. horizontal resolution over the '\n 'Mediterranean \\n'\n 'Sea. The data are obtained from infra-red '\n 'measurements collected by satellite '\n 'radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Mediterranean sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Mediterranean '\n 'Sea '\n 'Ultra '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.01 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOUH-4GM20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOUH-4GM20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:32:57.226Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Mediterranean Sea Ultra High Resolution '\n 'SST L4 Analysis 0.01 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:21.884Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GM20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_UHR_NRT-GOS-L4-MED-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOUH-4GM20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_UHR_NRT-GOS-L4-MED-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 36.25,\n 'NorthBoundingCoordinate': 46.0,\n 'SouthBoundingCoordinate': 30.25,\n 'WestBoundingCoordinate': -18.125}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1652972902-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSTIA+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:20Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the UK Met Office '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Operational '\n 'Sea Surface Temperature and Sea Ice '\n 'Analysis (OSTIA) analysis uses satellite '\n 'data from sensors that include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Spinning Enhanced Visible '\n 'and Infrared Imager (SEVIRI), the '\n 'Geostationary Operational Environmental '\n 'Satellite (GOES) imager, the Infrared '\n 'Atmospheric Sounding Interferometer '\n '(IASI), the Tropical Rainfall Measuring '\n 'Mission Microwave Imager (TMI) and in '\n 'situ data from ships, drifting and moored '\n 'buoys. This analysis was specifically '\n 'produced to be used as a lower boundary '\n 'condition in Numerical Weather Prediction '\n '(NWP) models. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'UK '\n 'Met '\n 'Office, '\n 'UK '\n 'Met '\n 'Office, '\n '2012-12-19, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSTIA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHOST-4FK02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOST-4FK02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'UK Met Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': '-9000000000000000'}]},\n 'ContactPersons': [ { 'FirstName': 'Emma',\n 'LastName': 'Fielder',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': 'servicedesk@myocean.eu.org'}]},\n 'ContactPersons': [ { 'FirstName': 'Jonah',\n 'LastName': 'Roberts-Jones',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'}],\n 'DataDates': [ { 'Date': '2013-02-14T01:44:31.886Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSTIA Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:17.696Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/UKMO/OSTIA/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/UKMO/OSTIA/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOST-4FK02&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OSTIA-UKMO-L4-GLOB-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOST-4FK02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/UKMO/OSTIA/v2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'},\n { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea Ice '\n 'Fraction',\n 'Term': 'Sea Ice',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Ice '\n 'Concentration'}],\n 'ShortName': 'OSTIA-UKMO-L4-GLOB-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2013-04-25T00:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1653205927-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+RAMSSA_9km+Australian+Regional+Foundation+Sea+Surface+Temperature+Analysis+v1.0+dataset+(GDS2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T22:47:03Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis, produced daily on '\n 'an operational basis at the Australian '\n 'Bureau of Meteorology (BoM) using optimal '\n 'interpolation (OI) on a regional 1/12 '\n 'degree grid over the Australian region '\n '(20N - 70S, 60E - 170W). This Regional '\n 'Australian Multi-Sensor SST Analysis '\n '(RAMSSA) v1.0 system blends satellite SST '\n 'observations from passive infrared and '\n 'passive microwave radiometers, with in '\n 'situ data from ships, Argo floats, XBTs, '\n 'CTDs, drifting buoys and moorings from '\n 'the Global Telecommunications System '\n '(GTS). SST observations that have '\n 'experienced recent surface wind speeds '\n 'less than 6 m/s during the day or less '\n 'than 2 m/s during night are rejected from '\n 'the analysis. The processing results in '\n 'daily foundation SST estimates that are '\n 'largely free of nocturnal cooling and '\n 'diurnal warming effects. Sea ice '\n 'concentrations are supplied by the '\n 'NOAA/NCEP 12.7 km sea ice analysis. In '\n 'the absence of observations, the analysis '\n 'relaxes to the BoM Global Weekly 1 degree '\n 'OI SST analysis, which relaxes to the '\n 'Reynolds and Smith (1994) Monthly 1 '\n 'degree SST climatology for 1961 - 1990.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF '\n '4.3',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2019-11-14, '\n 'GHRSST '\n 'Level '\n '4 '\n 'RAMSSA_9km '\n 'Australian '\n 'Regional '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n 'v1.0 '\n 'dataset '\n '(GDS2), '\n '10.5067/GHRAM-4FA1A, '\n 'http://www.bom.gov.au/jshess/docs/2011/beggs_hres.pdf, '\n 'DOI: '\n '10.22499/2.6101.001'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHRAM-4FA1A'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2019-09-03T21:16:56.600Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-09-03T21:16:56.600Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 RAMSSA_9km Australian '\n 'Regional Foundation Sea Surface '\n 'Temperature Analysis v1.0 dataset '\n '(GDS2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'OCEANIA'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T22:47:00.185Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/AUS/ABOM/RAMSSA/v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'https://www.ghrsst.org/',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=RAMSSA_09km-ABOM-L4-AUS-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHRAM-4FA1A',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'https://podaac.jpl.nasa.gov/ghrsst',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHRAM-4FA1A',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/AUS/ABOM/RAMSSA/v1.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'RAMSSA_09km-ABOM-L4-AUS-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': 60.0},\n { 'EastBoundingCoordinate': -170.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2006-06-12T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1655116781-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'NOAA+Smith+and+Reynolds+Extended+Reconstructed+Sea+Surface+Temperature+(ERSST)+Level+4+Monthly+Version+4+Dataset+in+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-10T18:29:41Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '4 of this dataset implements release 2.5 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, v4 '\n 'implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 monthly climatology. The '\n 'version 4 has been improved from previous '\n 'version 3b. Major revisions include '\n 'updated and substantially more complete '\n 'input data from the ICOADS release 2.5, '\n 'revised EOTs and EOT acceptance '\n 'criterion, updated SST quality control '\n 'procedures, revised SST anomaly '\n 'evaluation methods, updated bias '\n 'adjustments of ship SSTs using the Hadley '\n 'Centre Nighttime Marine Air Temperature '\n 'dataset version 2 (HadNMAT2), and buoy '\n 'SST bias adjustment not previously made '\n 'in v3b. The ERSST v4 in netCDF format '\n 'contains extended reconstructed sea '\n 'surface temperature, SST anomaly, and '\n 'associated estimated SST error standard '\n 'deviation fields, incompliance with CF1.6 '\n 'standard metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n \"NOAA's \"\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information '\n '(NCEI), '\n '1981-11-07, '\n 'NOAA '\n 'Smith '\n 'and '\n 'Reynolds '\n 'Extended '\n 'Reconstructed '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(ERSST) '\n 'Level '\n '4 '\n 'Monthly '\n 'Version '\n '4 '\n 'Dataset '\n 'in '\n 'netCDF, '\n '10.5067/ERSST-L4N40, '\n 'https://www1.ncdc.noaa.gov/pub/data/cmb/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/ERSST-L4N40'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEI'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2017-08-15T01:07:30.704Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-08-15T01:07:30.704Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'NOAA Smith and Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 Monthly Version 4 '\n 'Dataset in netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-10T18:29:38.569Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v4/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 4 '\n '(ERSST.v4) Part I. '\n 'Upgrades and '\n 'intercomparisons. '\n 'Journal of Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Huang-2014.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Further Exploring '\n 'and Quantifying '\n 'Uncertainties for '\n 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n '(ERSST) Version 4 '\n '(v4). Journal of '\n 'Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Huang-2015.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 4 '\n '(ERSST.v4) Part II. '\n 'Parametric and '\n 'structural '\n 'uncertainty '\n 'estimations. '\n 'Journal of Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Wei-Liu-2015.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-ERSST-L4N40',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ersst.html?dataset=REYNOLDS_NCDC_L4_MONTHLY_V4',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 4',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/hyrax/allData/ersst/L4/ncei/v4/README',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/ERSST-L4N40',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v4/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_MONTHLY_V4',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '4'}},\n { 'meta': { 'concept-id': 'C1655116806-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'NOAA+Smith+and+Reynolds+Extended+Reconstructed+Sea+Surface+Temperature+(ERSST)+Level+4+Monthly+Version+5+Dataset+in+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-10T18:29:45Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '5 of this dataset implements release 3.0 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, v5 '\n 'implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 monthly climatology. The '\n 'version 5 has been improved from previous '\n 'version 4. Major improvements in v5 '\n 'include: 1) Inclusion and use of new '\n 'sources and new versions of input '\n 'datasets, such as data from Argo floats '\n '(new source), ICOADS R3.0 (from R2.5), '\n 'HadISST2 (from HadISST1) sea ice '\n 'concentration, and 2) Improved '\n 'methodologies, such as inclusion of '\n 'additional statistical modes, less '\n 'spatial-temporal smoothing, better '\n 'quality control method, and bias '\n 'correction with baseline to modern buoy '\n 'observations. The new version improves '\n 'the spatial structures and magnitudes of '\n 'El Nino and La Nina events. The ERSST v5 '\n 'in netCDF format contains extended '\n 'reconstructed sea surface temperature, '\n 'SST anomaly, and associated estimated SST '\n 'error standard deviation fields, '\n 'incompliance with CF1.6 standard '\n 'metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n \"NOAA's \"\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information '\n '(NCEI), '\n '1981-11-07, '\n 'NOAA '\n 'Smith '\n 'and '\n 'Reynolds '\n 'Extended '\n 'Reconstructed '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(ERSST) '\n 'Level '\n '4 '\n 'Monthly '\n 'Version '\n '5 '\n 'Dataset '\n 'in '\n 'netCDF, '\n '10.5067/ERSST-L4N50, '\n 'https://www1.ncdc.noaa.gov/pub/data/cmb/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/ERSST-L4N50'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEI'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2017-08-15T01:11:29.253Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-08-15T01:11:29.253Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'NOAA Smith and Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 Monthly Version 5 '\n 'Dataset in netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-10T18:29:42.498Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v5/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-ERSST-L4N50',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ersst.html?dataset=REYNOLDS_NCDC_L4_MONTHLY_V5',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 5',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/hyrax/allData/ersst/L4/ncei/v5/README',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 5 '\n '(ERSSTv5), '\n 'Upgrades, '\n 'validations, and '\n 'intercomparisons. '\n 'J. Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST5_Huang-2017.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/ERSST-L4N50',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v5/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_MONTHLY_V5',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '5'}},\n { 'meta': { 'concept-id': 'C1652973820-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:36Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies on a 2 degree '\n 'spatial grid from 1854-2009 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '2 of this dataset implements release 2 of '\n 'ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and utilizes '\n 'Empirical Orthogonal Teleconnections '\n '(EOT) in reconstruction analyses to '\n 'estimate both surface temperature and '\n 'associated standard deviation error '\n 'fields. ERSST v2 presents extended '\n 'reconstructed sea surface temperature and '\n 'associated estimated SST error standard '\n 'deviation fields as 2 similarly '\n 'structured ASCII flat files.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '2, '\n '10.5067/REYN2-ERMON, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-ERMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-07-29T20:44:48.306Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:33.606Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v2/monthly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Subtype': 'READ-ME',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-ERMON',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1652973478-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+3b+Ascii',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:28Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies on a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '3b of this dataset implements release 2.4 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, '\n 'v3b implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 month climatology. The ASCII '\n 'text file version of ERSST v3b contains '\n 'extended reconstructed sea surface '\n 'temperature and associated estimated SST '\n 'error standard deviation fields as 2 '\n 'similarly structured ASCII flat files.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'ASCII',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '3b '\n 'Ascii, '\n '10.5067/REY3B-ERMOA, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REY3B-ERMOA'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2010-12-01T22:22:37.871Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 3b Ascii',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:25.754Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v3b/monthly/ascii',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 3b',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs/README.V3b',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REY3B-ERMOA',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V3B_ASC',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '3b'}},\n { 'meta': { 'concept-id': 'C1652973774-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+3b+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:32Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '3b of this dataset implements release 2.4 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, '\n 'v3b implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 month climatology. The netCDF '\n 'version of ERSST v3b contains extended '\n 'reconstructed sea surface temperature, '\n 'SST anomaly, and associated estimated SST '\n 'error standard deviation fields in netCDF '\n 'classic format with CF1.0 standard '\n 'metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '3b '\n 'netCDF, '\n '10.5067/REY3B-ERMON, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REY3B-ERMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-12-01T22:38:30.625Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 3b netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:29.606Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v3b/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-REY3B-ERMON',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Description of '\n 'Reynolds '\n 'Re-constructed data '\n 'version 3b.',\n 'Subtype': 'READ-ME',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs/README.V3b',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REY3B-ERMON',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v3b/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V3B_NETCDF',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '3b'}},\n { 'meta': { 'concept-id': 'C1645281597-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Reynolds+NCEP+Level+4+Optimally+Interpolated+SST+Monthly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-10-29T17:21:13Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The NOAA/NCEP Reynolds Optimally '\n 'Interpolated (OI) Sea Surface Temperature '\n 'monthly Level 4 product consists of '\n 'aggregate global sea surface temperature '\n 'fields on a 1 degree by 1 degree grid '\n 'over a month time interval. The OI '\n 'analysis employed uses both in-situ SSTs '\n 'from ships and buoys and satellite '\n 'derived SSTs from the NOAA Advanced Very '\n 'High Resolution Radiometer (AVHRR). The '\n 'satellite derived SSTs are from the '\n 'Multichannel Sea Surface Temperature '\n 'products that have been constructed '\n 'operationally from the five-channel AVHRR '\n \"by NOAA's Environmental Satellite, Data, \"\n 'and Information Service (NESDIS) since '\n 'late 1981 through to present. Monthly OI '\n 'SST fields are derived by a linear '\n 'interpolation of the weekly optimum '\n 'interpolation (OI) fields to daily fields '\n 'then averaging the daily values over a '\n 'month. The monthly fields are in the same '\n 'format and spatial resolution as the '\n 'weekly fields, which have been widely '\n 'used for weather and climate monitoring '\n 'and forecasting. Version 2.0 of this '\n 'dataset utilizes an update and extension '\n 'of the COADS in-situ data series '\n 'providing enhanced ship data coverage '\n 'through 1997 and reducing the residual '\n 'satellite biases in otherwise data sparse '\n 'regions. This version also implements '\n 'enhancements to the OI analysis utilizing '\n 'simulations of SST observations from an '\n 'improved sea ice algorithm and data '\n 'following a technique developed at the UK '\n 'Met Office, improvements that further '\n 'reduce biases in the OI SST particularly '\n 'at higher latitudes.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Reynolds, '\n 'R., '\n 'Stokes, '\n 'D., '\n 'National '\n 'Center '\n 'for '\n 'Environmental '\n 'Prediction '\n '(NCEP), '\n '1981-11-08, '\n 'Reynolds '\n 'NCEP '\n 'Level '\n '4 '\n 'Optimally '\n 'Interpolated '\n 'SST '\n 'Monthly '\n 'Version '\n '2, '\n '10.5067/REYN2-OIMON, '\n 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-OIMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEP'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-683-3713'},\n { 'Type': 'Email',\n 'Value': 'Diane.Stokes@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Diane',\n 'LastName': 'Stokes',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National Center '\n 'for Environmental '\n 'Prediction'}],\n 'DataDates': [ { 'Date': '2010-06-07T00:14:34.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Reynolds NCEP Level 4 Optimally '\n 'Interpolated SST Monthly Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-10-29T17:21:10.709Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'POES'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/v2/monthly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'description',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'User Guide',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/oisst.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-OIMON',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'None',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'REYNOLDS_NCEP_L4_SST_OPT_INTERP_MONTHLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-11-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1652973931-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Reynolds+NCEP+Level+4+Optimally+Interpolated+SST+Weekly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:40Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The NOAA/NCEP Reynolds Optimally '\n 'Interpolated (OI) Sea Surface Temperature '\n 'weekly Level 4 product consists of '\n 'aggregate 7 day global sea surface '\n 'temperature fields on a 1 degree by 1 '\n 'degree grid. The OI analysis employed '\n 'uses both in-situ SSTs from ships and '\n 'buoys and satellite derived SSTs from the '\n 'NOAA Advanced Very High Resolution '\n 'Radiometer (AVHRR). The satellite derived '\n 'SSTs are from the Multichannel Sea '\n 'Surface Temperature products that have '\n 'been constructed operationally from the '\n \"five-channel AVHRR by NOAA's \"\n 'Environmental Satellite, Data, and '\n 'Information Service (NESDIS) since late '\n '1981 through to present. The weekly '\n 'product has been available since 1993 and '\n 'is widely used for weather and climate '\n 'monitoring and forecasting. Version 2.0 '\n 'of this dataset utilizes an update and '\n 'extension of the COADS in-situ data '\n 'series providing enhanced ship data '\n 'coverage through 1997 and reducing the '\n 'residual satellite biases in otherwise '\n 'data sparse regions. This version also '\n 'implements enhancements to the OI '\n 'analysis utilizing simulations of SST '\n 'observations from an improved sea ice '\n 'algorithm and data following a technique '\n 'developed at the UK Met Office, '\n 'improvements that further reduce biases '\n 'in the OI SST particularly at higher '\n 'latitudes.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Reynolds, '\n 'R., '\n 'Stokes, '\n 'D., '\n 'National '\n 'Center '\n 'for '\n 'Environmental '\n 'Prediction '\n '(NCEP), '\n '1981-11-07, '\n 'Reynolds '\n 'NCEP '\n 'Level '\n '4 '\n 'Optimally '\n 'Interpolated '\n 'SST '\n 'Weekly '\n 'Version '\n '2, '\n '10.5067/REYN2-OIMOW, '\n 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-OIMOW'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEP'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-683-3713'},\n { 'Type': 'Email',\n 'Value': 'Diane.Stokes@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Diane',\n 'LastName': 'Stokes',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National Center '\n 'for Environmental '\n 'Prediction'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-06-07T00:13:29.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Reynolds NCEP Level 4 Optimally '\n 'Interpolated SST Weekly Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:37.407Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'POES'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/v2/weekly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'description',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'User Guide',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/oisst.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-OIMOW',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'None',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'REYNOLDS_NCEP_L4_SST_OPT_INTERP_WEEKLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-01-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1650311566-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSTIA+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-01T16:27:11Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the UK Met Office '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Operational '\n 'Sea Surface Temperature and Sea Ice '\n 'Analysis (OSTIA) analysis uses satellite '\n 'data from sensors that include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Advanced Along Track '\n 'Scanning Radiometer (AATSR), the Spinning '\n 'Enhanced Visible and Infrared Imager '\n '(SEVIRI), the Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSRE), the Tropical '\n 'Rainfall Measuring Mission Microwave '\n 'Imager (TMI), and in situ data from '\n 'drifting and moored buoys. This analysis '\n 'has a highly smoothed SST field and was '\n 'specifically produced to support SST data '\n 'assimilation into Numerical Weather '\n 'Prediction (NWP) models.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'UK '\n 'Met '\n 'Office, '\n 'UK '\n 'Met '\n 'Office, '\n '2005-12-23, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSTIA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHOST-4FK01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOST-4FK01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'UK Met Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': '-9000000000000000'}]},\n 'ContactPersons': [ { 'FirstName': 'Emma',\n 'LastName': 'Fielder',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': 'servicedesk@myocean.eu.org'}]},\n 'ContactPersons': [ { 'FirstName': 'Jonah',\n 'LastName': 'Roberts-Jones',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'}],\n 'DataDates': [ { 'Date': '2006-03-03T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSTIA Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-01T16:27:08.650Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/UKMO/OSTIA',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/UKMO/OSTIA',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOST-4FK01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOST-4FK01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/UKMO/OSTIA/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'UKMO-L4HRfnd-GLOB-OSTIA',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2006-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1653649472-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+K10_SST+Global+10+km+Analyzed+Sea+Surface+Temperature+from+Naval+Oceanographic+Office+(NAVO)+in+GDS2.0',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T19:03:09Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'This is a Group for High Resolution Sea '\n 'Surface Temperature (GHRSST) Level 4 sea '\n 'surface temperature (SST) analysis '\n 'dataset produced daily on an operational '\n 'basis by the Naval Oceanographic Office '\n '(NAVO) on a global 0.1x0.1 degree grid. '\n 'The K10 (NAVO 10-km gridded SST analyzed '\n 'product) L4 analysis uses SST '\n 'observations from the following '\n 'instruments: Advanced Very High '\n 'Resolution Radiometer (AVHRR), Visible '\n 'Infrared Imaging Radiometer Suite '\n '(VIIRS), and Spinning Enhanced Visible '\n 'and InfraRed Imager (SEVIRI). The AVHRR '\n 'data for this comes from the MetOp-A, '\n 'MetOp-B, and NOAA-19 satellites; VIIRS '\n 'data is sourced from the Suomi_NPP '\n 'satellite; SEVIRI data comes from the '\n 'Meteosat-8 and -11 satellites. The age '\n '(time-lag), reliability, and resolution '\n 'of the data are used in the weighted '\n 'average with the analysis tuned to '\n 'represent SST at a reference depth of '\n '1-meter. Input data from the AVHRR '\n 'Pathfinder 9km climatology dataset '\n '(1985-1999) is used when no new satellite '\n 'SST retrievals are available after 34 '\n 'days. Comparing with its predecessor '\n '(DOI: https://doi.org/10.5067/GHK10-L4N01 '\n '), this updated dataset has no major '\n 'changes in Level-4 interpolated K10 '\n 'algorithm, except for using different '\n 'satellite instrument data, and updating '\n 'metadata and file format. The major '\n 'updates include: (a) updated and enhanced '\n 'the granule-level metadata information, '\n '(b) converted the SST file from GHRSST '\n 'Data Specification (GDS) v1.0 to v2.0, '\n '(c) added the sea_ice_fraction variable '\n 'to the product, and (d) updated the '\n 'filename convention to reflect compliance '\n 'with GDS v2.0.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Naval '\n 'Oceanographic '\n 'Office, '\n 'Naval '\n 'Oceanographic '\n 'Office, '\n '2018-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'K10_SST '\n 'Global '\n '10 '\n 'km '\n 'Analyzed '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'from '\n 'Naval '\n 'Oceanographic '\n 'Office '\n '(NAVO) '\n 'in '\n 'GDS2.0, '\n '10.5067/GHK10-L4N01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHK10-L4N01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Naval Oceanographic '\n 'Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'null'},\n { 'Type': 'Email',\n 'Value': 'daniel.olszewski@navy.mil'}]},\n 'ContactPersons': [ { 'FirstName': 'Daniel',\n 'LastName': 'Olszewski',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Naval Oceanographic '\n 'Office (NAVOCEANO)'}],\n 'DataDates': [ { 'Date': '2018-09-13T00:58:04.861Z',\n 'Type': 'CREATE'},\n { 'Date': '2018-09-13T00:58:04.861Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 K10_SST Global 10 km '\n 'Analyzed Sea Surface Temperature from '\n 'Naval Oceanographic Office (NAVO) in '\n 'GDS2.0',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T19:03:07.263Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 4',\n 'ShortName': 'MSG4',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/NAVO/K10_SST/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHK10-L4N01',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=K10_SST-NAVO-L4-GLOB-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/docs/GMPE_Matthew_2012.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/docs/contents.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'netCDF generic '\n 'readers',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHK10-L4N01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea '\n 'Surface '\n 'Temperature '\n '1m',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'K10_SST-NAVO-L4-GLOB-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2018-10-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}}],\n 'took': 92}\n\n\ntemporal=2018-01-01T10:00:00Z,2019-01-01T10:00:00Z&provider_short_name=PODAAC&processing_level_id=4\nwe sepcified a temporal range for all of 2018, PODAAC as the provider, and level 4 data, since it’s a bit easier for us to work with.\nok, that got us down to ~29 collections. Let’s use python to get some information we’re interested in.\n\nfor i in JSON_object[\"items\"]:\n print(i['meta']['concept-id'] + \" \" + i['meta']['native-id'].replace('+',' '))\n #print(\"\\t\"+i['meta']['native-id'].replace('+',' '))\n print(\"\\tBeginning Data Time: \"+str(i['umm']['TemporalExtents'][0]['RangeDateTimes'][0]['BeginningDateTime']))\n \n # Bounding Box Info:\n br_array = i['umm']['SpatialExtent']['HorizontalSpatialDomain']['Geometry']['BoundingRectangles']\n for br in br_array:\n print(\"\\tBounding Rectangle: West: {}, North: {}, East: {}, South: {}\".format(br['WestBoundingCoordinate'], br['NorthBoundingCoordinate'], br['EastBoundingCoordinate'], br['SouthBoundingCoordinate']))\n\n \n \n \n \n\nC1658476070-PODAAC GHRSST Level 4 RAMSSA Australian Regional Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2008-04-01T00:00:00.000Z\n Bounding Rectangle: West: 60.0, North: 20.0, East: 180.0, South: -70.0\n Bounding Rectangle: West: -180.0, North: 20.0, East: -170.0, South: -70.0\nC1657548743-PODAAC GHRSST Level 4 GAMSSA Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2008-08-24T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652971997-PODAAC GHRSST Level 4 AVHRR_OI Global Blended Sea Surface Temperature Analysis (GDS version 2) from NCEI\n Beginning Data Time: 1981-09-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652972273-PODAAC GHRSST Level 4 CMC0.1deg Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2016-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653649473-PODAAC GHRSST Level 4 DMI_OI Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2013-04-30T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653205971-PODAAC GHRSST Level 4 GAMSSA_28km Global Foundation Sea Surface Temperature Analysis v1.0 dataset (GDS2)\n Beginning Data Time: 2008-07-23T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1657544973-PODAAC GHRSST Level 4 OSPO Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2014-06-02T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1657544629-PODAAC GHRSST Level 4 OSPO Global Nighttime Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2014-06-02T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1650311564-PODAAC GHRSST Level 4 G1SST Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2010-06-09T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 80.0, East: 180.0, South: -80.0\nC1664741463-PODAAC GHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1)\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1646568487-PODAAC GHRSST Level 4 MUR 0.25deg Global Foundation Sea Surface Temperature Analysis (v4.2)\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1658476085-PODAAC GHRSST Level 4 MW_IR_OI Global Foundation Sea Surface Temperature analysis version 5.0 from REMSS\n Beginning Data Time: 2002-06-01T00:00:00.000Z\n Bounding Rectangle: West: -179.0, North: 90.0, East: 180.0, South: -90.0\nC1658476097-PODAAC GHRSST Level 4 MW_OI Global Foundation Sea Surface Temperature analysis version 5.0 from REMSS\n Beginning Data Time: 1997-12-31T16:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652972817-PODAAC GHRSST Level 4 K10_SST Global 1 meter Sea Surface Temperature Analysis\n Beginning Data Time: 2008-04-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1658476026-PODAAC Black Sea High Resolution SST L4 Analysis 0.0625 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: 26.375, North: 48.812, East: 42.375, South: 38.75\nC1658476036-PODAAC Mediterranean Sea High Resolution SST L4 Analysis 1/16deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: -18.125, North: 46.0, East: 36.25, South: 30.25\nC1658476046-PODAAC Black Sea Ultra High Resolution SST L4 Analysis 0.01 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: 26.375, North: 48.812, East: 42.375, South: 38.75\nC1658476058-PODAAC Mediterranean Sea Ultra High Resolution SST L4 Analysis 0.01 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: -18.125, North: 46.0, East: 36.25, South: 30.25\nC1652972902-PODAAC GHRSST Level 4 OSTIA Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2013-04-25T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653205927-PODAAC GHRSST Level 4 RAMSSA_9km Australian Regional Foundation Sea Surface Temperature Analysis v1.0 dataset (GDS2)\n Beginning Data Time: 2006-06-12T00:00:00.000Z\n Bounding Rectangle: West: 60.0, North: 20.0, East: 180.0, South: -70.0\n Bounding Rectangle: West: -180.0, North: 20.0, East: -170.0, South: -70.0\nC1655116781-PODAAC NOAA Smith and Reynolds Extended Reconstructed Sea Surface Temperature (ERSST) Level 4 Monthly Version 4 Dataset in netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1655116806-PODAAC NOAA Smith and Reynolds Extended Reconstructed Sea Surface Temperature (ERSST) Level 4 Monthly Version 5 Dataset in netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973820-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 2\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973478-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 3b Ascii\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973774-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 3b netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1645281597-PODAAC Reynolds NCEP Level 4 Optimally Interpolated SST Monthly Version 2\n Beginning Data Time: 1981-11-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973931-PODAAC Reynolds NCEP Level 4 Optimally Interpolated SST Weekly Version 2\n Beginning Data Time: 1981-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1650311566-PODAAC GHRSST Level 4 OSTIA Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2006-04-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653649472-PODAAC GHRSST Level 4 K10_SST Global 10 km Analyzed Sea Surface Temperature from Naval Oceanographic Office (NAVO) in GDS2.0\n Beginning Data Time: 2018-10-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\n\n\nWe now have the start times, CMR Concept-ID (the unique collection identifier), title, and Bounding rectangles for spatial coverage. This is a lot of information we can use to decide on a dataset, and we can keep adding more information.\nFor now, lets choose “C1664741463-PODAAC”: GHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1)" + "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-l2ss-py-concise", + "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-l2ss-py-concise", + "title": "Harmony Concise + L2SS-Py Demo", + "section": "What is L2SS-Py + Concise?", + "text": "What is L2SS-Py + Concise?\nHarmony supports chaining multiple services together. The L2SS-Py + Concise chain allows users to combine spatial, temporal, and variable subsetting with granule concatenation." }, { - "objectID": "notebooks/podaac_cmr_tutorial.html#granule-search", - "href": "notebooks/podaac_cmr_tutorial.html#granule-search", - "title": "Introduction to Programmatic Common Metadata Repository Search", - "section": "Granule Search", - "text": "Granule Search\nUsing this collection, and more specifically, its concept-ID, we can now search for data we’re interested in.\n\nwith request.urlopen(cmr_url+\"granules.umm_json?concept-id=C1664741463-PODAAC\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\n{ 'hits': 6497,\n 'items': [ { 'meta': { 'concept-id': 'G1664772388-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:29:51Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 332.35974979400635,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:39:29.000Z'},\n 'GranuleUR': '20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:33:18.462Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:29:51.182Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-01T09:00:00.000Z',\n 'EndingDateTime': '2002-06-01T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777267-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:20Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 331.33482456207275,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:35:04.000Z'},\n 'GranuleUR': '20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:31:03.105Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:19.803Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-02T09:00:00.000Z',\n 'EndingDateTime': '2002-06-02T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777275-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:21Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 329.771671295166,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:30:42.000Z'},\n 'GranuleUR': '20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:32:32.948Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:21.251Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-03T09:00:00.000Z',\n 'EndingDateTime': '2002-06-03T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664779141-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:44:55Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.5539598464966,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:26:22.000Z'},\n 'GranuleUR': '20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:35:14.196Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:44:54.615Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-04T09:00:00.000Z',\n 'EndingDateTime': '2002-06-04T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777247-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:17Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 318.64849376678467,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:21:59.000Z'},\n 'GranuleUR': '20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:30:38.111Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:17.171Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-05T09:00:00.000Z',\n 'EndingDateTime': '2002-06-05T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664773829-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:33:11Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 310.25645446777344,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:17:42.000Z'},\n 'GranuleUR': '20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:34:35.618Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:33:10.374Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-06T09:00:00.000Z',\n 'EndingDateTime': '2002-06-06T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664774358-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:34:16Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 316.9076223373413,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:13:25.000Z'},\n 'GranuleUR': '20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:26:43.980Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:34:15.270Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-07T09:00:00.000Z',\n 'EndingDateTime': '2002-06-07T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664779133-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:44:54Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.881872177124,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:09:05.000Z'},\n 'GranuleUR': '20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:33:29.406Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:44:53.293Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-08T09:00:00.000Z',\n 'EndingDateTime': '2002-06-08T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664773751-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:33:07Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 328.56553649902344,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:04:43.000Z'},\n 'GranuleUR': '20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:27:35.415Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:33:06.277Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-09T09:00:00.000Z',\n 'EndingDateTime': '2002-06-09T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664774368-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:34:17Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.50969791412354,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:00:23.000Z'},\n 'GranuleUR': '20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:28:50.109Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:34:16.609Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-10T09:00:00.000Z',\n 'EndingDateTime': '2002-06-10T09:00:00.000Z'}}}}],\n 'took': 36}\n\n\nAlright, 6497 hits (at time of this writing). Let’s once again use some parsing magic to get some information on these data granules.\n\nfor i in JSON_object[\"items\"]:\n print(i['meta']['concept-id'] + \" \" + i['meta']['native-id'].replace('+',' '))\n\n\n dist_info = i['umm']['DataGranule']['ArchiveAndDistributionInformation'][0]\n print(\"\\tGranule Size: \"+\"{:.3f}\".format(dist_info['Size']) + \" \" + str(dist_info['SizeUnit']))\n print(\"\\tBeginning Data Time: \"+str(i['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime']))\n \n # Bounding Box Info:\n br_array = i['umm']['SpatialExtent']['HorizontalSpatialDomain']['Geometry']['BoundingRectangles']\n for br in br_array:\n print(\"\\tBounding Rectangle: West: {}, North: {}, East: {}, South: {}\".format(br['WestBoundingCoordinate'], br['NorthBoundingCoordinate'], br['EastBoundingCoordinate'], br['SouthBoundingCoordinate']))\n\n related_urls = i['umm']['RelatedUrls']\n for url in related_urls:\n print(\"\\t{} ({})\".format(url[\"URL\"], url['Description']))\n \n \n\nG1664772388-PODAAC 20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 332.360 MB\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777267-PODAAC 20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 331.335 MB\n Beginning Data Time: 2002-06-02T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777275-PODAAC 20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 329.772 MB\n Beginning Data Time: 2002-06-03T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664779141-PODAAC 20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.554 MB\n Beginning Data Time: 2002-06-04T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777247-PODAAC 20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 318.648 MB\n Beginning Data Time: 2002-06-05T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664773829-PODAAC 20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 310.256 MB\n Beginning Data Time: 2002-06-06T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664774358-PODAAC 20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 316.908 MB\n Beginning Data Time: 2002-06-07T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664779133-PODAAC 20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.882 MB\n Beginning Data Time: 2002-06-08T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664773751-PODAAC 20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 328.566 MB\n Beginning Data Time: 2002-06-09T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664774368-PODAAC 20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.510 MB\n Beginning Data Time: 2002-06-10T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\n\n\nUsing the above information, we can find the size and location (both whole file and OPeNDAP) URLs." + "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#before-you-start", + "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#before-you-start", + "title": "Harmony Concise + L2SS-Py Demo", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." + }, + { + "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#running-the-demo", + "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#running-the-demo", + "title": "Harmony Concise + L2SS-Py Demo", + "section": "Running the Demo", + "text": "Running the Demo\nThe remaining notebook walks through constructing a request that first subsets multiple files from a collection and then concatenates the results together into a single output file. This is accomplished using the Harmony coverages API through the use of the harmony-py python library.\nThe collection being used in the demonstration is the ASCATB-L2-25km collection which contains operational near-real-time Level 2 ocean surface wind vector retrievals from the Advanced Scatterometer (ASCAT) on MetOp-B at 25 km sampling resolution.\nThe first step is to import the libraries needed to run the demo.\n\nimport xarray as xr\nimport tempfile\nfrom IPython.display import display, JSON\nfrom datetime import datetime, timedelta, time\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\n\nfrom mpl_toolkits.basemap import Basemap\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport s3fs\n\nimport warnings\nwarnings.filterwarnings('ignore')\n%matplotlib inline\n\nCreate Harmony-py client.\n\nharmony_client = Client(env=Environment.PROD)\n\nWith the client created, we can contruct and validate the request. As this is a subsetting + concatenation request, we specify options on the request that define spatial bounds, variables we are interested in, temporal bounds, and indicated the result should be concatenated. Since this is a near real time dataset, we will request the data from yesterday.\n\ncollection = Collection(id='C2075141559-POCLOUD')\n\nyesterday = datetime.today() - timedelta(days=1)\n\nrequest = Request(\n collection=collection,\n spatial=BBox(-180, -30, 180, 30),\n variables=[\n 'wind_speed', \n 'wind_dir'\n ],\n temporal={\n 'start': datetime.combine(yesterday, time.min),\n 'stop': datetime.combine(yesterday, time.max)\n },\n concatenate=True\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\njob_id = harmony_client.submit(request)\nprint(f'Job ID: {job_id}')\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=046f3430c6ca2f9e3e00d94c0bee2f70' -H 'User-Agent: Windows/10 harmony-py/0.4.2 CPython/3.8.12 python-requests/2.25.1' 'https://harmony.earthdata.nasa.gov/C2075141559-POCLOUD/ogc-api-coverages/1.0.0/collections/wind_speed,wind_dir/coverage/rangeset?forceAsync=true&subset=lat%28-30%3A30%29&subset=lon%28-180%3A180%29&subset=time%28%222022-10-19T00%3A00%3A00%22%3A%222022-10-19T23%3A59%3A59.999999%22%29&concatenate=true'\nJob ID: 87ec4775-7949-482c-96b2-11f5e6941d15\n\n\nAfter submitting the request it is possible to retrieve the current processing status by using the job ID returned from the submission.\n\nharmony_client.status(job_id)\n\n{'status': 'running',\n 'message': 'The job is being processed',\n 'progress': 0,\n 'created_at': datetime.datetime(2022, 10, 20, 22, 45, 28, 721000, tzinfo=tzutc()),\n 'updated_at': datetime.datetime(2022, 10, 20, 22, 45, 29, 72000, tzinfo=tzutc()),\n 'created_at_local': '2022-10-20T15:45:28-07:00',\n 'updated_at_local': '2022-10-20T15:45:29-07:00',\n 'data_expiration': datetime.datetime(2022, 11, 19, 22, 45, 28, 721000, tzinfo=tzutc()),\n 'data_expiration_local': '2022-11-19T14:45:28-08:00',\n 'request': 'https://harmony.earthdata.nasa.gov/C2075141559-POCLOUD/ogc-api-coverages/1.0.0/collections/wind_speed,wind_dir/coverage/rangeset?forceAsync=true&subset=lat(-30%3A30)&subset=lon(-180%3A180)&subset=time(%222022-10-19T00%3A00%3A00%22%3A%222022-10-19T23%3A59%3A59.999999%22)&concatenate=true',\n 'num_input_granules': 16}\n\n\nIf the request is still running, we can wait until the Harmony request has finished processing. This cell will wait until the request has finised.\n\nharmony_client.wait_for_processing(job_id, show_progress=True)\n\n [ Processing: 100% ] |###################################################| [|]\n\n\nNow that the request has completed we can inspect the results using xarray and matplotlib.\nFirst, let’s download the result into a temporary directory\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n['C:\\\\Users\\\\nickles\\\\AppData\\\\Local\\\\Temp\\\\tmpqzco2nld\\\\C2075141559-POCLOUD_merged.nc4']\n\n\nWith the output file downloaded, now we can open concatenated granule using xarray to inspect some of the metadata.\nNotice the variable subset has been successfully executed – only wind_dir and wind_speed vars are present. In addition, there is a new dimension subset_index added to each variable in the dataset. The index of this dimension corresponds to the original file named in the subset_files variable that contained the data at that index.\n\nds = xr.open_dataset(file_names[0], decode_times=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (subset_index: 16, NUMROWS: 596, NUMCELLS: 42)\nCoordinates:\n lat (subset_index, NUMROWS, NUMCELLS) float32 ...\n lon (subset_index, NUMROWS, NUMCELLS) float32 ...\nDimensions without coordinates: subset_index, NUMROWS, NUMCELLS\nData variables:\n subset_files (subset_index) object 'ascat_20221018_222700_metopb_52328_e...\n time (subset_index, NUMROWS, NUMCELLS) float64 ...\n wind_speed (subset_index, NUMROWS, NUMCELLS) float32 ...\n wind_dir (subset_index, NUMROWS, NUMCELLS) float32 ...\nAttributes: (12/18)\n title: MetOp-B ASCAT Level 2 25.0 km Ocean Sur...\n title_short_name: ASCATB-L2-25km\n Conventions: CF-1.6\n institution: EUMETSAT/OSI SAF/KNMI\n source: MetOp-B ASCAT\n software_identification_level_1: 1000\n ... ...\n processing_level: L2\n rev_orbit_period: 6081.7\n orbit_inclination: 98.7\n references: ASCAT Wind Product User Manual, https:/...\n comment: Orbit period and inclination are consta...\n history_json: [{\"date_time\": \"2022-10-20T22:45:37.904...xarray.DatasetDimensions:subset_index: 16NUMROWS: 596NUMCELLS: 42Coordinates: (2)lat(subset_index, NUMROWS, NUMCELLS)float32...valid_min :-9000000valid_max :9000000standard_name :latitudelong_name :latitudeunits :degrees_north[400512 values with dtype=float32]lon(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :36000000standard_name :longitudelong_name :longitudeunits :degrees_east[400512 values with dtype=float32]Data variables: (4)subset_files(subset_index)object...long_name :List of subsetted files used to create this merge product.array(['ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4'],\n dtype=object)time(subset_index, NUMROWS, NUMCELLS)float64...valid_min :0valid_max :2147483647standard_name :timelong_name :timeunits :seconds since 1990-01-01calendar :proleptic_gregorian[400512 values with dtype=float64]wind_speed(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :5000standard_name :wind_speedlong_name :wind speed at 10 munits :m s-1[400512 values with dtype=float32]wind_dir(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :3600standard_name :wind_to_directionlong_name :wind direction at 10 munits :degree[400512 values with dtype=float32]Attributes: (18)title :MetOp-B ASCAT Level 2 25.0 km Ocean Surface Wind Vector Producttitle_short_name :ASCATB-L2-25kmConventions :CF-1.6institution :EUMETSAT/OSI SAF/KNMIsource :MetOp-B ASCATsoftware_identification_level_1 :1000instrument_calibration_version :0software_identification_wind :3301pixel_size_on_horizontal :25.0 kmservice_type :epsprocessing_type :Ocontents :ovwprocessing_level :L2rev_orbit_period :6081.7orbit_inclination :98.7references :ASCAT Wind Product User Manual, https://osi-saf.eumetsat.int/, https://scatterometer.knmi.nl/comment :Orbit period and inclination are constant values. All wind directions in oceanographic convention (0 deg. flowing North)history_json :[{\"date_time\": \"2022-10-20T22:45:37.904685+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.891502+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.825551+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:38.951797+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.479597+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.201629+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.958642+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.611733+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.394288+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.465600+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.632834+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:43.428456+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.471227+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.335118+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.743323+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:43.732829+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:48.424799+00:00\", \"derived_from\": [\"ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4\"], \"program\": \"concise\", \"version\": \"0.5.0\", \"parameters\": \"input_files=[PosixPath('/tmp/tmp6qevy37z/ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4')]\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S2153799015-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}]\n\n\nUsing matplotlib, we can genearte a plot for each granule that makes up this concatenated granule. Plot wind_speed for each granule using subset_index dimension.\n\nfig = plt.figure(figsize=(20, 40))\n\nfor index in range(0, len(ds.subset_index)): \n ax = fig.add_subplot((len(ds.subset_index)+1)//2, 2, index+1, projection=ccrs.PlateCarree())\n\n p = ds.isel(subset_index=index).plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=\"wind_speed\",\n s=1,\n levels=9,\n cmap=\"jet\",\n ax=ax\n )\n \n ax.set_global()\n ax.coastlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nPlot wind_speed for all data in this concatenated granule on a single map. Notice that the data is within the spatial bounds we provided earlier.\n\nplt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\np = ds.plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=\"wind_speed\",\n s=1,\n levels=9,\n cmap=\"jet\",\n ax=ax\n)\n\nax.set_global()\nax.coastlines()\nplt.show()" + }, + { + "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html", + "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html", + "title": "Shapefile Search in the Common Metadata Repository (CMR)", + "section": "", + "text": "CMR allows the upload of ESRI Shapefiles via command line for granule and collection level search. To use this functionality from the command line, we can use python or curl to do our search. This example will run through a python request and a curl command line program for doing shapefile search.\nPrerequisites:\nWe will use a shapefile located in the github/podaac source repository for this search: https://github.com/podaac/tutorials/blob/master/notebooks/resources/gulf_shapefile.zip\nFor more information on collections, granules, and concept-ids, please refer to the following tutorial:\nhttps://github.com/podaac/tutorials/blob/master/notebooks/podaac_cmr_tutorial.ipynb\nThis collection is the MODIS_A-JPL-L2P-v2019.0 Level 2 collection from the Moderate Resolution Imaging Spectroradiometer (MODIS) on the NASA Terra satellite. In the CMR environment it has the collection id:\nC1940473819-POCLOUD" + }, + { + "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#python-tutorial-shapefile-search", + "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#python-tutorial-shapefile-search", + "title": "Shapefile Search in the Common Metadata Repository (CMR)", + "section": "Python tutorial shapefile search", + "text": "Python tutorial shapefile search\nThe following snippet will use the ‘requests’ library along with the shapefile available at github to perform a shapefile search on the CMR. It will return values that overlap or intersect the shapefile provided.\n\nimport requests\nimport json\nimport pprint\n\n# the URL of the CMR searvice\nurl = 'https://cmr.earthdata.nasa.gov/search/granules.json'\n\n#The shapefile we want to use in our search\nshp_file = open('resources/gulf_shapefile.zip', 'rb')\n\n#need to declare the file and the type we are uploading\nfiles = {'shapefile':('gulf_shapefile.zip',shp_file, 'application/shapefile+zip')}\n\n#used to define parameters such as the concept-id and things like temporal searches\nparameters = {'echo_collection_id':'C1940473819-POCLOUD'}\n\nresponse = requests.post(url, files=files, params=parameters)\npp = pprint.PrettyPrinter(indent=2)\npp.pprint(response.json())\n\n{ 'feed': { 'entry': [ { 'boxes': ['28.481 -83.616 49.941 -51.077'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966128926-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '49.94093 -81.73856 31.93185 -83.6126 '\n '30.8223 -71.67589 28.48104 -59.75119 '\n '37.68658 -55.70623 45.51698 '\n '-51.07733 48.7527 -66.02296 49.94093 '\n '-81.73856']],\n 'time_end': '2002-07-04T06:39:59.000Z',\n 'time_start': '2002-07-04T06:35:00.000Z',\n 'title': '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T11:02:35.998Z'},\n { 'boxes': ['10.927 -86.378 32.007 -59.736'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1965906207-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '32.00729 -83.61582 13.9926 -86.3664 '\n '10.92705 -65.23521 28.55306 '\n '-59.73598 30.82465 -71.75616 '\n '32.00729 -83.61582']],\n 'time_end': '2002-07-04T06:44:59.000Z',\n 'time_start': '2002-07-04T06:40:00.000Z',\n 'title': '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T00:49:16.190Z'},\n { 'boxes': ['24.59 -108.887 45.934 -78.166'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '17.538349151611328',\n 'id': 'G1966184358-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '45.93343 -106.75979 27.9175 '\n '-108.87063 26.78721 -97.43111 '\n '24.58949 -85.88849 41.80767 '\n '-78.18217 44.76529 -92.2568 45.93343 '\n '-106.75979']],\n 'time_end': '2002-07-04T08:19:59.000Z',\n 'time_start': '2002-07-04T08:15:00.000Z',\n 'title': '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T13:47:31.352Z'},\n { 'boxes': ['6.959 -111.829 27.994 -85.876'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966151010-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '27.99214 -108.86564 9.98915 '\n '-111.82863 6.95943 -90.93935 '\n '24.66195 -85.8759 27.99214 '\n '-108.86564']],\n 'time_end': '2002-07-04T08:24:59.000Z',\n 'time_start': '2002-07-04T08:20:00.000Z',\n 'title': '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T12:08:23.694Z'},\n { 'boxes': ['29.15 -87.003 50.655 -54.096'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966083052-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '32.55957 -54.09549 50.65467 '\n '-55.92677 49.49397 -71.94393 '\n '46.24421 -86.99546 37.16275 '\n '-81.58549 29.14963 -78.08743 '\n '31.46126 -66.30155 32.55957 '\n '-54.09549']],\n 'time_end': '2002-07-04T17:45:00.000Z',\n 'time_start': '2002-07-04T17:40:00.000Z',\n 'title': '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T08:57:42.956Z'},\n { 'boxes': ['15.564 -104.417 36.655 -76.757'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '20.634543418884277',\n 'id': 'G1966162557-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '18.63178 -76.75741 36.65489 '\n '-79.31566 35.49725 -92.06644 '\n '33.09602 -104.39378 15.56437 '\n '-98.30582 18.63178 -76.75741']],\n 'time_end': '2002-07-04T19:19:59.000Z',\n 'time_start': '2002-07-04T19:15:00.000Z',\n 'title': '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T12:45:28.980Z'},\n { 'boxes': ['22.183 -95.334 43.467 -65.561'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '21.469408988952637',\n 'id': 'G1966027719-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '43.46704 -93.09718 25.44967 '\n '-95.33366 22.18354 -72.7837 39.4902 '\n '-65.56145 42.29645 -79.14141 '\n '43.46704 -93.09718']],\n 'time_end': '2002-07-05T07:25:00.000Z',\n 'time_start': '2002-07-05T07:20:01.000Z',\n 'title': '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T06:11:18.592Z'},\n { 'boxes': ['4.511 -98.385 25.522 -72.768'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '24.31655979156494',\n 'id': 'G1966089108-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '25.52185 -95.33205 7.52587 -98.3848 '\n '4.5112 -77.59271 22.25405 -72.76811 '\n '25.52185 -95.33205']],\n 'time_end': '2002-07-05T07:29:59.000Z',\n 'time_start': '2002-07-05T07:25:01.000Z',\n 'title': '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T09:16:40.271Z'},\n { 'boxes': ['18.257 -120.668 39.456 -92.208'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966064828-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '39.455 -118.21204 21.43644 '\n '-120.66811 18.2618 -98.75371 '\n '35.69537 -92.21542 38.28696 '\n '-105.14129 39.455 -118.21204']],\n 'time_end': '2002-07-05T09:05:00.000Z',\n 'time_start': '2002-07-05T09:00:01.000Z',\n 'title': '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T08:04:19.259Z'},\n { 'boxes': ['17.991 -91.581 39.125 -63.246'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '22.20408535003662',\n 'id': 'G1966080708-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '21.10151 -63.24635 39.12532 '\n '-65.68633 37.97627 -78.84272 35.4481 '\n '-91.57713 17.99084 -85.09664 '\n '21.10151 -63.24635']],\n 'time_end': '2002-07-05T18:25:00.000Z',\n 'time_start': '2002-07-05T18:20:01.000Z',\n 'title': '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T08:49:28.019Z'}],\n 'id': 'https://cmr.earthdata.nasa.gov:443/search/granules.json',\n 'title': 'ECHO granule metadata',\n 'updated': '2022-10-24T23:43:37.549Z'}}" + }, + { + "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#curl-command-line-syntax", + "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#curl-command-line-syntax", + "title": "Shapefile Search in the Common Metadata Repository (CMR)", + "section": "Curl command line syntax", + "text": "Curl command line syntax\nThis command submits the same request as the Python example above, returning search results in JSON format for Granules that share spatial coverage with the input shapefile (resources/gulf_shapefile.zip) and belong to the target Collection (echo_collection_id=C1940473819-POCLOUD):\ncurl -XPOST \"https://cmr.earthdata.nasa.gov/search/granules.json\" -F \"shapefile=@resources/gulf_shapefile.zip;type=application/shapefile+zip\" -F \"echo_collection_id=C1940473819-POCLOUD\" -F \"pretty=true\"\nThe (truncated) results:\n{\n \"feed\" : {\n \"updated\" : \"2020-05-18T22:09:58.452Z\",\n \"id\" : \"https://cmr.earthdata.nasa.gov:443/search/granules.json\",\n \"title\" : \"ECHO granule metadata\",\n \"entry\" : [ {\n \"time_start\" : \"2002-07-04T06:35:00.000Z\",\n \"granule_size\" : \"9.34600830078125E5\",\n \"online_access_flag\" : true,\n \"id\" : \"G1966128926-POCLOUD\",\n \"day_night_flag\" : \"UNSPECIFIED\",\n \"browse_flag\" : true,\n \"time_end\" : \"2002-07-04T06:39:59.000Z\",\n \"coordinate_system\" : \"CARTESIAN\",\n \"polygons\" : [ [ \"-74.21 -163.74 -72.95 -180 -75.43 -180 -74.21 -163.74\" ], [ \"-72.95 180 -69.22 161.56 -63.56 148.24 -59.74 142.63 -54.76 137.29 -43.19 129.21 -28.81 123 -9.39 117.38 70.28 101.89 78.71 98.84 83.8 94.5 85.75 90.5 87.14 84.43 88.59 63.9 89.12 2.26 88.28 -48.29 87.12 -61.14 85.38 -68.1 82.54 -72.63 77.71 -75.93 63.62 -80.05 9.8 -89.82 -15.54 -95.55 -35.84 -102.3 -50.51 -110.4 -56.3 -115.37 -60.99 -120.88 -64.95 -127.37 -68.22 -135.08 -70.76 -143.97 -72.76 -155.11 -74.35 -180 -89.345 -180 -88.32 -113.33 -86.69 -101.61 -83.86 -95.95 -79.32 -92.73 -70.2 -89.86 -10.6 -79.24 16.19 -73.27 33.1 -67.88 46.23 -61.6 52.76 -57.05 57.86 -52.26 62.64 -46.04 66.5 -38.81 69.5 -30.55 71.71 -21.38 74.26 1.26 73.75 29.71 72.1 42.61 69.64 53.42 66.25 62.72 62.36 69.82 57.32 76.19 51.2 81.62 37.2 89.55 18.32 96.04 -10.4 102.56 -70.39 113.28 -79.49 116.19 -83.94 119.43 -86.33 123.83 -87.89 131.86 -86.97 131.68 -85.71 133.93 -81.4 147.95 -77.84 164.04 -75.43 180 -72.95 180\" ], [ \"-74.35 180 -74.81 162.65 -77.45 142.63 -82.89 118.89 -85.78 110.18 -87.46 107.84 -88.13 109.51 -88.85 123.7 -89.345 180 -74.35 180\" ] ],\n \"original_format\" : \"UMM_JSON\",\n \"collection_concept_id\" : \"C1940473819-POCLOUD\",\n \"data_center\" : \"POCLOUD\",\n \"links\" : [ {\n \"rel\" : \"http://esipfed.org/ns/fedsearch/1.1/s3#\",\n \"hreflang\" : \"en-US\",\n \"href\" : \"s3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc\"\n },\n ...\nThis command gets the same listing again with curl, this time returning the search results in their native xml format:\ncurl -XPOST \"https://cmr.earthdata.nasa.gov/search/granules\" -F \"shapefile=@resources/gulf_shapefile.zip;type=application/shapefile+zip\" -F \"echo_collection_id=C1940473819-POCLOUD\" -F \"pretty=true\"\nThe (truncated) results:\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<results>\n <hits>1912</hits>\n <took>970</took>\n <references>\n <reference>\n <name>20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc</name>\n <id>G1966128926-POCLOUD</id>\n <location>https://cmr.earthdata.nasa.gov:443/search/concepts/G1226019017-POCUMULUS/1</location>\n <revision-id>1</revision-id>\n </reference>\n ..." }, { "objectID": "notebooks/DataStories/SWOTHR_Science_Application.html#retrieving-swot-attributes-wse-width-slope-and-plotting-a-longitudinal-profile-along-a-river-or-over-a-basin", @@ -600,357 +632,386 @@ ] }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#summary", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#summary", - "title": "Search by HUC Example", - "section": "Summary", - "text": "Summary\nThis notebook will geospatially search using the PO.DAAC HUC Feature Translation Service (FTS), previewing (viusualizing) the queried region of interest (the Upper Tuolumne River Basin in the San Joaquin River Basin in California’s Sierra Nevada Mountains), and using FTS results to query NASA data. This is a programmatic approach to using the ‘Advanced Search -> River Reach’ query in the Earthdata Search GUI." - }, - { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#requirements", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#requirements", - "title": "Search by HUC Example", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nLearning Objectives\n\nuse the FTS-HUC API (https://fts.podaac.earthdata.nasa.gov/) to define geographic region of interest (query by partial or exact HUC or HUC region name)\nvisualize query\nuse coordinates returned by FTS to query Sentinel-1 data, by polygon or bounding box.\n\nResources USGS Hydrologic unit map to help identifiy region of interest (e.g. HUC value or name) can be found here: https://water.usgs.gov/GIS/regions.html\n\n\nImport libraries\n\nimport sys\nimport requests\nimport json\nfrom shapely.geometry import box, Polygon\nimport matplotlib.pyplot as plt \nimport geopandas as gpd\nimport numpy as np\nimport earthaccess" + "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html", + "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html", + "title": "Harmony EOSS L2SS API Tutorial", + "section": "", + "text": "This notebook will demonstrate how to subset Level 2 data using a sea surface temperature product from the following collection: MODIS_A-JPL-L2P-v2019.0, GHRSST Level 2P Global Sea Surface Skin Temperature from the Moderate Resolution Imaging Spectroradiometer (MODIS) on the NASA Aqua satellite (GDS2)." }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-partial-region-matches", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-partial-region-matches", - "title": "Search by HUC Example", - "section": "Search Feature Translation Service for Partial Region Matches", - "text": "Search Feature Translation Service for Partial Region Matches\nIf you are unsure what the corresponding HUC is for your region of interest, you can query the FTS for partial region matches, by setting EXACT = FALSE.\n\n# Querying partial matches with region \"San Joaquin\"\n# This \"partial\" match is anything that BEGINS with the region specified.\n\nREGION = \"San Joa\"\nEXACT = False\n\n# Query Feature Translation Service and parse JSON response\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/region/{}?exact={}\".format(REGION, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print all elements in HUC database that partially matches with region \"San Jo\"\nprint(json.dumps(response, indent = 4))\n\n{\n \"status\": \"200 OK\",\n \"time\": \"5.954 ms.\",\n \"hits\": 3,\n \"search on\": {\n \"parameter\": \"region\",\n \"exact\": false,\n \"polygon_format\": \"\",\n \"page_number\": 1,\n \"page_size\": 100\n },\n \"results\": {\n \"San Joaquin\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/180400.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,36.36688239563472,-118.65438684397327,38.757297326299295\",\n \"Convex Hull Polygon\": \"-120.63835246068544,36.36688239563472,-120.63808719818587,36.3669077091763,-118.73841884071788,37.07942819140368,-118.67420150956752,37.106490572611676,-118.6735564366519,37.10721677469388,-118.66992847311582,37.11265112260213,-118.65448236168146,37.14116804130782,-118.65438684397327,37.14146941734907,-118.65439289188998,37.14204016109818,-118.66449457312427,37.26170858174572,-118.76220691672262,37.45668952727641,-119.3277000731365,38.0651666159153,-119.68023816217266,38.44035645491624,-119.68779037986923,38.44773399761311,-119.84793537962065,38.5975748484222,-119.85336387752892,38.602501526539584,-119.85360401398685,38.60263670362269,-119.96183540965222,38.66278904519601,-119.96190132840212,38.662814343112586,-120.44062253078403,38.74564163360907,-120.48902702862557,38.753198735680655,-120.5539957670664,38.757297326299295,-120.99357654242573,38.71330113157592,-121.07883122250172,38.679223455587135,-121.0804450745826,38.678464784754965,-121.08111498187321,38.67810103163055,-121.5306744270087,38.43261620596991,-121.53113729471636,38.432277129928764,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.02024189030101,36.55629579221568,-121.01674177780643,36.551948971389095,-121.00775647573704,36.54095870369781,-121.00754228094576,36.54077855369809,-120.90553311860407,36.477056078797034,-120.90373942485684,36.476002641298635,-120.73774029490619,36.387480222686065,-120.73704381990729,36.387168219561545,-120.63835246068544,36.36688239563472\",\n \"Visvalingam Polygon\": \"-120.54009506083798,38.751263262767,-120.64081991068161,38.70357532638269,-120.71727710431293,38.70154573055248,-120.74424469072943,38.67445884830289,-120.82514061977054,38.69750556180878,-120.85090918535553,38.634815070239426,-120.85764353951174,38.6677095441467,-120.96138979351736,38.674692672260846,-120.99357654242573,38.71330113157592,-121.0041938840759,38.682131000374284,-121.08583462874088,38.67462685351097,-121.08290462249539,38.62664741087707,-121.13917907969972,38.62357320671521,-121.2089503806331,38.49669539128712,-121.27717303990221,38.476062632985816,-121.26259156388318,38.44828171636226,-121.30028969090802,38.438934230960115,-121.32968337940406,38.39078809249321,-121.3599304720654,38.390321332077235,-121.44111079277275,38.43287303096952,-121.53153281971572,38.431799249721166,-121.51200092287104,38.3990511351887,-121.52198663431386,38.33135239571044,-121.49836688747553,38.271607430178165,-121.5407886280347,38.202546845910376,-121.6015964498153,38.14619380537283,-121.56855837590825,38.097723677323074,-121.66657562158946,38.09834799503045,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.82191980051499,38.02152160869139,-121.86590229836338,37.98235407021048,-121.86986600564887,37.929583865084055,-121.93679916804501,37.85678621415542,-121.83044241300178,37.83564997147988,-121.73909092251853,37.760126577847075,-121.65209140390357,37.75944488930651,-121.65894963201794,37.70730379459576,-121.61490015812797,37.67537787797863,-121.62601494873576,37.621678591603654,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.46914160210423,37.48928770118414,-121.45782723962179,37.39582026382925,-121.41146298448541,37.388361478424144,-121.40667140011789,37.314010806664555,-121.45952651357749,37.284674128585095,-121.39474167826137,37.15006367462735,-121.36483071268282,37.184255913115976,-121.33036383565297,37.167644427725065,-121.28572767738893,37.18259941936856,-121.24031638058443,37.158712379822305,-121.21668344207944,37.12189013821279,-121.231344697265,37.0835010684807,-121.20818868167595,37.061546638306424,-121.24711760557386,37.03114826752028,-121.24579035974261,36.988509275919796,-121.21167625146222,36.95729284888495,-121.23447995559349,36.92657608434928,-121.19828302127468,36.914258812493415,-121.15294869113671,36.865306701111024,-121.1143471828633,36.769056561677075,-121.04964033921374,36.75343970336803,-121.00617919865618,36.76372240960205,-120.95985347476977,36.720116577378064,-120.99658496742109,36.62860115564513,-121.03185423090798,36.58366134425654,-121.00807903927824,36.54150738807198,-120.83248069892579,36.471554128805565,-120.74546076156088,36.39178235497104,-120.68716579706802,36.39413058205071,-120.63835246068544,36.36688239563472,-120.6130646732247,36.441495923643856,-120.65738012628094,36.45709164132802,-120.66078854919232,36.51874457144066,-120.64111663047282,36.53968963494981,-120.66577184918458,36.58187674217595,-120.63374172840093,36.64829444832287,-120.5664488316304,36.71118111072525,-120.48434472967449,36.748263084626046,-120.44305652348856,36.749373372124296,-120.35291486008686,36.786035749150756,-120.23388445714659,36.767794575220705,-120.09885247506452,36.77904516791159,-119.97666310754585,36.8328416803281,-119.812517053634,36.84792405842967,-119.75333349122587,36.86578132194364,-119.69273040277824,36.92774011559749,-119.62802316329538,36.92294028747989,-119.57222072588195,36.95061687285363,-119.51664880721825,36.95427249159792,-119.46285424792671,36.981914174888345,-119.383642975133,37.05806398310352,-119.2715441169737,37.09415164138085,-119.20212414312311,37.10217027886836,-119.18784042960363,37.143694729845606,-119.0858305964286,37.176455095419726,-118.98052836534208,37.185962293321666,-118.89614518838971,37.208425149536765,-118.82732031245484,37.18283535165983,-118.73841884071788,37.07942819140368,-118.71628753554387,37.10699850281924,-118.67420150956752,37.106490572611676,-118.65448236168146,37.14116804130782,-118.68439308246838,37.24133370261069,-118.66449457312427,37.26170858174572,-118.71612671679412,37.328646110808506,-118.74006027092366,37.316221957702794,-118.78637329272675,37.343784711826686,-118.79007416876266,37.39395630133214,-118.7583354854786,37.444366181462215,-118.79668088958579,37.489443694933925,-118.84989162804482,37.47656995224554,-118.9163347623167,37.5501889677563,-118.99876110906376,37.569233157310066,-119.03902598191792,37.60352632600683,-119.03232058505336,37.62993357596582,-119.06525219021057,37.68462583317262,-119.12706784115625,37.73496690601115,-119.20027055354262,37.73524533309404,-119.2162143024762,37.71411237687687,-119.26841790031187,37.73950751954578,-119.20108320354137,37.801137019450096,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.30948290962311,37.94616478068332,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.54763344883679,38.14419101891764,-119.62908996641869,38.196015076128845,-119.61295248831874,38.2614448656106,-119.65148469659226,38.28643111453016,-119.62837932891978,38.349732117556925,-119.68113032050456,38.40217269768385,-119.68023816217266,38.44035645491624,-119.7679873151614,38.48571382776248,-119.77203659015515,38.518283566253615,-119.83374104110106,38.55282589953333,-119.85360401398685,38.60263670362269,-119.92262494617142,38.60820715882238,-119.96190132840212,38.662814343112586,-120.01568027831865,38.665510678525095,-120.06113182303977,38.63065420878752,-120.12165386565414,38.61454576089585,-120.1460215124913,38.64340277022609,-120.23913430193011,38.62996324108025,-120.24664128108515,38.65589799312335,-120.36064677465816,38.70485176492235,-120.39097328086109,38.70561956804619,-120.44062253078403,38.74564163360907,-120.54009506083798,38.751263262767\",\n \"HUC\": \"180400\"\n },\n \"San Joaquin 2\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/1804.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,36.36688239563472,-118.65438684397327,38.757297326299295\",\n \"Convex Hull Polygon\": \"-120.63835246068544,36.36688239563472,-120.63808719818587,36.3669077091763,-118.73841884071788,37.07942819140368,-118.67420150956752,37.106490572611676,-118.6735564366519,37.10721677469388,-118.66992847311582,37.11265112260213,-118.65448236168146,37.14116804130782,-118.65438684397327,37.14146941734907,-118.65439289188998,37.14204016109818,-118.66449457312427,37.26170858174572,-118.76220691672262,37.45668952727641,-119.3277000731365,38.0651666159153,-119.68023816217266,38.44035645491624,-119.68779037986923,38.44773399761311,-119.84793537962065,38.5975748484222,-119.85336387752892,38.602501526539584,-119.85360401398685,38.60263670362269,-119.96183540965222,38.66278904519601,-119.96190132840212,38.662814343112586,-120.44062253078403,38.74564163360907,-120.48902702862557,38.753198735680655,-120.5539957670664,38.757297326299295,-120.99357654242573,38.71330113157592,-121.07883122250172,38.679223455587135,-121.0804450745826,38.678464784754965,-121.08111498187321,38.67810103163055,-121.5306744270087,38.43261620596991,-121.53113729471636,38.432277129928764,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.02024189030101,36.55629579221568,-121.01674177780643,36.551948971389095,-121.00775647573704,36.54095870369781,-121.00754228094576,36.54077855369809,-120.90553311860407,36.477056078797034,-120.90373942485684,36.476002641298635,-120.73774029490619,36.387480222686065,-120.73704381990729,36.387168219561545,-120.63835246068544,36.36688239563472\",\n \"Visvalingam Polygon\": \"-120.54009506083798,38.751263262767,-120.64081991068161,38.70357532638269,-120.71727710431293,38.70154573055248,-120.74424469072943,38.67445884830289,-120.82514061977054,38.69750556180878,-120.85090918535553,38.634815070239426,-120.85764353951174,38.6677095441467,-120.96138979351736,38.674692672260846,-120.99357654242573,38.71330113157592,-121.0041938840759,38.682131000374284,-121.08583462874088,38.67462685351097,-121.08290462249539,38.62664741087707,-121.13917907969972,38.62357320671521,-121.2089503806331,38.49669539128712,-121.27717303990221,38.476062632985816,-121.26259156388318,38.44828171636226,-121.30028969090802,38.438934230960115,-121.32968337940406,38.39078809249321,-121.3599304720654,38.390321332077235,-121.44111079277275,38.43287303096952,-121.53153281971572,38.431799249721166,-121.51200092287104,38.3990511351887,-121.52198663431386,38.33135239571044,-121.49836688747553,38.271607430178165,-121.5407886280347,38.202546845910376,-121.6015964498153,38.14619380537283,-121.56855837590825,38.097723677323074,-121.66657562158946,38.09834799503045,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.82191980051499,38.02152160869139,-121.86590229836338,37.98235407021048,-121.86986600564887,37.929583865084055,-121.93679916804501,37.85678621415542,-121.83044241300178,37.83564997147988,-121.73909092251853,37.760126577847075,-121.65209140390357,37.75944488930651,-121.65894963201794,37.70730379459576,-121.61490015812797,37.67537787797863,-121.62601494873576,37.621678591603654,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.46914160210423,37.48928770118414,-121.45782723962179,37.39582026382925,-121.41146298448541,37.388361478424144,-121.40667140011789,37.314010806664555,-121.45952651357749,37.284674128585095,-121.39474167826137,37.15006367462735,-121.36483071268282,37.184255913115976,-121.33036383565297,37.167644427725065,-121.28572767738893,37.18259941936856,-121.24031638058443,37.158712379822305,-121.21668344207944,37.12189013821279,-121.231344697265,37.0835010684807,-121.20818868167595,37.061546638306424,-121.24711760557386,37.03114826752028,-121.24579035974261,36.988509275919796,-121.21167625146222,36.95729284888495,-121.23447995559349,36.92657608434928,-121.19828302127468,36.914258812493415,-121.15294869113671,36.865306701111024,-121.1143471828633,36.769056561677075,-121.04964033921374,36.75343970336803,-121.00617919865618,36.76372240960205,-120.95985347476977,36.720116577378064,-120.99658496742109,36.62860115564513,-121.03185423090798,36.58366134425654,-121.00807903927824,36.54150738807198,-120.83248069892579,36.471554128805565,-120.74546076156088,36.39178235497104,-120.68716579706802,36.39413058205071,-120.63835246068544,36.36688239563472,-120.6130646732247,36.441495923643856,-120.65738012628094,36.45709164132802,-120.66078854919232,36.51874457144066,-120.64111663047282,36.53968963494981,-120.66577184918458,36.58187674217595,-120.63374172840093,36.64829444832287,-120.5664488316304,36.71118111072525,-120.48434472967449,36.748263084626046,-120.44305652348856,36.749373372124296,-120.35291486008686,36.786035749150756,-120.23388445714659,36.767794575220705,-120.09885247506452,36.77904516791159,-119.97666310754585,36.8328416803281,-119.812517053634,36.84792405842967,-119.75333349122587,36.86578132194364,-119.69273040277824,36.92774011559749,-119.62802316329538,36.92294028747989,-119.57222072588195,36.95061687285363,-119.51664880721825,36.95427249159792,-119.46285424792671,36.981914174888345,-119.383642975133,37.05806398310352,-119.2715441169737,37.09415164138085,-119.20212414312311,37.10217027886836,-119.18784042960363,37.143694729845606,-119.0858305964286,37.176455095419726,-118.98052836534208,37.185962293321666,-118.89614518838971,37.208425149536765,-118.82732031245484,37.18283535165983,-118.73841884071788,37.07942819140368,-118.71628753554387,37.10699850281924,-118.67420150956752,37.106490572611676,-118.65448236168146,37.14116804130782,-118.68439308246838,37.24133370261069,-118.66449457312427,37.26170858174572,-118.71612671679412,37.328646110808506,-118.74006027092366,37.316221957702794,-118.78637329272675,37.343784711826686,-118.79007416876266,37.39395630133214,-118.7583354854786,37.444366181462215,-118.79668088958579,37.489443694933925,-118.84989162804482,37.47656995224554,-118.9163347623167,37.5501889677563,-118.99876110906376,37.569233157310066,-119.03902598191792,37.60352632600683,-119.03232058505336,37.62993357596582,-119.06525219021057,37.68462583317262,-119.12706784115625,37.73496690601115,-119.20027055354262,37.73524533309404,-119.2162143024762,37.71411237687687,-119.26841790031187,37.73950751954578,-119.20108320354137,37.801137019450096,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.30948290962311,37.94616478068332,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.54763344883679,38.14419101891764,-119.62908996641869,38.196015076128845,-119.61295248831874,38.2614448656106,-119.65148469659226,38.28643111453016,-119.62837932891978,38.349732117556925,-119.68113032050456,38.40217269768385,-119.68023816217266,38.44035645491624,-119.7679873151614,38.48571382776248,-119.77203659015515,38.518283566253615,-119.83374104110106,38.55282589953333,-119.85360401398685,38.60263670362269,-119.92262494617142,38.60820715882238,-119.96190132840212,38.662814343112586,-120.01568027831865,38.665510678525095,-120.06113182303977,38.63065420878752,-120.12165386565414,38.61454576089585,-120.1460215124913,38.64340277022609,-120.23913430193011,38.62996324108025,-120.24664128108515,38.65589799312335,-120.36064677465816,38.70485176492235,-120.39097328086109,38.70561956804619,-120.44062253078403,38.74564163360907,-120.54009506083798,38.751263262767\",\n \"HUC\": \"1804\"\n },\n \"San Joaquin Delta\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/18040003.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,37.50128378554052,-120.83793204891731,38.21666854588847\",\n \"Convex Hull Polygon\": \"-121.48401321978946,37.50128378554052,-121.48319938333242,37.501357755332094,-121.48196255312598,37.50148574804024,-121.05388696212378,37.76071366013787,-120.90450576548068,38.0272342086825,-120.90349268423222,38.02938314201248,-120.83793204891731,38.18877460322341,-120.83800179891722,38.1976922021679,-120.83898908849903,38.19987750528952,-121.02443172883619,38.21666854588847,-121.02474798300238,38.21663954068015,-121.02495458821039,38.216620591721835,-121.61499185396116,38.10789443147394,-121.6671072070053,38.09826675128056,-121.84538162652024,38.06328592216818,-121.85283117130035,38.05978179300695,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.56421756653998,37.54766027817686,-121.54682447177532,37.53336393132406,-121.54584872802684,37.53266251257514,-121.54544794886078,37.532376185492296,-121.54202411449108,37.53037829903707,-121.49308462915042,37.502441020955416,-121.48639323541079,37.501483144915255,-121.48560074791203,37.501374500123745,-121.48401321978946,37.50128378554052\",\n \"Visvalingam Polygon\": \"-121.02143199238253,38.21228919277024,-121.03881544131383,38.21370070526808,-121.05832012565855,38.19822062820873,-121.07285287251102,38.19676138550267,-121.11744717765015,38.17114820429242,-121.14022114948978,38.168721211587865,-121.15031440780746,38.15854012306204,-121.20154061397795,38.143356763710585,-121.27375955553254,38.116192127294426,-121.32007884504395,38.108511572097996,-121.33525729293706,38.09480684191095,-121.35392083665806,38.08854727525397,-121.41605480843663,38.087353247130864,-121.44424249485121,38.08399005338606,-121.4631167833636,38.071604213821956,-121.4724672395991,38.08759970546379,-121.50203907184482,38.091632609624185,-121.5035856697591,38.072714664861905,-121.51886918848538,38.089077872128144,-121.53291849575527,38.091567440874314,-121.56947503215684,38.08615950442436,-121.5702684009056,38.09822388148899,-121.60393055710335,38.10898488355559,-121.63051299143712,38.10154624398382,-121.6371124122602,38.08992846796019,-121.66657562158946,38.09834799503045,-121.68644943926694,38.08549239192541,-121.68354131427145,38.067767361744586,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.80058061825645,38.025494545143545,-121.82947484737826,38.03754110345818,-121.83790479528182,38.06236660550297,-121.8533769712995,38.059398593007586,-121.83359162133019,38.0236317357714,-121.82191980051499,38.02152160869139,-121.8452383838121,37.99565135456487,-121.86590229836338,37.98235407021048,-121.87389402439265,37.949298472345106,-121.88361340562756,37.94069631819184,-121.86986600564887,37.929583865084055,-121.87272500251947,37.917601039061026,-121.88853686499493,37.912210873444394,-121.93679916804501,37.85678621415542,-121.88209073375492,37.84099142667992,-121.86810714523494,37.85399849645137,-121.85208152546818,37.83929578814087,-121.83044241300178,37.83564997147988,-121.8066090526221,37.81308303505659,-121.7922590016027,37.80782963818973,-121.76324145268939,37.7858900934321,-121.76527957768621,37.7773995799036,-121.73909092251853,37.760126577847075,-121.70685220486024,37.77253795491117,-121.69044629863572,37.761101645553936,-121.65209140390357,37.75944488930651,-121.66449931638431,37.74842932369859,-121.6507850361973,37.735751545593246,-121.65918360805927,37.72781387164724,-121.65894963201794,37.70730379459576,-121.63536538726288,37.70130697273004,-121.63448013830595,37.689717726914694,-121.61490015812797,37.67537787797863,-121.60974490188602,37.64429441552687,-121.6227430268658,37.63603342387307,-121.62601494873576,37.621678591603654,-121.61450599042024,37.59930529893006,-121.58214772276216,37.58058849166747,-121.5660067644539,37.54927187400773,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.49308462915042,37.502441020955416,-121.48138812291859,37.505721846992,-121.46184374690722,37.53450626882233,-121.44088779485645,37.54675186776166,-121.42484409071466,37.54751497713545,-121.42580857821315,37.564976893775,-121.38028850640882,37.586133978117175,-121.36222241581186,37.603589127048394,-121.31597830859198,37.6093966551644,-121.2544957930624,37.65727026654844,-121.22158270248849,37.67257598423299,-121.22429523477598,37.68152568213577,-121.2057427212631,37.69569779461375,-121.16857574007076,37.70748815501213,-121.14110785782174,37.729918075810644,-121.11848947660684,37.73365946955482,-121.10911928703808,37.7484026966153,-121.09223503081427,37.74791053724107,-121.09480595685193,37.760903828887535,-121.05617153503692,37.76043123409664,-121.09747076830615,37.76801436220984,-121.15035315884904,37.79415341529426,-121.18449382754608,37.82583186628676,-121.19699943377668,37.826716714202064,-121.2195945576999,37.85136148083046,-121.26523294929575,37.87824116933041,-121.2947732367499,37.913431269275804,-121.271524724286,37.93996951090128,-121.19155812336845,37.95833420253945,-121.11637632452681,37.95492616608641,-121.10437461621211,37.957914906706776,-121.05944651211519,37.95597624525141,-121.0339739194464,37.94209255568967,-121.0166917559315,37.94320716193795,-121.00221693720397,37.95548945983552,-120.97566607266185,37.96720422856731,-120.97877787890707,37.989337251449626,-120.9583201601888,37.98447010979055,-120.940789375841,37.99810579518606,-120.92829857481871,38.01908881702849,-120.90450576548068,38.0272342086825,-120.91396404254931,38.035717584710994,-120.91473279150648,38.05371388572473,-120.95564168727628,38.05178600656103,-120.98212063202686,38.064245121125055,-121.03830712152296,38.03886609408113,-121.06709473606162,38.018101445155025,-121.1009083245508,38.00855445246151,-121.130640501588,38.008583444128135,-121.20277275251772,37.95955794732919,-121.28034443156395,37.99378153581773,-121.26629757012745,38.004894071217166,-121.2374627691305,38.01277404724658,-121.21825716395199,38.036504297209774,-121.1927208462833,38.05271741697629,-121.17248860464804,38.05317975343388,-121.1349351203313,38.074925166941796,-121.1088929182884,38.065759808622715,-121.08234508395464,38.050340206563305,-121.07683546104653,38.075894660690324,-121.06335145898413,38.08001638672556,-121.05341488399955,38.103619159605614,-121.02532235904312,38.11545590229554,-121.02185200800687,38.141849487671266,-120.99854338616802,38.13813815330201,-120.96777642579912,38.14682469287186,-120.9602597226858,38.1365514095545,-120.9325378352288,38.152037275155465,-120.90481372589687,38.15161844286445,-120.90117972173584,38.163558659512546,-120.8795133332278,38.16931939075363,-120.83793204891731,38.18877460322341,-120.83898908849903,38.19987750528952,-120.85724504159566,38.19074097717868,-120.87978625510237,38.18972461780527,-120.89379082070565,38.19927907508213,-120.9222689144114,38.1909182750951,-120.94590735812471,38.20575099590542,-120.97285543933293,38.20184120424483,-121.02143199238253,38.21228919277024\",\n \"HUC\": \"18040003\"\n }\n }\n}" + "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#before-you-start", + "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#before-you-start", + "title": "Harmony EOSS L2SS API Tutorial", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nfrom urllib import request\nfrom http.cookiejar import CookieJar\nimport tempfile\nimport getpass\nimport netrc\nimport json\nimport requests\nimport sys\nimport shutil\nimport xarray as xr\n\n\nFind a granule for subsetting\nBelow we call out a specific granule (G2524986524-POCLOUD) on which we will use the podaac L2 subsetter. Finding this information would complicate the tutorial- but po.daac has a tutorial available for using the CMR API to find collections and granules of interest. Please see this tutorial for that information.\n\ncollection = 'C1940473819-POCLOUD'\nvariable = 'sea_surface_temperature'\nvenue = 'prod'\n\n\n# Defaults\ncmr_root = 'cmr.earthdata.nasa.gov'\nharmony_root = 'https://harmony.earthdata.nasa.gov'\nedl_root = 'urs.earthdata.nasa.gov'" }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-matches", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-matches", - "title": "Search by HUC Example", - "section": "Search Feature Translation Service for Exact HUC Matches", - "text": "Search Feature Translation Service for Exact HUC Matches\nHere we can set a HUC ID, or hydrologic unit code, and use this to query the HUC FTS. By defining the parameter EXACT = True, we tell the query to not search for partial matches.\nBased on the partial name response in the previous step, we can now do an exact search for San Joaquin River Basin, using its HUC ID (1804).\n\n# Querying exact matches for HUC \"1804\" = San Joaquin River Basin\n\nHUC = \"1804\"\nEXACT = True\n\n# Query Feature Translation Service and parse JSON response\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/huc/{}?exact={}\".format(HUC, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print only the region name from the query results of the HUC database\nprint(json.dumps(response[\"results\"][\"1804\"][\"Region Name\"], indent = 4))\n\n\"San Joaquin\"" + "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#subset-of-a-po.daac-granule", + "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#subset-of-a-po.daac-granule", + "title": "Harmony EOSS L2SS API Tutorial", + "section": "Subset of a PO.DAAC Granule", + "text": "Subset of a PO.DAAC Granule\nWe can now build onto the root URL in order to actually perform a transformation. The first transformation is a subset of a selected granule. At this time, this requires discovering the granule id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nAbove we show how to find a granule id for processing.\nNotes: The L2 subsetter current streams the data back to the user, and does not stage data in S3 for redirects. This is functionality we will be adding over time. It doesn’t work with URS backed files, which is coming in the next few weeks it only works on the show dataset, but\n\ncmr_url = \"https://\"+cmr_root+\"/search/granules.umm_json?collection_concept_id=\"+collection+\"&sort_key=-start_date&bounding_box=-90,-45.75,90,-45\"\n\nresponse = requests.get(cmr_url)\n\ngid=response.json()['items'][0]['meta']['concept-id']\nprint(response.json()['items'][0])\nprint(gid)\n\n{'meta': {'concept-type': 'granule', 'concept-id': 'G2525170373-POCLOUD', 'revision-id': 3, 'native-id': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'provider-id': 'POCLOUD', 'format': 'application/vnd.nasa.cmr.umm+json', 'revision-date': '2022-10-25T21:12:59.142Z'}, 'umm': {'TemporalExtent': {'RangeDateTime': {'EndingDateTime': '2022-10-25T18:54:58.000Z', 'BeginningDateTime': '2022-10-25T18:50:01.000Z'}}, 'MetadataSpecification': {'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.4', 'Name': 'UMM-G', 'Version': '1.6.4'}, 'GranuleUR': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'ProviderDates': [{'Type': 'Insert', 'Date': '2022-10-25T21:10:17.165Z'}, {'Type': 'Update', 'Date': '2022-10-25T21:10:17.165Z'}], 'SpatialExtent': {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -85.928, 'NorthBoundingCoordinate': -26.101, 'EastBoundingCoordinate': -54.117, 'SouthBoundingCoordinate': -47.37}], 'GPolygons': [{'Boundary': {'Points': [{'Longitude': -54.11689, 'Latitude': -43.06013}, {'Longitude': -58.42233, 'Latitude': -35.30318}, {'Longitude': -62.29779, 'Latitude': -26.1022}, {'Longitude': -73.93747, 'Latitude': -28.35286}, {'Longitude': -85.92834, 'Latitude': -29.50335}, {'Longitude': -84.04758, 'Latitude': -47.36956}, {'Longitude': -68.62455, 'Latitude': -46.17143}, {'Longitude': -54.11689, 'Latitude': -43.06013}]}}]}}}, 'DataGranule': {'ArchiveAndDistributionInformation': [{'SizeUnit': 'MB', 'Size': 20.64744758605957, 'Checksum': {'Value': 'e2d56b12c5fcbe7f10af1653834d76f6', 'Algorithm': 'MD5'}, 'SizeInBytes': 21650418, 'Name': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'}, {'SizeUnit': 'MB', 'Size': 9.34600830078125e-05, 'Checksum': {'Value': 'a3c500f11b4d0af678f9e8de11397c97', 'Algorithm': 'MD5'}, 'SizeInBytes': 98, 'Name': '20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'}], 'DayNightFlag': 'Unspecified', 'ProductionDateTime': '2022-10-25T21:06:25.000Z'}, 'CollectionReference': {'Version': '2019.0', 'ShortName': 'MODIS_A-JPL-L2P-v2019.0'}, 'RelatedUrls': [{'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Description': 'Download 20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Type': 'GET DATA'}, {'URL': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc', 'Description': 'This link provides direct download access via S3 to the granule', 'Type': 'GET DATA VIA DIRECT ACCESS'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Description': 'Download 20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Type': 'EXTENDED METADATA'}, {'URL': 's3://podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5', 'Description': 'This link provides direct download access via S3 to the granule', 'Type': 'EXTENDED METADATA'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/s3credentials', 'Description': 'api endpoint to retrieve temporary credentials valid for same-region direct s3 access', 'Type': 'VIEW RELATED INFORMATION'}, {'URL': 'https://opendap.earthdata.nasa.gov/collections/C1940473819-POCLOUD/granules/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0', 'Type': 'USE SERVICE API', 'Subtype': 'OPENDAP DATA', 'Description': 'OPeNDAP request URL'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}, {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png', 'Type': 'GET RELATED VISUALIZATION', 'Subtype': 'DIRECT DOWNLOAD', 'MimeType': 'image/png'}]}}\nG2525170373-POCLOUD\n\n\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection_id = Collection(collection) \n\nrequest = Request(\n collection=collection_id,\n spatial=BBox(-90,-45.75,90,45), # lat: (-45.75:45), lon: (-90:90)\n granule_id=gid \n)\n\nrequest.is_valid()\n\nTrue\n\n\n\n# sumbit request and monitor job\njob_id = harmony_client.submit(request)\nprint('\\n Waiting for the job to finish. . .\\n')\nresponse = harmony_client.result_json(job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n\n Waiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n['C:\\\\Users\\\\nickles\\\\AppData\\\\Local\\\\Temp\\\\tmp2hna47qz\\\\20221025185001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4']\n\n\n\nds = xr.open_dataset(file_names[0])\nds\n\nlat_var = None\nlon_var = None\n\n# Determine the lat/lon coordinate names\nfor coord_name, coord in ds.coords.items():\n if 'units' not in coord.attrs:\n continue\n if coord.attrs['units'] == 'degrees_north':\n lat_var = coord_name\n if coord.attrs['units'] == 'degrees_east':\n lon_var = coord_name\n \n# If the lat/lon coordinates could not be determined, use l2ss-py get_coord_variable_names\nif not lat_var or not lon_var:\n from podaac.subsetter import subset\n lat_var_names, lon_var_names = subset.get_coord_variable_names(ds)\n lat_var = lat_var_names[0]\n lon_var = lon_var_names[0]\n\nprint(f'lat_var={lat_var}')\nprint(f'lon_var={lon_var}')\n\nlat_var=lat\nlon_var=lon\n\n\n\nif ds[variable].size == 0:\n print(\"No data in subsetted region. Exiting\")\n sys.exit(0)\n\n\nimport matplotlib.pyplot as plt\nimport math\n\nfig, axes = plt.subplots(ncols=3, nrows=math.ceil((len(ds.data_vars)/3)))\nfig.set_size_inches((15,15))\n\nfor count, xvar in enumerate(ds.data_vars):\n if ds[xvar].dtype == \"timedelta64[ns]\":\n continue\n #ds[xvar].astype('timedelta64[D]').plot(ax=axes[int(count/3)][count%3])\n ds[xvar].plot(ax=axes[int(count/3)][count%3])" }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-and-named-region-matches", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-and-named-region-matches", - "title": "Search by HUC Example", - "section": "Search Feature Translation Service for Exact HUC and Named Region Matches", - "text": "Search Feature Translation Service for Exact HUC and Named Region Matches\nWhat if we are interested in the Toulumne River Basin within the San Joaquin main basin? We can search directly for that basin as well. If we already know an exact region name or HUC in USGS’s Watershed Boundary Dataset (WBD), we can use this or the name of the basin, or search partially like we did above. Below is an example of searching by exact match using HUC ID (e.g. 18040009) that could be modified to search by region name (“Upper Tuolumne”).\n\n# Querying exact matches with HUC \"18040009\" = Upper Tuolumne\n\nHUC = \"18040009\" #or REGION = \"Upper Tuolumne\"\nEXACT = True\n\n# Query Feature Translation Service and parse JSON response\n# If using region, Note the change in endpoint must go from \"/huc\" to \"/region\" and the .format() must change from HUC to REGION\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/huc/{}?exact={}\".format(HUC, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print all elements in HUC database that exactly match HUC \"18040009\"\nprint(json.dumps(response, indent = 4))\n\n{\n \"status\": \"200 OK\",\n \"time\": \"1.659 ms.\",\n \"hits\": 1,\n \"search on\": {\n \"parameter\": \"HUC\",\n \"exact\": true,\n \"polygon_format\": \"\",\n \"page_number\": 1,\n \"page_size\": 100\n },\n \"results\": {\n \"18040009\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/18040009.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.17476593797784,37.57291785522102,-119.19927543166921,38.22952896670182\",\n \"Convex Hull Polygon\": \"-121.105517801627,37.57291785522102,-120.51777999837259,37.58160878749919,-119.26845687218679,37.73942430183757,-119.26095827844847,37.741190162251485,-119.26079495969867,37.74128122475133,-119.25581474616479,37.7450598684955,-119.25563206491506,37.74520087891193,-119.25521361804067,37.745555179953044,-119.20452512020273,37.79316755800414,-119.20311483687158,37.794898117376476,-119.20297581291345,37.79511513091779,-119.20108320354137,37.801137019450096,-119.20096521291657,37.803876760070864,-119.19927543166921,37.88483115890352,-119.19931234937746,37.885001276611604,-119.20064394937538,37.88738135160793,-119.31090541587093,38.044980644071586,-119.3277000731365,38.0651666159153,-119.32796109605277,38.06544024091488,-119.34908448143665,38.08655395234041,-119.62508146642494,38.22905559795254,-119.65624842470987,38.22952896670182,-119.65829346949835,38.22947615316025,-119.79473757241158,38.21799358859471,-119.99491475022586,38.196920114669126,-120.38613654232694,38.056378609678916,-121.15444382863438,37.62884831659255,-121.15500076925849,37.6284224540932,-121.15993039529252,37.62332076451776,-121.16822139007132,37.61386883849076,-121.17452907235321,37.605445134337174,-121.17462853797804,37.60522817287921,-121.17469632131127,37.60502320725453,-121.17471004943627,37.60496802808791,-121.17476593797784,37.604743358296616,-121.17472602131124,37.60443736142207,-121.1743974786034,37.603737121839856,-121.17385444318757,37.603213931215635,-121.12495024430518,37.575249448967384,-121.1206057318119,37.57340581772024,-121.1184699109819,37.573299354178744,-121.105517801627,37.57291785522102\",\n \"Visvalingam Polygon\": \"-119.65612154137676,38.229472830243594,-119.65887392887248,38.21611789588928,-119.68748882882807,38.20072575945488,-119.74423195478164,38.21583016359807,-119.79473757241158,38.21799358859471,-119.80777226405803,38.20387888444998,-119.83634931818034,38.19900379279085,-119.8794751608217,38.205164957364616,-119.92926093053609,38.1903575073876,-119.95874486382365,38.194300821964816,-119.9915583491894,38.18745202718378,-119.99491475022586,38.196920114669126,-120.05974666158357,38.15445730952666,-120.10528053234623,38.13442047414111,-120.12843912918527,38.10262073148215,-120.20521266552441,38.056065841971076,-120.26427926855774,38.061807551337154,-120.34283367885251,38.04442165553081,-120.36616220485797,38.05864021280041,-120.38138515275097,38.04379106074015,-120.39399451523144,38.00852514516987,-120.41557226103123,38.00413815246833,-120.4432863495299,37.97081393481176,-120.45616958284324,37.92842260675252,-120.46878266719864,37.921885701554345,-120.4624829120001,37.891430354726594,-120.479954646348,37.871879250590325,-120.48053337030541,37.82415609128935,-120.5431307066666,37.84913992354228,-120.55227857644405,37.86382160997783,-120.57047251079081,37.845455260006304,-120.5664340514221,37.82240133087544,-120.59755003054045,37.81161053401718,-120.64595511379866,37.78181727677179,-120.67580313979397,37.7973594465393,-120.7399643115694,37.77691864136273,-120.75337800946522,37.73604807163446,-120.78855502295232,37.75464512473059,-120.82306428227372,37.739964848711736,-120.82298294894053,37.72367104352867,-120.84114918537068,37.706087340431,-120.8673865186633,37.69917305085835,-120.87598703427494,37.68470263317249,-120.91724289983591,37.65975447800287,-120.94840845082916,37.657548763422994,-121.0014800642885,37.642007069697115,-121.06141474752877,37.632796530128076,-121.15500076925849,37.6284224540932,-121.17472602131124,37.60443736142207,-121.15475178384224,37.60555392496201,-121.12649717971942,37.5761612791743,-121.105517801627,37.57291785522102,-121.06195388086127,37.58432554999496,-121.051833277752,37.59549621664428,-120.9623811789325,37.616090631195675,-120.93801052688701,37.61182627286894,-120.86057590200721,37.62129079368759,-120.85730386034561,37.613155902033554,-120.78087282192257,37.61414406661538,-120.73817309594716,37.63053679471494,-120.70606299078867,37.6253131207647,-120.65312547628753,37.630845649922776,-120.64372085026048,37.617530275985075,-120.59897548366325,37.61838293640045,-120.58566304618392,37.6280897895104,-120.55437374519079,37.61949203744041,-120.53035751501977,37.62416281034979,-120.52267756711501,37.58373637916253,-120.47482846302262,37.59087335206817,-120.45815308909016,37.620518593688814,-120.4371221932895,37.63718915616295,-120.3849402642038,37.635048797832894,-120.3755883360933,37.65339462697108,-120.39417890064777,37.66818361028146,-120.392313883984,37.68359100504921,-120.3559603048738,37.67552716860342,-120.32610607262848,37.648966585311314,-120.30639988828403,37.66573735924362,-120.3455439350983,37.72512544352645,-120.31539807993676,37.733894229971156,-120.28665821956469,37.72927809560332,-120.28245683519623,37.74541342682829,-120.26069274460497,37.73358365601331,-120.25387803732389,37.749232223697334,-120.200135472824,37.76372567054983,-120.17357968640687,37.79608365070794,-120.12741327606187,37.78170633927192,-120.08906888341306,37.81273366005712,-120.07891344384547,37.82866939649068,-120.05533048450707,37.812757440265386,-120.02518823247055,37.81132716005931,-119.96359235131615,37.78073240906514,-119.94507216905322,37.76542058617224,-119.90693944932076,37.75781682576735,-119.86549272230178,37.77222938512,-119.85359450461186,37.758767389307536,-119.83160174943771,37.76963435595735,-119.80589665676928,37.75608133722835,-119.75060675164673,37.77341942574316,-119.7359645225028,37.78635874968137,-119.6978660861036,37.78960109342637,-119.64907657576265,37.81516770484501,-119.65722697262504,37.83230492565173,-119.59708603105173,37.86135878810666,-119.58892104668939,37.88872669535584,-119.57247042275657,37.8998297015886,-119.53527651760601,37.90190377762701,-119.49696578120711,37.86409281310239,-119.47533168332404,37.85892923602705,-119.45447817606475,37.871394138091034,-119.44539026566218,37.858937875610366,-119.4045319969756,37.85021429541558,-119.40293857510306,37.833821247524384,-119.37314428244099,37.83849664855876,-119.35155096789117,37.82452854545545,-119.3552763335104,37.812805713182,-119.32340220126821,37.79368655279501,-119.29229722319144,37.762878678884476,-119.2876598648653,37.74535544245333,-119.26052065344913,37.74159433725089,-119.24428567430766,37.76834668616766,-119.22055414726117,37.77924966531742,-119.20108320354137,37.801137019450096,-119.21738830351609,37.8183151860901,-119.20449054936944,37.82981189961396,-119.21625690560114,37.847411426669964,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.23787860140095,37.911280908862466,-119.26486444510903,37.91263911719369,-119.26807310656238,37.92880876300194,-119.30948290962311,37.94616478068332,-119.31574230232172,37.96621302648555,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.35845034913046,38.08266815651314,-119.39810467927725,38.1068175096006,-119.43127595110076,38.11332130542388,-119.4403859021283,38.09636985024184,-119.46399499479998,38.09838383773871,-119.4692413104168,38.12798441894279,-119.48819819267908,38.132729004352086,-119.50246159786525,38.159339980352456,-119.50459633952858,38.140964939755975,-119.54763344883679,38.14419101891764,-119.54624260196397,38.15397065015242,-119.5773162810824,38.15780512931315,-119.57980050712018,38.17791634178195,-119.62908996641869,38.196015076128845,-119.62508146642494,38.22905559795254,-119.65612154137676,38.229472830243594\",\n \"Region Name\": \"Upper Tuolumne\"\n }\n }\n}" + "objectID": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#verify-the-subsetting-worked", + "href": "notebooks/harmony subsetting/Harmony L2 Subsetter.html#verify-the-subsetting-worked", + "title": "Harmony EOSS L2SS API Tutorial", + "section": "Verify the subsetting worked", + "text": "Verify the subsetting worked\nBounds used were:\n‘lat’: ‘(-45.75:45)’, ‘lon’: ‘(-90:90)’\n\nvar_ds = ds[variable]\nmsk = xr.ufuncs.logical_not(xr.ufuncs.isnan(var_ds.data.squeeze()))\n\nllat = ds[lat_var].where(msk)\nllon = ds[lon_var].where(msk)\n\nlat_max = llat.max()\nlat_min = llat.min()\n\nlon_min = llon.min()\nlon_max = llon.max()\n\nlon_min = (lon_min + 180) % 360 - 180\nlon_max = (lon_max + 180) % 360 - 180\n\nprint(lon_min)\nprint(lon_max)\nprint(lat_min)\nprint(lat_max)\n\nif lat_max <= 45 and lat_min >= -45.75:\n print(\"Successful Latitude subsetting\")\nelif xr.ufuncs.isnan(lat_max) and xr.ufuncs.isnan(lat_min):\n print(\"Partial Lat Success - no Data\")\nelse:\n assert False\n\n\nif lon_max <= 90 and lon_min >= -90:\n print(\"Successful Longitude subsetting\")\nelif xr.ufuncs.isnan(lon_max) and xr.ufuncs.isnan(lon_min):\n print(\"Partial Lon Success - no Data\")\nelse:\n assert False\n \n\n<xarray.DataArray 'lon' ()>\narray(-85.92834473)\n<xarray.DataArray 'lon' ()>\narray(-54.11688995)\n<xarray.DataArray 'lat' ()>\narray(-45.74999237)\n<xarray.DataArray 'lat' ()>\narray(-27.91536331)\nSuccessful Latitude subsetting\nSuccessful Longitude subsetting" }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#visualization", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#visualization", - "title": "Search by HUC Example", - "section": "Visualization", - "text": "Visualization\nWe can take that response and pass it to the visualize() function created above. The pink polygon is Bounding Box, the green is Convex Hull Polygon and the purple color is Visvalingam Polygon\n\n#visualize FTS response\nvisualize(response)" + "objectID": "notebooks/Tutorials_TEMPLATE.html", + "href": "notebooks/Tutorials_TEMPLATE.html", + "title": "Tutorial Title", + "section": "", + "text": "Internal Note:\nor", + "crumbs": [ + "Contribute", + "Tutorial Template" + ] }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-bounding-box", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-bounding-box", - "title": "Search by HUC Example", - "section": "Query Data by Bounding Box", - "text": "Query Data by Bounding Box\nWe can use results obtained from the FTS to then directly and automatically query on data using the earthaccess Python library. We use the bounding box representing Upper Tuolumne River Basin extracted from the response above, and search for granules available from the SWOT mission, as an example.\n\nshortname = 'SWOT_L2_HR_Raster_2.0' # SWOT Raster files\nHUC = \"18040009\"\n\n# Obtain bounding box from response\nbbox = response['results'][HUC]['Bounding Box']\nbbox_vals = []\nfor val in bbox.split(','): bbox_vals.append(float(val)) #transform string into values\n\n# Query data by bounding box\nresults = earthaccess.search_data(short_name=shortname, bounding_box=(bbox_vals[0],bbox_vals[1],bbox_vals[2],bbox_vals[3]))\n\nGranules found: 84" + "objectID": "notebooks/Tutorials_TEMPLATE.html#summary", + "href": "notebooks/Tutorials_TEMPLATE.html#summary", + "title": "Tutorial Title", + "section": "Summary", + "text": "Summary\n[Add summary/tutorial description here]", + "crumbs": [ + "Contribute", + "Tutorial Template" + ] }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-polygon", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-polygon", - "title": "Search by HUC Example", - "section": "Query Data by Polygon", - "text": "Query Data by Polygon\nInstead of querying via bounding box from the FTS response, we can extract the polygon of the region and use this to query.\n\nshortname = 'SWOT_L2_HR_Raster_2.0' # SWOT Raster files\nHUC = \"18040009\"\n\n#obtain polygon from response\npolygon_v = response['results'][HUC]['Visvalingam Polygon']\n\n#transform string into list of values\npolygon_vals = []\nfor val in polygon_v.split(','): polygon_vals.append(float(val)) \n#change list to correct tuple format to input into earthaccess query\nit = iter(polygon_vals)\npoly = [(x, next(it)) for x in it]\n\n# Query by polygon\nresults = earthaccess.search_data(short_name=shortname, polygon=poly)\n\nGranules found: 70" + "objectID": "notebooks/Tutorials_TEMPLATE.html#requirements", + "href": "notebooks/Tutorials_TEMPLATE.html#requirements", + "title": "Tutorial Title", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\ninternal note (remove this note in final tutorial): keep one or both of these Req 1 depending on environment required to run the noteook\nThis tutorial can be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. Additional Requirements\nAny other requirements needed for reproducing this tutorial.", + "crumbs": [ + "Contribute", + "Tutorial Template" + ] }, { - "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#check-with-earthdata-search", - "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#check-with-earthdata-search", - "title": "Search by HUC Example", - "section": "Check with Earthdata Search", - "text": "Check with Earthdata Search\nTo find granules in Earthdata Search, we need to first search for the collection. You can search for ‘SWOT L2 Raster 2.0’ in the top left corner to find the Soil Mositure dataset. Earthdata allows you to do an Advanced seach over a HUC region. You can search by HUC ID or HUC region. In our case, let’s search for “HUC Region” and “Upper Tuolumne” .\n\n\n\nAdvanced Search\n\n\nFinally, we can locate the total number of granules from the search which matches with the one we identified.\nAlso, our search in Earth Data has a unique url with a project ID. This url corresponds to SWOT Raster granules within the Upper Tuolumne:\nhttps://search.earthdata.nasa.gov/search/granules?projectId=3520324655\n\n\n\nEarthdata Granules" + "objectID": "notebooks/Tutorials_TEMPLATE.html#learning-objectives", + "href": "notebooks/Tutorials_TEMPLATE.html#learning-objectives", + "title": "Tutorial Title", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nenter objective\nenter objective\n…", + "crumbs": [ + "Contribute", + "Tutorial Template" + ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#working-with-in-situ-measurements-and-satellite-hydrology-data-in-the-cloud", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#working-with-in-situ-measurements-and-satellite-hydrology-data-in-the-cloud", - "title": "Mississippi River Heights Exploration:", - "section": "Working with In Situ Measurements and Satellite Hydrology Data in the Cloud", - "text": "Working with In Situ Measurements and Satellite Hydrology Data in the Cloud\n\nLearning Objectives\n\nAccess data from the cloud (Pre-SWOT MEaSUREs river heights) and utilize in tandem with locally hosted dataset (USGS gauges)\nSearch for products using Earthdata Search GUI\nAccess datasets using xarray and visualize\n\nThis tutorial explores the relationships between satellite and in situ river heights in the Mississippi River using the data sets listed below. The notebook is designed to be executed in Amazon Web Services (AWS) (in us-west-2 region where the cloud data is located).", + "objectID": "notebooks/Tutorials_TEMPLATE.html#import-packages", + "href": "notebooks/Tutorials_TEMPLATE.html#import-packages", + "title": "Tutorial Title", + "section": "Import Packages", + "text": "Import Packages\n\n# e.g. \nimport earthaccess\nimport xarray as xr", "crumbs": [ - "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Contribute", + "Tutorial Template" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#datasets", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#datasets", - "title": "Mississippi River Heights Exploration:", - "section": "Datasets", - "text": "Datasets\nThe tutorial itself will use two different datasets:\n1. PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\n\nDOI: https://doi.org/10.5067/PSGRA-DA2V2\n\nThe NASA Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program virtual river height gauges from various altimeter satellites. \n2. USGS Water Data for the Nations River Gauges\n\nURL: https://dashboard.waterdata.usgs.gov/app/nwd/?region=lower48&aoi=default\n\nRiver heights are obtained from the United States Geologic Survey (USGS) National Water Dashboard.", + "objectID": "notebooks/Tutorials_TEMPLATE.html#authenticate", + "href": "notebooks/Tutorials_TEMPLATE.html#authenticate", + "title": "Tutorial Title", + "section": "Authenticate", + "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "crumbs": [ + "Contribute", + "Tutorial Template" + ] + }, + { + "objectID": "notebooks/GIS/SWOTshp_CSVconversion.html#before-you-start", + "href": "notebooks/GIS/SWOTshp_CSVconversion.html#before-you-start", + "title": "SWOT Shapefile Data Conversion to CSV", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\n\nauth = earthaccess.login() \n\n\nSearch for SWOT data\nLet’s start our search for Lake Vector Shapefiles in North America. SWOT files come in “Prior”, “Obs” or “Unassigned” versions in the same collection, here we want the Prior Lakes from the Prior Lake Database. We will also only get files for North America, or ‘NA’ and can call out a specific pass number that we want. Each dataset has it’s own shortname associate with it, for the SWOT Lake shapefiles, it is SWOT_L2_HR_LakeSP_2.0.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n temporal = ('2024-01-01 00:00:00', '2024-05-30 23:59:59'), # can also specify by time\n granule_name = '*Prior*_009_NA*') # here we filter by Prior files (not observed or Unassigned), pass=009, continent code=NA\n\nGranules found: 4\n\n\nDuring the science orbit, a pass will be repeated once every 21 days. A particular location may have different passes observe it within the 21 days, however.\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_files/\")\nfolder = Path(\"../datasets/data_downloads/SWOT_files\")\n\n Getting 4 granules, approx download size: 0.27 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\nUnzip shapefiles in existing folder\n\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nOpening multiple shapefiles from within a folder\nLets open all the shapefiles we’ve downloaded together into one database. This approach is ideal for a small number of granules, but if you’re looking to create large timeseries, consider using the PO.DAAC Hydrocron tool.\n\n# Initialize list of shapefiles containing all dates\nSWOT_HR_shps = []\n\n# Loop through queried granules to stack all acquisition dates\nfor j in range(len(results)):\n filename = earthaccess.results.DataGranule.data_links(results[j], access='external')\n filename = filename[0].split(\"/\")[-1]\n filename_shp = filename.replace('.zip','.shp')\n filename_shp_path = f\"{folder}\\{filename_shp}\"\n SWOT_HR_shps.append(gpd.read_file(filename_shp_path)) \n\n\n# Combine granules from all acquisition dates into one dataframe\nSWOT_HR_df = gpd.GeoDataFrame(pd.concat(SWOT_HR_shps, ignore_index=True))\n\n# Sort dataframe by lake_id and time\nSWOT_HR_df = SWOT_HR_df.sort_values(['lake_id', 'time'])\n\nSWOT_HR_df\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n42426\n7120818372\nno_data\n712239L000048\n100\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n4.374300e+02\n6.300000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41107 47.75727, -93.41081 47.757...\n\n\n97969\n7120818372\nno_data\n712239L000028\n100\n1\n7.612870e+08\n7.612870e+08\n2024-02-15T04:35:57Z\n4.373460e+02\n7.900000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41115 47.75730, -93.41090 47.757...\n\n\n156135\n7120818372\nno_data\n712239L000025\n100\n1\n7.648924e+08\n7.648924e+08\n2024-03-27T22:06:05Z\n4.377310e+02\n5.600000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41200 47.75739, -93.41174 47.757...\n\n\n215861\n7120818372\nno_data\n712239L000027\n92\n1\n7.666951e+08\n7.666951e+08\n2024-04-17T18:51:11Z\n4.376710e+02\n2.300000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41199 47.75734, -93.41174 47.757...\n\n\n42460\n7120818382\nno_data\n712239L000049\n99\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n4.257550e+02\n2.100000e-02\n...\nRAT LAKE\n-99999999\n-93.357210\n47.749259\n-1.000000e+12\n0.1989\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.35303 47.75061, -93.35273 47.750...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n206470\n7710076862\nno_data\n771190R000017\n86\n1\n7.666946e+08\n7.666946e+08\n2024-04-17T18:43:01Z\n2.810479e+03\n3.900000e-02\n...\nno_data\n-99999999\n-99.916944\n19.984955\n-1.000000e+12\n0.0459\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-99.91661 19.98636, -99.91650 ...\n\n\n36628\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n73000\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n130255\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n188022\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n\n\n225984 rows × 51 columns\n\n\n\n\n\nQuerying a Shapefile\nLet’s get the attributes from a particular reach of the merged shapefile. If you want to search for a specific lake_id, Lake IDs can be identified in the Prior Lake Database (PLD) - Add in the PLD layer into Hydroweb.next to see the lakes SWOT products are based upon.\n\nreach = SWOT_HR_df.query(\"lake_id == '7120818372'\")\nreach\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n42426\n7120818372\nno_data\n712239L000048\n100\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n437.430\n0.063\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41107 47.75727, -93.41081 47.757...\n\n\n97969\n7120818372\nno_data\n712239L000028\n100\n1\n7.612870e+08\n7.612870e+08\n2024-02-15T04:35:57Z\n437.346\n0.079\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41115 47.75730, -93.41090 47.757...\n\n\n156135\n7120818372\nno_data\n712239L000025\n100\n1\n7.648924e+08\n7.648924e+08\n2024-03-27T22:06:05Z\n437.731\n0.056\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41200 47.75739, -93.41174 47.757...\n\n\n215861\n7120818372\nno_data\n712239L000027\n92\n1\n7.666951e+08\n7.666951e+08\n2024-04-17T18:51:11Z\n437.671\n0.023\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41199 47.75734, -93.41174 47.757...\n\n\n\n\n4 rows × 51 columns\n\n\n\n\n\nConverting to CSV\nWe can convert the merged timeseries geodataframe for this reach into a csv file.\n\ngdf.to_csv(folder / 'csv_7120818372.csv')", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "Transform Data", + "Lake Time Series" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#needed-packages", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#needed-packages", - "title": "Mississippi River Heights Exploration:", - "section": "Needed Packages", - "text": "Needed Packages\n\nimport os\nimport glob\nimport s3fs\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy\nimport csv\nfrom datetime import datetime\nfrom os.path import isfile, basename, abspath", + "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#summary", + "href": "notebooks/GIS/SWOT_datetime_GIS.html#summary", + "title": "SWOT Date/Time Transformation", + "section": "Summary", + "text": "Summary\nThe following workflow lets you create time series plots with various Geographical Information System (GIS) Desktop softwares by transforming SWOT_L2_HR_RiverSP_2.0 Shapefile vector datasets.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Datetime Conversion" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#get-temporary-aws-credentials-for-access", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#get-temporary-aws-credentials-for-access", - "title": "Mississippi River Heights Exploration:", - "section": "Get Temporary AWS Credentials for Access", - "text": "Get Temporary AWS Credentials for Access\nS3 is an ‘object store’ hosted in AWS for cloud processing. Direct S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. Note, these temporary credentials are valid for only 1 hour. A netrc file is required to aquire these credentials. Use the NASA Earthdata Authentication to create a netrc file in your home directory. (Note: A NASA Earthdata Login is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.)\nThe following crediential is for PODAAC, but other credentials are needed to access data from other NASA DAACs.\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\nCreate a function to make a request to an endpoint for temporary credentials.\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nSet up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint.\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})", + "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#requirements", + "href": "notebooks/GIS/SWOT_datetime_GIS.html#requirements", + "title": "SWOT Date/Time Transformation", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\n\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\nLearning Objectives:\n\nAccessing SWOT shapefile hydrology dataset through earthaccess and downloading it locally.\nUtilizing geoprocessing tools with GIS Desktop Softwares; ArcGIS Pro and QGIS.\nTransforming ‘time_str’ attribute/variable to a Date/Time data type.\n\nUtilizing the new data type variable to create a time series plot/chart.\n\n\n\n\nImport libraries\n\nimport os\nimport glob \nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport zipfile\nimport earthaccess", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Datetime Conversion" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#pre-swot-measures-river-heights", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#pre-swot-measures-river-heights", - "title": "Mississippi River Heights Exploration:", - "section": "Pre-SWOT MEaSUREs River Heights", - "text": "Pre-SWOT MEaSUREs River Heights\nThe shortname for MEaSUREs is ‘PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2’ with the concept ID: C2036882359-POCLOUD. The guidebook explains the details of the Pre-SWOT MEaSUREs data.\nOur desired MEaSUREs variable is river height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Mississippi River. Time is between April 8, 1993 and April 20, 2019.\nFor this dataset, we found the cloud-enabled data directly using the Earthdata Search (see the Earthdata Search for downloading data tutorial) by searching directly for the concept ID, and locating the granule needed, G2105959746-POCLOUD, that will show us the Mississippi river.\n\n\n\nimage.png\n\n\nThe s3 link for this granule can be found in it’s meta data by viewing the details of the granule from the button with three vertical dots in the corner. The s3 link is under ‘relatedURLs’, or it can be found by going through the download process and instead of downloading, clicking the tab entitled “AWS S3 Access.”\n\n\n\nimage.png\n\n\nLet’s access the netCDF file from an s3 bucket and look at the data structure.\n\ns3_MEaSUREs_url = 's3://podaac-ops-cumulus-protected/PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2/North_America_Mississippi1kmdaily.nc'\n\n\ns3_file_obj = fs_s3.open(s3_MEaSUREs_url, mode='rb')\n\n\nds_MEaSUREs = xr.open_dataset(s3_file_obj, engine='h5netcdf')\nds_MEaSUREs\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (X: 2766, Y: 2766, distance: 2766, time: 9440,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-14T17:00:38.973026816 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 -89.35 -89.35 -89.36 ... -92.42 -92.43\n lat (Y) float64 29.27 29.28 29.29 ... 44.56 44.56 44.57\n FD (distance) float64 10.01 1.01e+03 ... 2.765e+06\n height (distance, time) float64 ...\n sat (charlength, time) |S1 ...\n storage (distance, time) float64 ...\n IceFlag (time) float64 nan nan nan nan nan ... nan nan nan nan\n LakeFlag (distance) float64 0.0 0.0 0.0 0.0 ... 1.0 1.0 1.0 1.0\n Storage_uncertainty (distance, time) float64 ...\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: 44.56663081735837\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 201.5947042200621\n geospatial_vertical_min: -2.2912740783007286\n geospatial_vertical_units: m\n geospatial_vertical_positive: upxarray.DatasetDimensions:X: 2766Y: 2766distance: 2766time: 9440charlength: 26Coordinates: (1)time(time)datetime64[ns]1993-04-14T17:00:38.973026816 .....long_name :timestandard_name :timeaxis :Tarray(['1993-04-14T17:00:38.973026816', '1993-04-15T17:00:38.973026816',\n '1993-04-16T17:00:38.973026816', ..., '2019-04-16T15:38:57.639261696',\n '2019-04-17T15:38:57.639261696', '2019-04-18T15:38:57.639261696'],\n dtype='datetime64[ns]')Data variables: (9)lon(X)float64...units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :Xarray([-89.345393, -89.351435, -89.356849, ..., -92.404921, -92.416217,\n -92.42713 ])lat(Y)float64...units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Yarray([29.273779, 29.281522, 29.288734, ..., 44.558685, 44.562254, 44.566631])FD(distance)float64...long_name :distance_from_river_mouthunits :kmcomment :This is the distance along the river centerline from the river mouth to this VS.array([1.000915e+01, 1.010009e+03, 2.010009e+03, ..., 2.763010e+06,\n 2.764010e+06, 2.765010e+06])height(distance, time)float64...units :mpositive :uplong_name :interpolated_heightsstandard_name :heightvalid_min :-2.2912740783007286valid_max :201.5947042200621comment :A time flow distance grid of river water heights with respect to the EGM08 Geoid).-9999 fill values are for missing data, while -9995 fill values are for lakes and reservoirs.[26111040 values with dtype=float64]sat(charlength, time)|S1...long_name :satellitecomment :The satellite the measurement is derived from.[245440 values with dtype=|S1]storage(distance, time)float64...units :km3positive :uplong_name :river_channel_storagecomment :A time flow distance grid of river channel storage values.[26111040 values with dtype=float64]IceFlag(time)float64...long_name :Ice_Flagvalid_range :0, 1flag_masks :1flag_meaning :Time of ice covercomment : This is a flag for masking out times of Ice Cover.array([nan, nan, nan, ..., nan, nan, nan])LakeFlag(distance)float64...long_name :Lake_Flagvalid_range :0, 1flag_masks :1flag_meaning :River sections that are lakes or reservoirscomment : This is a flag for masking out setions that are lakes or reservoirs.array([0., 0., 0., ..., 1., 1., 1.])Storage_uncertainty(distance, time)float64...units :km3positive :uplong_name :river_channel_storage_uncertaintycomment :A time flow distance grid of river channel storage uncertainty values.[26111040 values with dtype=float64]Attributes: (40)title :GRRATS (Global River Radar Altimetry Time Series)1km daily interpolation for the Mississippi RiverConventions :CF-1.6, ACDD-1.3institution :Ohio State University, School of Earth Sciencessource :MEaSUREs OSU Storage toolbox 2018keywords :EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURFACE WATER,SURFACE WATER PROCESSES/MEASUREMENTS,STAGE HEIGHTkeywords_vocabulary :Global Change Master Directory (GCMD)cdm_data_type :stationcreator_name :Coss,Stevecreator_email :Coss.31@osu.eduproject :MEaSUREs OSUprogram :NASA Earth Science Data Systems (ESDS)publisher_name :PO.DAAC (Physical Oceanography Distributed Active Archive Center)publisher_email :podaac@podaac.jpl.nasa.govpublisher_url :podaac.jpl.nasa.govpublisher_type :Institutionpublisher_institution :PO.DAACprocessing_level :L2doi :10.5067/PSGRA-DA2V2history :This GRRATS product adds data river surface height data from ERS1, ERS2, TOPEX/Poseidon and Jason-3 to expand the temporal coverage of the product. GRRATS1kd includes interpolated daily 1km resolution height measurements as well as river channel storage measurements. platform :ERS-1(L2),ERS-2(L2),TOPEX/POSEIDON(L2), Jason-1(L2),OSTM/Jason-2(L2),Jason-3(L2),Envisat(L2)platform_vocabulary :NASA/GCMD Platform Keywords. Version 8.6instrument :RA(L2),RA-2(L2),ALT(TOPEX)(L2),POSEIDON-2(L2),POSEIDON-3(L2),POSEIDON-3b(L2)instrument_vocabulary :NASA/GCMD Platform Keywords. Version 8.6references :in review :doi.org/10.5194/essd-2019-84id :GRRATS(Global River Radar Altimeter Time Series) 1km/dailysummary :The Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolations are river heights from ERS1, ERS2, TOPEX/Poseidon OSTM/Jason-2 Envisat and Jason-3 that are interpolated and processed to create a continuous heights for the study over the temporal range of the altimeters used. The purpose of these heights are to provide satellite altimetric river height data in a form that is more recognizable to the observational community and as a way to get users use to using satellite data for river hydrology.time_coverage_resolution :1 daydate_created :2021-06-30T10:30:44time_coverage_start :1992-04-14T17:00:38time_coverage_end :2018-04-18T15:38:57geospatial_lon_min :-92.42712987654255geospatial_lon_max :-89.09954782976848geospatial_lon_units :degree_eastgeospatial_lat_min :29.27377910202398geospatial_lat_max :44.56663081735837geospatial_lat_units :degree_northgeospatial_vertical_max :201.5947042200621geospatial_vertical_min :-2.2912740783007286geospatial_vertical_units :mgeospatial_vertical_positive :up\n\n\n\nPlot a subset of the data\nPlotting the river distances and associated heights on the map at time t=9069 (March 16, 2018) using plt.\n\nfig = plt.figure(figsize=[11,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-100, -70, 25, 45])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()", + "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#authentication-with-earthaccess", + "href": "notebooks/GIS/SWOT_datetime_GIS.html#authentication-with-earthaccess", + "title": "SWOT Date/Time Transformation", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch using earthaccess for SWOT River Reaches\nEach dataset has it’s own unique collection concept ID. For this dataset it is SWOT_L2_HR_RiverSP_2.0. SWOT files come in “reach” and “node” versions in this same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_NA_*') # here we filter by Reach files (not node), continent code=NA\n\nGranules found: 192\n\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_files\")\n\n\n\nUnzip shapefiles to existing folder\n\nfolder = Path(\"../datasets/data_downloads/SWOT_files\")\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nMerging multiple reaches to a single shapefile\nSince a time series plot will be created, merging all the shapefiles to one will be the better option.\n\n# State filename extension to look for within folder, in this case .shp which is the shapefile\nshapefiles = folder.glob(\"*.shp\")\n\n# Merge/Combine multiple shapefiles in folder into one\ngdf = pd.concat([\n gpd.read_file(shp)\n for shp in shapefiles\n]).pipe(gpd.GeoDataFrame)\n\n# Export merged geodataframe into shapefile\ngdf.to_file(folder / 'SWOTReaches.shp')", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Datetime Conversion" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#usgs-gauge-river-heights", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#usgs-gauge-river-heights", - "title": "Mississippi River Heights Exploration:", - "section": "USGS Gauge River Heights", - "text": "USGS Gauge River Heights\nIn situ measurements on the Mississippi River can be obtained from the United States Geologic Survey (USGS) National Water Dashboard.\nHere, we zoom into one of the streamgauges toward the outlet of the Mississippi River, Monitoring location 07374525: Mississippi River at Belle Chasse, LA highlighted in green. \nIf the point is selected, data can be obtained for the particular location. This gauge is located at lon, lat: (-89.977847, 29.85715084) and we can obtain gauge height for the time period October 2008 - 2021.\nOnce the text file is downloaded for the gauge heights, and the headers removed, it can be uploaded to the cloud as a dataframe to work alongside the MEaSUREs data. Click the upload files button in the top left corner to do so.\n\ndf_gauge_data = pd.read_csv('Mississippi_outlet_gauge.txt', delimiter = \"\\t\")\n#clean data and convert units to meters\ndf_gauge_data.columns = [\"agency\", \"site_no\", \"datetime\", \"river_height\", \"qual_code\"]\ndf_gauge_data['datetime'] = pd.to_datetime(df_gauge_data['datetime']) \ndf_gauge_data['river_height'] = df_gauge_data['river_height']*0.3048\ndf_gauge_data\n\n\n\n\n\n\n\n\nagency\nsite_no\ndatetime\nriver_height\nqual_code\n\n\n\n\n0\nUSGS\n7374525\n2008-10-29\n2.322576\nA\n\n\n1\nUSGS\n7374525\n2008-10-30\n2.337816\nA\n\n\n2\nUSGS\n7374525\n2008-10-31\n2.368296\nA\n\n\n3\nUSGS\n7374525\n2008-11-01\n2.356104\nA\n\n\n4\nUSGS\n7374525\n2008-11-02\n2.459736\nA\n\n\n...\n...\n...\n...\n...\n...\n\n\n4807\nUSGS\n7374525\n2021-12-27\n2.819400\nA\n\n\n4808\nUSGS\n7374525\n2021-12-28\n2.901696\nA\n\n\n4809\nUSGS\n7374525\n2021-12-29\n2.919984\nA\n\n\n4810\nUSGS\n7374525\n2021-12-30\n2.874264\nA\n\n\n4811\nUSGS\n7374525\n2021-12-31\n2.819400\nA\n\n\n\n\n4812 rows × 5 columns\n\n\n\n\nPlot the data\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(df_gauge_data.datetime, df_gauge_data.river_height, color = 'darkorange')\n\nplt.xlabel('Date')\nplt.ylabel('USGS River Height (m)')\n\nplt.title('Mississippi River Gauge 07374525, 2008-2021')\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\n\nFind the same location in the MEaSUREs Dataset using lat/lon\nThe closest location in the MEaSUREs dataset to the gauge (-89.977847, 29.85715084) is at index 106 where lon, lat is (-89.976628, 29.855369). We’ll use this for comparison.\n\nds_MEaSUREs.lat[106]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lat' ()>\narray(29.855369)\nAttributes:\n units: degrees_north\n long_name: latitude\n standard_name: latitude\n axis: Yxarray.DataArray'lat'29.86array(29.855369)Coordinates: (0)Attributes: (4)units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Y\n\n\n\nds_MEaSUREs.lon[106]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lon' ()>\narray(-89.976628)\nAttributes:\n units: degrees_east\n long_name: longitude\n standard_name: longitude\n axis: Xxarray.DataArray'lon'-89.98array(-89.976628)Coordinates: (0)Attributes: (4)units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :X\n\n\n\nfig = plt.figure(figsize=[14,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-90.5, -89.5, 29.3, 30])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon[106], ds_MEaSUREs.lat[106], lw=1)\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nCombined timeseries plot of river heights from each source\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(df_gauge_data.datetime[0:3823], df_gauge_data.river_height[0:3823], color = 'darkorange')\nds_MEaSUREs.height[106,5657:9439].plot(color='darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\n\nLooks like the datums need fixing!\nThe USGS gauge datum is 6.58 feet below NAVD88 GEOID12B EPOCH 2010, while the MEaSUREs datum is height above the WGS84 Earth Gravitational Model (EGM 08) geoid, causing this discrepancy.", + "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#arcgis-pro", + "href": "notebooks/GIS/SWOT_datetime_GIS.html#arcgis-pro", + "title": "SWOT Date/Time Transformation", + "section": "ArcGIS Pro", + "text": "ArcGIS Pro\nEsri’s ArcGIS Pro offers a geoproccesing tool called ‘Convert Time Field’.\nThis allows the transformation of date and time values to be created from one field to another.\nIn this case the date/time field ‘time_str’ is in a text data type format. It needs to be converted to a date/time data type in order to create a time series plot.\nThe ‘no_data’ values do not get converted; it keeps it as ‘NULL’\n\n\n\n\nOnce the new field is created, this allows for the creation of a time series plot.\nThis is a great way to observe an area with multiple days of measurements.\nIn this case, we will configure a line plot in the chart properties of the median of water surface elevation ‘wse’.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Datetime Conversion" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#use-case-validation", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#use-case-validation", - "title": "Mississippi River Heights Exploration:", - "section": "Use Case: Validation", - "text": "Use Case: Validation\nTo validate the MEaSUREs dataset, the authors of the dataset actually compare relative heights between gauges, as opposed to absolute heights, in order to avoid the influence of datum errors and the lack of correspondence between satellite ground tracks and gauge locations. They calculate relative heights by removing the long-term mean of difference between the sample pairs of virtual station heights and the stage measured by the stream gauges. We’ll repeat this method below for completeness and calculate the Nash-Sutcliffe Efficiency (NSE) value.\n\n#create dataframes of the two dataset river heights so values can be subtracted easier (the datasets have different numbers of observations)\ng_height_df = pd.DataFrame()\nm_height_df = pd.DataFrame()\ng_height_df['time'] = df_gauge_data.datetime[0:3823].dt.date\ng_height_df['gauge_height'] = df_gauge_data.river_height[0:3823]\nm_height_df['time'] = ds_MEaSUREs.time[5657:9439].dt.date\nm_height_df['MEaSUREs_height'] = ds_MEaSUREs.height[106,5657:9439]\n#merge into one by time\nheight_df = pd.merge(g_height_df, m_height_df, on='time', how='left')\nheight_df\n\n\n\n\n\n\n\n\ntime\ngauge_height\nMEaSUREs_height\n\n\n\n\n0\n2008-10-29\n2.322576\n-0.238960\n\n\n1\n2008-10-30\n2.337816\n-0.209417\n\n\n2\n2008-10-31\n2.368296\n-0.180987\n\n\n3\n2008-11-01\n2.356104\n-0.178015\n\n\n4\n2008-11-02\n2.459736\n-0.177945\n\n\n...\n...\n...\n...\n\n\n3819\n2019-04-13\n5.312664\n1.132784\n\n\n3820\n2019-04-14\n5.236464\n1.152391\n\n\n3821\n2019-04-15\n5.230368\n1.172064\n\n\n3822\n2019-04-16\n5.221224\n1.192314\n\n\n3823\n2019-04-17\n5.202936\n1.208963\n\n\n\n\n3824 rows × 3 columns\n\n\n\n\ndiff = height_df.gauge_height - height_df.MEaSUREs_height\nmean_diff = diff.mean()\nmean_diff\n\n3.451153237576882\n\n\n\nheight_df['relative_gauge_height'] = height_df.gauge_height - mean_diff\n\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(height_df.time, height_df.relative_gauge_height, color = 'darkorange')\nplt.plot(height_df.time, height_df.MEaSUREs_height, color = 'darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\nNash Sutcliffe Efficiency\n\nNSE = 1-(np.sum((height_df.MEaSUREs_height-height_df.relative_gauge_height)**2)/np.sum((height_df.relative_gauge_height-np.mean(height_df.relative_gauge_height))**2))\nNSE\n\n-0.2062487355865772\n\n\nNSE for Oct 2013 - Sept 2014 water year:\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(height_df.time[1799:2163], height_df.relative_gauge_height[1799:2163], color = 'darkorange')\nplt.plot(height_df.time[1799:2163], height_df.MEaSUREs_height[1799:2163], color = 'darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\nNSE_2014 = 1-(np.sum((height_df.MEaSUREs_height[1799:2163]-height_df.relative_gauge_height[1799:2163])**2)/np.sum((height_df.relative_gauge_height[1799:2163]-np.mean(height_df.relative_gauge_height[1799:2163]))**2))\nNSE_2014\n\n0.18294061649986848\n\n\n\n\nPossible Explanations for discrepancies\n\nMultiple satellites, different return periods\nData interpolation\nSatellite tracks instead of swaths like SWOT will have, spatial interpolation\nRadar altimeter performance varies, was not designed to measure rivers\n\nMEaSUREs is comprised of the Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolation river heights from ERS1, ERS2, TOPEX/Poseidon, OSTM/Jason-2, Envisat, and Jason-3 that are interpolated and processed to create continuous heights for the study over the temporal range of the altimeters used. Each satellite has differing return periods (ie. Jason has a 10-day revist, Envisat 35 days) so to fill the data gaps, perhaps much needed to be interpolated and caused misalignment. In addition, the satellite tracks of these altimeter satellites do not capture entire river reaches with wide swath tracks like the Surface Water and Ocean Topography (SWOT) mission will do in the future. Thus locations observed among satellites may be different and data interpolated spatially, increasing errors. Also, radar altimeter performance varies dramatically across rivers and across Virtual Stations, as the creators of the dataset mention in the guidebook.\nIn addition, the authors note that the Mississippi NSE values ranged from -0.22 to 0.96 with an average of 0.43 when evaluating the dataset, so it looks like we unintentionally honed into one of the stations with the worst statistics on the Mississippi River.", + "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#qgis", + "href": "notebooks/GIS/SWOT_datetime_GIS.html#qgis", + "title": "SWOT Date/Time Transformation", + "section": "QGIS", + "text": "QGIS\nQGIS offers a geoproccesing tool called ‘Refactor Fields’.\nThis modifies the date/time values of the current field and creates a new layer.\nIn this case the date/time field ‘time_str’ can be changed to a date/time data type.\n\n\n\n\nIn the ‘type’ section, you can select the data type of your choosing but for this case we will select ‘Date & Time’.\nThe new layer can be saved to memory as a temporary layer, but its best to save the layer locally.\n\n\n\n\nThe new layer created does not include the ‘no_data’ values.\nAs shown in the image below; the black symbology is the original layer and the red symbology is the newly created layer without the ‘no_data’ values.\n\n\n\n\nWithin the processing toolbox, to create a time series select the ‘Plots’ category to show the various ways of plotting data.\n\n\n\n\nThere also is the option of using the plugin DataPlotly, which utilizes the python library Plotly.\nThis offers a variety of ways to plot and customize your charts.\nFor this example, we will configure a box plot looking at both time and ‘wse’. Also, querying ‘wse’ to only include values greater than 0, so it does not include any negative values.\n\n\n\n\nThis plot showcases the data without the date/time transformation for a single month.\n\n\n\n\nThis plot is the same single month dataset but with the date/time transformation.\n\n\n\n\nThis plot showcases a single pass river reach as the same transformed image from above.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Datetime Conversion" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#conclusions", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#conclusions", - "title": "Mississippi River Heights Exploration:", - "section": "Conclusions", - "text": "Conclusions\n\nRegardless, the workflow works!\nData from the cloud (Pre-SWOT MEaSUREs river heights) is used in tandem with in situ measurements (USGS gauges)\nTime and download space saved", + "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#summary", + "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#summary", + "title": "GDAL NetCDF to Geotiff Conversion", + "section": "Summary", + "text": "Summary\nThe following workflow lets you transform SWOT_L2_HR_Raster_2.0 NetCDF raster image to a GeoTIFF image, while extracting the variable of interest of WSE (Water Surface Elevation).\nUtiliziing the PODAAC Data Subscriber tool to download SWOT files onto your system.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Mississippi River Heights" + "Dataset Specific", + "SWOT", + "Transform Data", + "NetCDF to Geotiff", + "Windows" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#initiate-data-search", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#initiate-data-search", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#requirements", + "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#requirements", + "title": "GDAL NetCDF to Geotiff Conversion", + "section": "Requirements", + "text": "Requirements\n\nThis tutorial can be run in both a Windows & Mac environment. (Both subscriber tool and GDAL.)\nFirst install GDAL and the GDAL Command Line Interface (CLI) onto your system. The GDAL CLI is a tool that lets your perform a variety of geospatial transformations and analysis with geospatial raster and vector data.\nEarthdata Login - An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nnetrc File - You will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\nPODAAC Data Subscriber tool - To download the latest PO.DAAC datasets to your system proceed to the podaac-data-subscriber package to properly install onto your system.", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "SWOT", + "Transform Data", + "NetCDF to Geotiff", + "Windows" + ] + }, + { + "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#learning-objectives", + "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#learning-objectives", + "title": "GDAL NetCDF to Geotiff Conversion", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nDownloading SWOT data using the podaac-data-downloader.\nUtilizing GDAL (Geospatial Data Abstraction Library) to convert NetCDF files to GeoTIFF.\nSpecifiying which variable to convert to a single band image.\nAlso converting a folder of NetCDF files to GeoTIFF.\n\n\n\nCalling the Data Subscriber\nAfter installing the podaac-data-subscriber, the following command can be used in the Windows CLI Command Prompt interface to download the latest SWOT data.\nFor more info on the PODAAC Data Downloader.\n\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d Output Directory -sd 2024-02-15T15:15:00Z -ed 2024-02-15T15:16:00Z\n\n\n\nGDAL Transformation\nTransformation of the dataset is being done in the GDAL CLI.\nGDALMDIMTRANSLATE converts multidimenstional data between different formats.\nE.g. gdalmdimtranslate -of (output format) -co (creation option) -array (variable name) Input_FileName.nc Output_FileName.tif\nUsing gdalmdimtranslate to convert a single NetCDF file to GeoTIFF. We are choosing the water surface elevation (wse) variable to transform.\n\ngdalmdimtranslate -of GTiff -co COMPRESS=LZW -array wse 'input_SWOT_NetCDF_file/SWOT_Raster_NetCDF/SWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc' 'output_path/wse_swot.tif'\n\nTo convert multiple NetCDF files within a folder, you can run a batch process of gdalmdimtranslate with a For Loop within the GDAL CLI. ’*.nc’ searching for all files containing a NetCDF extension within the folder.\n\nfor %f in ('input_SWOT_Folder\\SWOT_Raster_NetCDF\\*.nc') do (\ngdalmdimtranslate -of GTiff -co COMPRESS=LZW -array wse NETCDF:\"%f\" \"path_to_output_folder\\SWOT_GeoTIFF\\%~nf.tif\"\n)", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "SWOT", + "Transform Data", + "NetCDF to Geotiff", + "Windows" + ] + }, + { + "objectID": "notebooks/Harmony API.html#harmony-eoss-api-tutorial", + "href": "notebooks/Harmony API.html#harmony-eoss-api-tutorial", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Harmony EOSS API Tutorial", + "text": "Harmony EOSS API Tutorial" + }, + { + "objectID": "notebooks/Harmony API.html#before-you-start", + "href": "notebooks/Harmony API.html#before-you-start", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." + }, + { + "objectID": "notebooks/Harmony API.html#build-the-eoss-root-url", + "href": "notebooks/Harmony API.html#build-the-eoss-root-url", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Build the EOSS Root URL", + "text": "Build the EOSS Root URL\nNext we will build a URL for the EOSS service for a given granule. To get data using the service, you need a CMR collection ID for a supported collection and the ID of a granule within that collection.\nBy convention, all Harmony services are accessed through <harmony_root>/<collection_id>/<service_name>\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\nconfig = {\n 'collection_id': 'C1233800302-EEDTEST',\n 'eoss_version': '0.1.0'\n}\neoss_collection_root = harmony_root+'/{collection_id}/eoss/{eoss_version}/items/'.format(**config)\nprint(eoss_collection_root)\n\nhttps://harmony.earthdata.nasa.gov/C1233800302-EEDTEST/eoss/0.1.0/items/" + }, + { + "objectID": "notebooks/Harmony API.html#variable-subset-of-a-granule", + "href": "notebooks/Harmony API.html#variable-subset-of-a-granule", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Variable Subset of a Granule", + "text": "Variable Subset of a Granule\nWe can now build onto the root URL in order to actually perform a transformation. The first transformation is a variable subset of a selected granule. At this time, this requires discovering the granule id and variable id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nHarmony stages transformed data in S3 to make it easy to do additional processing in the cloud. The response that Harmony returns is actually a redirect to the S3 location where your data is staged. Should you call Harmony in a tool that follows redirects, like your web browser, your file will be seamlessly downloaded locally for you. However, should you desire to do additional processing in AWS, you have that option as well by simply looking at the redirected URL. The code snippet below uses “geturl()” to show the URL of your staged data.\n\nvarSubsetConfig = {\n 'granule_id' : 'G2524192900-POCLOUD',\n 'variable_id' : 'red_var'\n}\neoss_var_subset_url = eoss_collection_root+'{granule_id}/?rangeSubset={variable_id}'.format(**varSubsetConfig)\n\nprint('Request URL', eoss_var_subset_url)\n\nwith request.urlopen(eoss_var_subset_url) as response:\n print('URL for data staged in S3:', response.geturl())" + }, + { + "objectID": "notebooks/Harmony API.html#add-on-a-spatial-subset", + "href": "notebooks/Harmony API.html#add-on-a-spatial-subset", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Add on a spatial subset", + "text": "Add on a spatial subset\nThe second transformation is a spatial subset of a selected granule. This can be combined with the request we already built above by simply specifying a bounding box.\n\nspatialSubsetConfig = {\n 'west' : '-128',\n 'south' : '23',\n 'east' : '-63',\n 'north' : '47'\n}\neoss_spatial_subset_url = eoss_var_subset_url+'&bbox={west},{south},{east},{north}'.format(**spatialSubsetConfig)\n\nprint('Request URL', eoss_spatial_subset_url)\n\nwith request.urlopen(eoss_spatial_subset_url) as response:\n print('URL for data staged in S3:', response.geturl())" + }, + { + "objectID": "notebooks/Harmony API.html#reprojection", + "href": "notebooks/Harmony API.html#reprojection", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Reprojection", + "text": "Reprojection\nThe third transformation is a reprojection of the data. This can be combined with the requests we already built above by simply specifying a coordinate reference system. Coordinate reference systems are identified by a common name, EPSG code, or URI. Today, this is based on reference systems supported by gdal. Examples include: ‘CRS:84’, ‘EPSG:32611’.\n\nreprojectionConfig = {\n 'crs' : 'EPSG:32611'\n}\neoss_reprojection_url = eoss_spatial_subset_url+'&crs={crs}'.format(**reprojectionConfig)\n\nprint('Request URL', eoss_reprojection_url)\n\nwith request.urlopen(eoss_reprojection_url) as response:\n print('URL for data staged in S3:', response.geturl())" + }, + { + "objectID": "notebooks/Harmony API.html#reformatting", + "href": "notebooks/Harmony API.html#reformatting", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Reformatting", + "text": "Reformatting\nNext is a reformatting of the output file of the data. This can be combined with the requests we already built above by simply specifying a format. Examples include: image/tiff’, ‘image/png’\n\nreformattingConfig = {\n 'format' : 'image/png'\n}\neoss_reformatting_url = eoss_reprojection_url+'&format={format}'.format(**reformattingConfig)\n\nprint('Request URL', eoss_reformatting_url)\n\nwith request.urlopen(eoss_reformatting_url) as response:\n print('URL for data staged in S3:', response.geturl())" + }, + { + "objectID": "notebooks/Harmony API.html#continue-exploring", + "href": "notebooks/Harmony API.html#continue-exploring", + "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", + "section": "Continue Exploring", + "text": "Continue Exploring\nHarmony’s specification is available online. Feel free to read more and continue exploring how to use Harmony. https://harmony.uat.earthdata.nasa.gov/docs/eoss/0.1.0/spec" + }, + { + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#initiate-data-search", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#initiate-data-search", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Initiate Data Search", "text": "Initiate Data Search\n\nSTAC_URL = 'https://cmr.earthdata.nasa.gov/stac'\nprovider_cat = Client.open(STAC_URL)\ncatalog = Client.open(f'{STAC_URL}/LPCLOUD/')\n#collections = ['HLSL30.v2.0', 'HLSS30.v2.0']\ncollections = ['HLSL30.v2.0']", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#define-date-range-and-region-of-interest", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#define-date-range-and-region-of-interest", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#define-date-range-and-region-of-interest", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#define-date-range-and-region-of-interest", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Define Date Range and Region of Interest", "text": "Define Date Range and Region of Interest\n\ndate_range = \"2021-01/2022-01\"\nroi = {\n \"type\": \"Feature\",\n \"properties\": {},\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -121.60835266113281,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.49874248613119\n ]\n ]\n ]\n }\n }['geometry']\nbase = gv.tile_sources.EsriImagery.opts(width=650, height=500)\nReservoir = gv.Polygons(roi['coordinates']).opts(line_color='yellow', line_width=10, color=None)\nReservoir * base", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#search-for-hls-imagery-matching-search-criteria", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#search-for-hls-imagery-matching-search-criteria", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#search-for-hls-imagery-matching-search-criteria", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#search-for-hls-imagery-matching-search-criteria", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Search for HLS imagery matching search criteria", "text": "Search for HLS imagery matching search criteria\n\nsearch = catalog.search(\n collections=collections,\n intersects=roi,\n datetime=date_range,\n limit=100\n)\n\nitem_collection = search.get_all_items()\nsearch.matched()", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Filter imagery for low cloud images and identify image bands needed for water classification", "text": "Filter imagery for low cloud images and identify image bands needed for water classification\n\ns30_bands = ['B8A', 'B03'] # S30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \nl30_bands = ['B05', 'B03'] # L30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \ncloudcover = 10\n\n\nndwi_band_links = []\n\nfor i in item_collection:\n if i.properties['eo:cloud_cover'] <= cloudcover:\n if i.collection_id == 'HLSS30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = s30_bands\n elif i.collection_id == 'HLSL30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = l30_bands\n\n for a in i.assets:\n if any(b==a for b in ndwi_bands):\n ndwi_band_links.append(i.assets[a].href)\n\n\nndwi_band_links[:10]\n\n\ntile_dicts = defaultdict(list) \n\n\nfor l in ndwi_band_links:\n tile = l.split('.')[-6]\n tile_dicts[tile].append(l)\n\n\ntile_dicts.keys()\n\n\ntile_links = tile_dicts['T10SFJ']\n\n\nbands_dicts = defaultdict(list)\nfor b in tile_links:\n band = b.split('.')[-2]\n bands_dicts[band].append(b)\nfor i in bands_dicts:\n print(i)", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#locate-images-in-amazon-s3-storage", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#locate-images-in-amazon-s3-storage", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", - "section": "Locate Images in Amazon S3 Storage", - "text": "Locate Images in Amazon S3 Storage\n\npath_dicts = defaultdict(list)\nfor l in bands_dicts['B05']:\n s3l = l.replace('https://data.lpdaac.earthdatacloud.nasa.gov/', 's3://')\n path_dicts['B05'].append(s3l)\n \ns3paths_LB3 = []\nfor l in bands_dicts['B03']:\n s3l = l.replace('https://data.lpdaac.earthdatacloud.nasa.gov/', 's3://')\n if s3l[38:39] == 'L':\n path_dicts['B03'].append(s3l)\n\n\ns3_cred_endpoint = 'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials'\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\ntemp_creds_req = get_temp_creds()\nsession = boto3.Session(aws_access_key_id=temp_creds_req['accessKeyId'], \n aws_secret_access_key=temp_creds_req['secretAccessKey'],\n aws_session_token=temp_creds_req['sessionToken'],\n region_name='us-west-2')\n\n\nrio_env = rio.Env(AWSSession(session),\n GDAL_DISABLE_READDIR_ON_OPEN='EMPTY_DIR',\n GDAL_HTTP_COOKIEFILE=os.path.expanduser('~/cookies.txt'),\n GDAL_HTTP_COOKIEJAR=os.path.expanduser('~/cookies.txt'))\nrio_env.__enter__()", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#download-identified-images-to-local-computer", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#download-identified-images-to-local-computer", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", + "section": "Download identified images to local computer", + "text": "Download identified images to local computer\n\nos.makedirs(\"downloads\", exist_ok=True)\n\n\ndef download(url: str, fname: str):\n resp = requests.get(url, stream=True)\n total = int(resp.headers.get('content-length', 0))\n with open(fname, 'wb') as file, tqdm(\n desc=fname,\n ncols=110,\n total=total,\n unit='iB',\n unit_scale=True,\n unit_divisor=1024,\n ) as bar:\n for data in resp.iter_content(chunk_size=1024):\n size = file.write(data)\n bar.update(size)\n\n\npath_dicts = defaultdict(list)\nprint('Begin Downloading Imagery')\nstart_time = time.time()\nfor key in bands_dicts:\n url = bands_dicts[key]\n for u in url:\n filename = u.split('/')[-1]\n path = './downloads/' + filename\n download(u,path)\n path_dicts[key].append(path)\nprint('Download Complete')\nprint(\"--- %s seconds ---\" % (time.time() - start_time))", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#load-images-and-visualize", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#load-images-and-visualize", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#load-images-and-visualize", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#load-images-and-visualize", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Load images and visualize", "text": "Load images and visualize\n\ndef time_index_from_filenames(file_links):\n return [datetime.strptime(f.split('.')[-5], '%Y%jT%H%M%S') for f in file_links]\n\n\ntime = xr.Variable('time', time_index_from_filenames(path_dicts['B03']))\nchunks=dict(band=1, x=512, y=512)\nhls_ts_da_LB3 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B03']], dim=time)\nhls_ts_da_LB5 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B05']], dim=time)\nhls_ts_da_LB3 = hls_ts_da_LB3.rio.reproject(\"epsg:4326\")\nhls_ts_da_LB5 = hls_ts_da_LB5.rio.reproject(\"epsg:4326\")\n\n\nhls_ts_da_data_LB3 = hls_ts_da_LB3.load()\nhls_ts_da_data_LB5 = hls_ts_da_LB5.load()\nhls_ts_da_data_LB3 = hls_ts_da_data_LB3.rio.clip([roi])\nhls_ts_da_data_LB5 = hls_ts_da_data_LB5.rio.clip([roi])\n\n\nhls_ts_da_data_LB5.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='gray').opts(clim=(0,2000))", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas", "text": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas\n\nLB3 = hls_ts_da_data_LB3 \nLB5 = hls_ts_da_data_LB5\nNDWI = (LB3-LB5)/(LB3+LB5)\nNDWI.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='coolwarm').opts(clim=(-0.5,0.5))\n\n\nwater = NDWI>0\nwater.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='PuOr').opts(clim=(0,1))", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" + "Local" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-surface-area-of-reservoir-and-plot-time-series", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-surface-area-of-reservoir-and-plot-time-series", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-surface-area-of-reservoir-and-plot-time-series", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-surface-area-of-reservoir-and-plot-time-series", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", "section": "Caclulate surface area of reservoir and plot time series", "text": "Caclulate surface area of reservoir and plot time series\n\nif water.variable.max() == True:\n water_real = water*30*30\nwater_area = water_real.sum(axis=(1,2))\n\n%matplotlib inline\n\nfig, ax = plt.subplots()\n(water_area[:]/1000000).plot(ax=ax, linewidth=2, linestyle = '-', marker='o')\nax.set_title(\"Surface area of waterbody in km2\")\nax.set_ylabel('Area [km^2]')", "crumbs": [ "Tutorials", "Cloud vs. Local Workflows", "Reservoir Example", - "Cloud" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "", - "text": "#!rm *.nc*", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#requirements", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#requirements", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Requirements", - "text": "Requirements\nThis workflow was developed using Python 3.9 (and tested against versions 3.7, 3.8). The pyresample package is the only remaining dependency besides common packages like numpy and xarray. You may uncomment the first line of the following cell to install pyresample, if necessary. Then, import all the required Python packages.\n\n#!python -m pip install numpy pyresample xarray\nimport os\nimport tqdm\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport pyresample as pr\nimport matplotlib.pyplot as plt\nfrom concurrent.futures import ThreadPoolExecutor\nfrom pyresample.kd_tree import resample_gauss\nfrom io import StringIO\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n \ndef get_opendap(record: dict):\n for url in record.get(\"RelatedUrls\"):\n if 'opendap.earthdata.nasa.gov' in url.get(\"URL\"):\n return url.get(\"URL\")\n\ndef get_granules(ShortName: str, provider: str=\"POCLOUD\", page_size: int=200, **kwargs):\n url = f\"https://{cmr}/search/granules.umm_json\"\n params = dict(ShortName=ShortName, provider=\"POCLOUD\", page_size=page_size)\n granules = pd.DataFrame(requests.get(url, {**params,**kwargs}).json().get(\"items\"))\n granules['GranuleUR'] = granules.umm.apply(lambda x: x.get(\"GranuleUR\"))\n granules['OPeNDAP'] = granules.umm.apply(get_opendap)\n coverage = granules.umm.apply(lambda x: x.get(\"TemporalExtent\").get(\"RangeDateTime\").values()).apply(list)\n granules['Start'] = coverage.apply(sorted).apply(lambda x: x[0])\n granules['End'] = coverage.apply(sorted).apply(lambda x: x[1])\n return granules", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#dataset", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#dataset", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Dataset", - "text": "Dataset\n\nAbout the mission\nThis demo uses data acquired by the Sentinel-6A Michael Freilich (S6A) satellite altimetry mission, which provides precise measurements of ocean surface height. It is the latest iteration in a series of missions, which together provide an uninterupted sea surface height record going back more than 30 years.\nSatellite altimetry is a precise science carried out by Ocean Surface Topography researchers through the Jason-series radar altimetry missions. Instrument specifications, operational procedures, data calibration and analysis are sometimes referred to colloquially as “along-track altimetry” (a term that I find useful to understanding the data provided at level 2, like in the dataset we use here).\nLearn more through resources linked in the Appendix).\n\n\nAbout the data\nIn a nutshell:\n\nWhat? calibrated sea surface height measurements,\nWhere? from -66.0 to 66.0 degrees latitude,\nWhen? beginning in June 2021,\nHow? global coverage acquired every 10 days (1 cycle of 128 orbits)\n\n\nFigure: depicted data structure for level-2 along-track altimetry datasets from Sentinel-6A\nPO.DAAC typically refers to datasets by their ShortName: JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F. The ShortName contains the following info for all Sentinel-6 datasets at level 2:\n\nJASON_CS: referring to Jason Continuity of Service (Jason-CS), the mission series/instrument class;\nS6A: referring to Sentinel-6A (instead of Sentinel-6B, which is expected to launch in 2025);\nL2: Level 2, the data processing level;\nALT: Altimetry, the data product type and application;\nLR: Low Resolution, versus High Resolution (HR);\nRED: Reduced, the smaller of two datasets distributed at Level 2 (the other being Standard, which contains more variables)\nOST: Ocean Surface Topography, the science domain/team/community;\nNRT: Near Real Time, the data latency; i.e. accessible within 3 hours (vs. STC or NTC; lower latencies)", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#discovery", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#discovery", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Discovery", - "text": "Discovery\nThe unique ‘concept-id’ assigned to each PO.DAAC dataset, or ‘collection’, within the Earthdata system is functionally the same as the ShortName in the context of PO.DAAC’s collections in the cloud (because we also assign unique ShortNames). This cell is downloading metadata to retrieve that identifier from an external source, then download metadata about the series of files that make up the time series for the cycle specified by the variable ‘cycle’, and merging to table.\n\nSearch for files/granules\nPick any cycle after cycle 25, which was around the time of the first release of data from S6A. (This cell calls three functions defined in the cell above.)\n\ncycle = 25\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nconcept_id = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ngranules = get_granules(name, cycle=cycle) \n\ngranules[['GranuleUR', 'Start', 'End']].set_index(\"GranuleUR\")\n\n\n\n\n\n\n\n\nStart\nEnd\n\n\nGranuleUR\n\n\n\n\n\n\nS6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02\n2021-07-13T16:26:44.514Z\n2021-07-13T18:22:34.471Z\n\n\nS6A_P4_2__LR_RED__NR_025_003_20210713T182234_20210713T201839_F02\n2021-07-13T18:22:34.522Z\n2021-07-13T20:18:39.482Z\n\n\nS6A_P4_2__LR_RED__NR_025_006_20210713T201839_20210713T215450_F02\n2021-07-13T20:18:39.532Z\n2021-07-13T21:54:50.473Z\n\n\nS6A_P4_2__LR_RED__NR_025_007_20210713T215450_20210713T234732_F02\n2021-07-13T21:54:50.523Z\n2021-07-13T23:47:32.482Z\n\n\nS6A_P4_2__LR_RED__NR_025_009_20210713T234732_20210714T014224_F02\n2021-07-13T23:47:32.533Z\n2021-07-14T01:42:24.454Z\n\n\n...\n...\n...\n\n\nS6A_P4_2__LR_RED__NR_025_245_20210723T050533_20210723T064603_F02\n2021-07-23T05:05:33.543Z\n2021-07-23T06:46:03.471Z\n\n\nS6A_P4_2__LR_RED__NR_025_247_20210723T064603_20210723T083817_F02\n2021-07-23T06:46:03.521Z\n2021-07-23T08:38:17.483Z\n\n\nS6A_P4_2__LR_RED__NR_025_249_20210723T083817_20210723T103256_F02\n2021-07-23T08:38:17.533Z\n2021-07-23T10:32:56.490Z\n\n\nS6A_P4_2__LR_RED__NR_025_251_20210723T103256_20210723T122904_F02\n2021-07-23T10:32:56.540Z\n2021-07-23T12:29:04.459Z\n\n\nS6A_P4_2__LR_RED__NR_025_253_20210723T122904_20210723T142514_F02\n2021-07-23T12:29:04.509Z\n2021-07-23T14:25:14.452Z\n\n\n\n\n125 rows × 2 columns", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#access", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#access", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Access", - "text": "Access\nThese functions have nothing to do with Earthdata or PO.DAAC services, all Python 3 standard library except for tqdm and wget:\n\ndef download(source: str):\n target = os.path.basename(source.split(\"?\")[0])\n if not os.path.isfile(target):\n !wget --quiet --continue --output-document $target $source\n return target\n\ndef download_all(urls: list, max_workers: int=12):\n with ThreadPoolExecutor(max_workers=max_workers) as pool:\n workers = pool.map(download, urls)\n return list(tqdm.tqdm(workers, total=len(urls)))\n\n\nExplore dataset variables\nThe S6A level 2 altimetry datasets include variables for sea surface height anomaly (SSHA), significant wave height (SWH), wind speed, others.\n\nopendap_url = f\"https://opendap.earthdata.nasa.gov/collections/{concept_id}\"\n\nurls = granules.GranuleUR.apply(lambda f: f\"{opendap_url}/granules/{f}.nc4\")\n \nurls.iloc[0].replace(\".nc4\", \".html\")\n\n'https://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.html'\n\n\n\n\nGet subsets from OPeNDAP\nPrepare the full request urls by adding a comma-delimited list of variables, after the question mark ?.\n\nvariables = ['data_01_time',\n 'data_01_longitude',\n 'data_01_latitude',\n 'data_01_ku_ssha']\n\nquery = \",\".join(variables)\n\nreqs = urls.apply(lambda x: f\"{x}?{query}\")\n\nprint(reqs.iloc[0])\n\nhttps://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc4?data_01_time,data_01_longitude,data_01_latitude,data_01_ku_ssha\n\n\nThe function(s) below download granules from a remote source to a local target file, and reliably manage simultaneous streaming downloads divided between multiple threads.\n\nfiles = download_all(urls=reqs, max_workers=12)\n\n100%|██████████| 125/125 [00:53<00:00, 2.32it/s]\n\n\n\n!du -sh .\n\n16M .\n\n\nWhy this way?\nTo be explained…\nWill it scale?\nThe source netcdf files range from 2500KB to 3000KB per file. The OPeNDAP subsets that we just downloaded are around 100KB a pop. It took less than 10 minutes to download the same subsets for ~1700 files, that covers a period of roughly You can extrapolate to a reasonable estimate for time series of any length (even the whole mission).\nTotal size of the source data is ~4.25GB, based on:\n2500KB x 1700 = 4250000KB (4250 megabytes)\nversus, total size of the subset time series:\n100KB x 1700 = 17000KB (170 megabytes)\nPlot it to put this in context, because our goal is to produce one global grid for the entire cycle of data that we just downloaded.\n\n\nOpen, plot ssh time series\nSort the list of subset files to ensure they concatenate in proper order. Call open_mfdataset on the list to open all the subsets in memory as one dataset in xarray.\n\nds = xr.open_mfdataset(sorted(files), engine=\"netcdf4\")\n\nprint(ds)\n\n<xarray.Dataset>\nDimensions: (data_01_time: 827001)\nCoordinates:\n * data_01_time (data_01_time) datetime64[ns] 2021-07-13T16:26:45 ... ...\nData variables:\n data_01_longitude (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\n data_01_latitude (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\n data_01_ku_ssha (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\nAttributes: (12/63)\n Convention: CF-1.7\n institution: EUMETSAT\n references: Sentinel-6_Jason-CS ALT Generic P...\n contact: ops@eumetsat.int\n radiometer_sensor_name: AMR-C\n doris_sensor_name: DORIS\n ... ...\n xref_solid_earth_tide: S6__P4_2__SETD_AX_20151008T000000...\n xref_surface_classification: S6__P4____SURF_AX_20151008T000000...\n xref_wind_speed_alt: S6A_P4_2__WNDL_AX_20151008T000000...\n product_name: S6A_P4_2__LR______20210713T162644...\n history: 2021-07-13 18:38:07 : Creation\\n2...\n history_json: [{\"$schema\":\"https:\\/\\/harmony.ea...\n\n\nTwo prerequisites to plot based on personal preference:\n\nrename all the variables to drop the group names (because I just think they’re too long as is)\nget a tuple with two timestamps for the start and end of the time series coverage for the cycle\n\nPlot the cycle as a series on a geographic plot, which should look just like the one at the top of this notebook:\n\nnew_variable_names = list(map(lambda x: x.split(\"_\")[-1], variables))\nmap_variable_names = dict(zip(variables, new_variable_names))\nds = ds.rename(map_variable_names).set_coords(['time','longitude','latitude']) # rename variables\n\ntimeframe = (str(ds.time.data[0]).split('T')[0],\n str(ds.time.data[-1]).split('T')[0]) # get timestamps tuple\n\nds.plot.scatter(y=\"latitude\", x=\"longitude\", hue=\"ssha\", \n vmin=-0.4, vmax=0.4, cmap=\"jet\", levels=9, \n aspect=2.5, size=6, s=1, )\nplt.ylim(-67., 67.)\nplt.xlim(0., 360.)\nplt.tight_layout()\nplt.title(f\"ssha for cycle {cycle} ({timeframe})\")\n\nText(0.5, 1.0, \"ssha for cycle 25 (('2021-07-13', '2021-07-23'))\")", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#process", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#process", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Process", - "text": "Process\n\n0.5-degree grid from ECCO V4r4 (int)\n\nAcknowledgement: pyresample approach shared by Ian Fenty, NASA JPL/ECCO.\n\nECCO V4r4 products are distributed in two spatial formats. One set of collections provides the ocean state estimates on the native model grid (LLC0090) and the other provides them after interpolating to a regular grid defined in geographic coordinates with horizontal cell size of 0.5-degrees. The latitude/longitude grid is distributed as its own collection in one netcdf file: https://search.earthdata.nasa.gov/search/granules?p=C2013583732-POCLOUD\nDownload the ECCO grid geometry netcdf from its https download endpoint in NASA Earthdata Cloud. Open the file and print the header content for the maskC variable, which contains a boolean mask representing the wet/dry state of the area contained in each cell of a 3d grid with dimensions mapped to Z, latitude, and longitude.\n\necco_file = download(\"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/\"\n \"ECCO_L4_GEOMETRY_05DEG_V4R4/GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc\")\n\necco_grid = xr.open_dataset(ecco_file).isel(Z=0) # select 0 on z-axis\n\necco_mask = ecco_grid.maskC\n\nprint(ecco_grid)\n\n<xarray.Dataset>\nDimensions: (latitude: 360, longitude: 720, nv: 2)\nCoordinates:\n Z float32 -5.0\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8\n latitude_bnds (latitude, nv) float32 ...\n longitude_bnds (longitude, nv) float32 ...\n Z_bnds (nv) float32 ...\nDimensions without coordinates: nv\nData variables:\n hFacC (latitude, longitude) float64 ...\n Depth (latitude, longitude) float64 ...\n area (latitude, longitude) float64 ...\n drF float32 ...\n maskC (latitude, longitude) bool ...\nAttributes: (12/57)\n acknowledgement: This research was carried out by the Jet...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon gri...\n Conventions: CF-1.8, ACDD-1.3\n coordinates_comment: Note: the global 'coordinates' attribute...\n ... ...\n references: ECCO Consortium, Fukumori, I., Wang, O.,...\n source: The ECCO V4r4 state estimate was produce...\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadat...\n summary: This dataset provides geometric paramete...\n title: ECCO Geometry Parameters for the 0.5 deg...\n uuid: b4795c62-86e5-11eb-9c5f-f8f21e2ee3e0\n\n\n\n\nGet ssha variable on 0.5-degree grid\nResample ssha data using kd-tree gaussian weighting neighbour approach. Define a function that implements the following steps:\n\nGenerate two 2d arrays of lats/lons using the permuted 1d coordinates from an input gridded dataset.\nDefine the target grid geometry using the 2d arrays of lats/lons.\nDefine the source grid geometry using the 1d arrays of lats/lons from an input dataset.\n\n\nimport warnings\n\ndef l2alt2grid(source: xr.DataArray, target: xr.DataArray, **options):\n nans = ~np.isnan(source.values)\n data = source.values[nans]\n\n lats = source.latitude.values[nans]\n lons = (source.longitude.values[nans] + 180) % 360 - 180\n src = pr.SwathDefinition(lons, lats)\n\n lons1d = target.longitude.values\n lats1d = target.latitude.values\n lons2d, lats2d = np.meshgrid(lons1d, lats1d)\n tgt = pr.SwathDefinition(lons2d, lats2d)\n\n with warnings.catch_warnings():\n warnings.filterwarnings(\"ignore\", category=UserWarning)\n res, std, cnt = resample_gauss(src, data, tgt, **options)\n \n coords = {'latitude': lats1d, 'longitude': lons1d}\n return (xr.DataArray(res, coords=coords),\n xr.DataArray(std, coords=coords),\n xr.DataArray(cnt, coords=coords), )\n\nSet the gridding parameters in the python dictionary below; then pass it to the function as the last of three required positional arguments (the first two are the source dataset and the dataset that provides the target grid geometry).\n\ngridding_options = dict(\n radius_of_influence = 175000, \n sigmas = 25000,\n neighbours = 100,\n fill_value = np.nan,\n with_uncert = True\n)\n\nresult, stddev, counts = l2alt2grid(ds.ssha, ecco_mask, **gridding_options)\n\nresult.shape == (ecco_grid.latitude.size, \n ecco_grid.longitude.size)\n\nTrue\n\n\n\n\nPlot gridded ssha, gridding statistics\nPlot each array for the output ‘grid’ and the grid statistics ‘stddev’ and ‘counts’.\n\nresult.sel(latitude=slice(-66.,66.)).plot(cmap=\"jet\", vmin=-0.4, vmax=0.4, figsize=(15,6))\n\n\n\n\n\n\n\n\nLook at this plot and adjust gridding parameters as needed to refine ssha grid.\n\nstddev.sel(latitude=slice(-67.,67.)).plot(cmap=\"jet\", robust=True, figsize=(15,6))\n\n\n\n\n\n\n\n\na guess: the yellow areas with lower counts correspond to pass positions at the start/end of the cycle.\n\ncounts.sel(latitude=slice(-67.,67.)).plot(cmap=\"jet\", robust=True, figsize=(15,6))\n\n\n\n\n\n\n\n\n\nresult.sel(latitude=slice(-66.,66.)).to_pandas().T.describe().T\n\n\n\n\n\n\n\n\ncount\nmean\nstd\nmin\n25%\n50%\n75%\nmax\n\n\nlatitude\n\n\n\n\n\n\n\n\n\n\n\n\n-65.75\n304.0\n0.209026\n0.830608\n-1.471174\n-0.069080\n0.039957\n0.259600\n6.104942\n\n\n-65.25\n316.0\n0.216497\n0.479879\n-0.793696\n0.002569\n0.080189\n0.301957\n3.173239\n\n\n-64.75\n326.0\n0.218253\n0.465126\n-0.593413\n0.008729\n0.085963\n0.296550\n2.885002\n\n\n-64.25\n332.0\n0.090540\n0.453919\n-0.909328\n-0.030323\n0.040090\n0.097437\n2.914544\n\n\n-63.75\n371.0\n0.029598\n0.379806\n-0.884937\n-0.064511\n0.001728\n0.062316\n2.879200\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n63.75\n310.0\n0.034539\n0.133022\n-0.580132\n-0.010876\n0.038027\n0.081060\n0.806144\n\n\n64.25\n314.0\n0.018076\n0.118825\n-0.690086\n-0.016610\n0.036694\n0.077421\n0.286705\n\n\n64.75\n311.0\n-0.085785\n1.264886\n-19.397700\n-0.022718\n0.041526\n0.080252\n1.397690\n\n\n65.25\n307.0\n4.177751\n42.431829\n-23.955439\n-0.043362\n0.043002\n0.090967\n505.812000\n\n\n65.75\n290.0\n3.392658\n34.873463\n-10.643720\n-0.075147\n0.058857\n0.105139\n430.164759\n\n\n\n\n264 rows × 8 columns", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" - ] - }, - { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#appendix", - "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#appendix", - "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", - "section": "Appendix", - "text": "Appendix\n\nSentinel-6A MF\nThe Sentinel-6A Michael Freilich radar altimeter mission, or Sentinel-6, produces high-precision measurements of global sea-level. You can learn about the mission and ocean altimetry applications and datasets through the following links:\n\nhttps://www.nasa.gov/sentinel-6\nhttps://sealevel.jpl.nasa.gov/missions/jasoncs/\nhttps://sentinel-6.cnes.fr/en/JASON-CS/index.htm\nhttps://podaac.jpl.nasa.gov/Sentinel-6\n\n\n\nOcean Surface Topography\nThe primary contribution of satellite altimetry to satellite oceanography has been to:\n\nImprove the knowledge of ocean tides and develop global tide models.\nMonitor the variation of global mean sea level and its relationship to changes in ocean mass and heat content.\nMap the general circulation variability of the ocean, including the ocean mesoscale, over decades and in near real-time using multi-satellite altimetric sampling.\n\n\n\n\naltimetry\n\n\nThe Surface Water Ocean Topography (SWOT) mission represents the next-generation of sea surface height observation. It will bring together oceanography and hydrology to focus on gaining a better understanding of the world’s oceans and its terrestrial surface waters. U.S. and French oceanographers and hydrologists have joined forces to develop this new space mission to make the first global survey of Earth’s surface water, observe the fine details of the ocean’s surface topography and measure how water bodies change over time. The payload on SWOT will include a Jason-class radar altimeter that will serve to extend the time series of sea surface height data into the future, beyond the lifespan of Sentinel-6 MF, which is introduced immediately below. Read more about SWOT at: https://podaac.jpl.nasa.gov/SWOT/\n\n\nEarthdata Cloud Services Overview\nThis workflow example downloads subsets of the netcdf datasets via OPeNDAP for massive efficiency gains (network/compute).\nAccess for direct download:\n\nBrowse and download granules through Earthdata Search – https://search.earthdata.nasa.gov/search/granules?p=C1968980576-POCLOUD\nBrowse and download granules from HTTPS endpoints – https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1968980576-POCLOUD\nBrowse and download granules from S3 endpoints (example forthcoming, assuming s3 direct access has been enabled for the collection)\n\nAccess through data services:\nData and metadata are also accessible in reduced forms through higher-level cloud data services, for example:\n\nhttps://harmony.earthdata.nasa.gov/ – Data reduction via on-demand subsetting and other high-level reformatting\n\nInterface to backend services such as data file format conversion, subsetting at L2+, regridding and reprojection at L3+, and more.\nCompatibility depends on the data processing level and data/file format, and so their expected behavior vary also.\nServices available through Harmony API reduce the technical burden on users by covering certain low-level data transformations that a user would normally have to apply themselves, even to simply subset a dataset from OPeNDAP.\n\nhttps://opendap.earthdata.nasa.gov/ – Data reduction via basic subsetting along coordinate dimensions and by variable\n\nRequires more familiarity with the contents of the target dataset, as well knowledge of how to select for data along the dimensions which correspond to space/time coordinates fitting the geographic and temporal coverage of interest.\nUser Guide: https://opendap.github.io/documentation/UserGuideComprehensive.html\n\n\n\n\nPython API References\n\nBash\n\nhttps://www.gnu.org/software/coreutils/manual/html_node/du-invocation.html\n\nPython\n\nhttps://docs.python.org/3/library/functions.html#map\n\nhttps://docs.python.org/3/library/functions.html#zip\nhttps://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor\n\nnumpy (https://numpy.org/doc/stable/reference)\n\nnumpy.ndarray.data\n\nnumpy.where\n\nnumpy.isnan\n\ndatetimes\n\nnumpy.sum\n\nnumpy.nansum\n\n\nxarray (https://xarray.pydata.org/en/stable)\n\nxarray.DataArray\n\nxarray.DataArray.values\n\nxarray.DataArray.mean\n\nxarray.DataArray.isel\nxarray.open_dataset\nxarray.DataArray.plot\nxarray.Dataset.rename\n\npyresample\n\npyresample.geometry.SwathDefinition\npyresample.kd_tree.resample_gauss", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "Sentinel-6 Michael Freilich", - "OPeNDAP Access" + "Local" ] }, { @@ -1058,1619 +1119,1850 @@ ] }, { - "objectID": "notebooks/GIS/MUR_SSTA_QGIS.html#summary", - "href": "notebooks/GIS/MUR_SSTA_QGIS.html#summary", - "title": "Mapping Sea Surface Temperature Anomalies in QGIS", - "section": "Summary", - "text": "Summary\n\nThis tutorial uses QGIS to visualize the the sea surface temperature anomalies (SSTA) over the Pacific Ocean for April 24, 2023. The SST anomaly variable is derived from a MUR climatology dataset - MUR25-JPL-L4-GLOB-v04.2 (average between 2003 and 2014).\nBackground: SSTA is an important variable when studying El Niño-Southern Oscillation (ENSO), a climate pattern in the Pacific Ocean that has two phases: El Niño (warm/wet phase) and La Niña (cold/dry phase). ENSO has global impacts on wildfires, weather, and ecosystems. Here, we will change the projection of our data to better reveal the El Niño in 2023.", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#in-aws-cloud-version", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#in-aws-cloud-version", + "title": "Amazon Estuary Exploration:", + "section": "In AWS Cloud Version", + "text": "In AWS Cloud Version\nThis tutorial is one of two jupyter notebook versions of the same use case exploring multiple satellite data products over the Amazon Estuary. In this version, we use data products directly in the Amazon Web Services (AWS) Cloud.\n\nLearning Objectives\n\nCompare cloud access methods (in tandem with notebook “Amazon Estuary Exploration: Cloud Direct Download Version”)\nSearch for data products using earthaccess Python library\nAccess datasets using direct s3 access in cloud, xarray and visualize using hvplot or plot tools\n\nThis tutorial explores the relationships between river height, land water equivalent thickness, sea surface salinity, and sea surface temperature in the Amazon River estuary and coastal region from multiple datasets listed below. The contents are useful for the ocean, coastal, and terrestrial hydrosphere communities, showcasing how to use cloud datasets and services. The notebook is designed to be executed in Amazon Web Services (AWS) (in us-west-2 region where the cloud data is located).", "crumbs": [ "Tutorials", - "Dataset Specific", - "GHRSST", - "In QGIS" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#finding-ways-to-visualize-swot-hydrology-river-shapefile-dataset", - "href": "notebooks/GIS/SWOT_GISshapefiles.html#finding-ways-to-visualize-swot-hydrology-river-shapefile-dataset", - "title": "SWOT North American Continent Hydrology Dataset", - "section": "Finding ways to visualize SWOT Hydrology River Shapefile Dataset", - "text": "Finding ways to visualize SWOT Hydrology River Shapefile Dataset\nAuthored by Nicholas Tarpinian, PO.DAAC", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#cloud-datasets", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#cloud-datasets", + "title": "Amazon Estuary Exploration:", + "section": "Cloud Datasets", + "text": "Cloud Datasets\nThe tutorial itself will use four different datasets:\n1. TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3\n\nDOI: https://doi.org/10.5067/TEMSC-3JC63\n\nThe Gravity Recovery And Climate Experiment Follow-On (GRACE-FO) satellite land water equivalent (LWE) thicknesses will be used to observe seasonal changes in water storage around the river. When discharge is high, the change in water storage will increase, thus highlighting a wet season. \n2. PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\n\nDOI: https://doi.org/10.5067/PSGRA-DA2V2\n\nThe NASA Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program virtual gauges will be used as a proxy for Surface Water and Ocean Topography (SWOT) discharge until SWOT products are available. MEaSUREs contains river height products, not discharge, but river height is directly related to discharge and thus will act as a good substitute.\n3. OISSS_L4_multimission_7day_v1\n\nDOI: https://doi.org/10.5067/SMP10-4U7CS\n\nOptimally Interpolated Sea surface salinity (OISSS) is a level 4 product that combines the records from Aquarius (Sept 2011-June 2015), the Soil Moisture Active Passive (SMAP) satellite (April 2015-present), and ESAs Soil Moisture Ocean Salinity (SMOS) data to fill in data gaps.\n4. MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0\n\nDOI: https://doi.org/10.5067/MODAM-MO9N9\n\nSea surface temperature is obtained from the Moderate Resolution Imaging Spectrometer (MODIS) instrument on board the Aqua satellite. \nMore details on available collections are on the PO.DAAC Cloud Earthdata Search Portal. For more information on the PO.DAAC transition to the cloud, please visit: https://podaac.jpl.nasa.gov/cloud-datasets/about", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Shapefile Exploration" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#summary", - "href": "notebooks/GIS/SWOT_GISshapefiles.html#summary", - "title": "SWOT North American Continent Hydrology Dataset", - "section": "Summary", - "text": "Summary\nThe following tutorial is looking to explore geospatial libraries and visualizing vector datasets without the use of a GIS desktop software. Specifically looking at the latest Surface Water and Ocean Topography (SWOT) river reach hydrology dataset.", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#needed-packages", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#needed-packages", + "title": "Amazon Estuary Exploration:", + "section": "Needed Packages", + "text": "Needed Packages\n\nimport os\nimport glob\nimport s3fs\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy\nimport dask\nfrom datetime import datetime\nfrom os.path import isfile, basename, abspath\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Shapefile Exploration" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#requirements", - "href": "notebooks/GIS/SWOT_GISshapefiles.html#requirements", - "title": "SWOT North American Continent Hydrology Dataset", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\n\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\nUtilizing Anaconda Navigator to create your enviroments. Accessing the Conda-Forge channel to install geopsatial libraries, e.g. GDAL and GeoPandas.\n\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\nLearning Objectives:\n\nAccessing SWOT shapefile hydrology dataset through earthaccess and visualizing it locally.\nVisualizing the dataset through the use of geospatial libraries; including Geopandas & Matplotlib.\nVisualzing either a single river reach or merging multiple reaches to a single shapefile.\nQuerying specific variables of interest.\n\n\n\n\nImport libraries\n\nimport os\nimport glob \nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport zipfile\nimport earthaccess", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#earthdata-login", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#earthdata-login", + "title": "Amazon Estuary Exploration:", + "section": "Earthdata Login", + "text": "Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Shapefile Exploration" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#authentication-with-earthaccess", - "href": "notebooks/GIS/SWOT_GISshapefiles.html#authentication-with-earthaccess", - "title": "SWOT North American Continent Hydrology Dataset", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch using earthaccess for SWOT River Reaches\nEach dataset has it’s own unique collection concept ID. For this dataset it is SWOT_L2_HR_RiverSP_2.0. We don’t need 1000+ files, we just want the river reach files over North America. SWOT files come in “reach” and “node” versions in the same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’ via wildcard search.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_NA_*') # here we filter by Reach files (not node), continent code=NA\n\nGranules found: 192\n\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_River_Feb2024\")\n\n\n\nUnzip shapefiles to existing folder\n\nfolder = Path(\"../datasets/data_downloads/SWOT_River_Feb2024\")\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nOpening a Single Shapefile\nUsing Geopandas to open & read a single shapefile. (Select desired single pass from list with path to downloaded shapefile)\n\nRiver = gpd.read_file(folder / 'SWOT_L2_HR_RiverSP_Reach_010_380_NA_20240207T132630_20240207T132640_PIC0_01.shp')\nRiver\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n72302000011\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.945799\n-57.862132\nHumber River\n4.236410e+01\n8.633000e-01\n8.585900e-01\n...\n675.648\n10\n2135.645\n1984.456750\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.87428 48.95038, -57.87387 48.9...\n\n\n1\n72302000021\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.947712\n-57.846809\nHumber River\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n217.623\n4\n3008.992\n873.346819\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.85082 48.94446, -57.85058 48.9...\n\n\n2\n72302000043\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.973874\n-57.788332\nHumber River\n5.920900e+00\n1.440190e+00\n1.437370e+00\n...\n7900.098\n46\n12109.956\n9100.964613\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-57.83865 48.95172, -57.83824 48.9...\n\n\n3\n72302000051\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.995478\n-57.730291\nHumber River\n3.668880e+01\n9.367000e-02\n2.596000e-02\n...\n397.512\n7\n13444.660\n1334.703115\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.73845 48.99230, -57.73804 48.9...\n\n\n4\n72302000063\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.997805\n-57.715888\nHumber River\n2.784380e+01\n9.033000e-02\n7.670000e-03\n...\n1089.674\n6\n14714.137\n1269.477822\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.72209 48.99569, -57.72168 48.9...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n210\n72350800071\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.791094\n-58.985455\nno_data\n9.711690e+01\n3.278100e+00\n3.276860e+00\n...\n821.862\n82\n119786.053\n16448.306136\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.89330 51.77895, -58.89374 51.7...\n\n\n211\n72350800081\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:10Z\n51.886956\n-59.172704\nno_data\n1.168453e+02\n7.567680e+00\n7.567140e+00\n...\n2599.684\n99\n139644.759\n19858.706858\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.07129 51.82866, -59.07148 51.8...\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n9.837220e+01\n1.775170e+00\n1.772890e+00\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n213\n72350800101\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n52.045314\n-59.409170\nSaint-Augustin River\n1.425316e+02\n7.325890e+00\n7.325330e+00\n...\n590.479\n68\n166028.213\n13615.816320\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-59.37465 52.00988, -59.37449 52.0...\n\n\n214\n72350800111\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.696292\n-58.702223\nno_data\n1.045083e+02\n1.271013e+01\n1.270981e+01\n...\n1257.012\n97\n79887.666\n19340.975021\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.72011 51.63638, -58.72011 51.6...\n\n\n\n\n215 rows × 127 columns\n\n\n\n\n\nPlotting a Shapefile\nUsing Matplotlib to plot the shapefile, then adding a basemap for context using the library Contextily.\nContextily offers a list of basemap providers that can be easily visualized.\nhttps://contextily.readthedocs.io/en/latest/intro_guide.html\n\nfig, ax = plt.subplots(figsize=(25,15))\nRiver.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\n\n\nShapefile Attribute Visualization\nShapefiles have various attributes or variables with each column signifiying individual data values.\nPreviously, we plotted by showcasing the full path of the river reach on the map.\nYou can also plot a shapefile based on a specific variable.\nWithin Matplotlib you can specifiy the column parameter based on the column within the datasets attributes.\nFor the example below, we will look at the column ‘wse’ which stands for water surface elevation.\n\n#First, we set all -999999999999 values to nan so that the color variation shows in the values.\nRiver[\"wse\"] = River.wse.apply(lambda x: x if x > -10 else np.nan)\n\n\nfig, ax = plt.subplots(figsize=(15,15))\nRiver.plot(column='wse', ax=ax, legend=True, cmap='viridis')\n\n\n\n\n\n\n\n\n\n\nQuerying a Shapefile\nIf you want to search for a specific reach id or a specific length of river reach that is possible through a spatial query using Geopandas.\nUtilizing comparison operators (>, <, ==, >=, <=).\n\nQuery = River.query(\"reach_id == '72350800091'\")\nQuery\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n98.3722\n1.77517\n1.77289\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n\n\n1 rows × 127 columns\n\n\n\n\nfig, ax = plt.subplots(figsize=(25,15))\nQuery.plot(ax=ax, legend=True)\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.Esri.NatGeoWorldMap)\n\n\n\n\n\n\n\n\n\n\nYou can specify river reaches that have a water surface elevation greater than 35 meters.\n\nWSE = River.query('wse > 35')\nWSE\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n72302000011\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.945799\n-57.862132\nHumber River\n42.3641\n0.86330\n0.85859\n...\n675.648\n10\n2135.645\n1984.456750\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.87428 48.95038, -57.87387 48.9...\n\n\n3\n72302000051\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.995478\n-57.730291\nHumber River\n36.6888\n0.09367\n0.02596\n...\n397.512\n7\n13444.660\n1334.703115\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.73845 48.99230, -57.73804 48.9...\n\n\n9\n72302000111\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:00Z\n49.170904\n-57.404776\nno_data\n118.9760\n0.83515\n0.83029\n...\n105.642\n28\n50331.655\n5596.729779\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.43636 49.16979, -57.43570 49.1...\n\n\n10\n72302000123\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:00Z\n49.177845\n-57.348725\nno_data\n116.7355\n0.09589\n0.03309\n...\n35547.561\n20\n54269.288\n3937.633107\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-57.37279 49.17719, -57.37255 49.1...\n\n\n11\n72302000131\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n49.171135\n-57.263679\nno_data\n92.1803\n1.43050\n1.42767\n...\n500301.988\n61\n66530.524\n12261.235771\n-1.000000e+12\n0\n4\n1\n0\nLINESTRING (-57.32502 49.17382, -57.32461 49.1...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n210\n72350800071\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.791094\n-58.985455\nno_data\n97.1169\n3.27810\n3.27686\n...\n821.862\n82\n119786.053\n16448.306136\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.89330 51.77895, -58.89374 51.7...\n\n\n211\n72350800081\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:10Z\n51.886956\n-59.172704\nno_data\n116.8453\n7.56768\n7.56714\n...\n2599.684\n99\n139644.759\n19858.706858\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.07129 51.82866, -59.07148 51.8...\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n98.3722\n1.77517\n1.77289\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n213\n72350800101\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n52.045314\n-59.409170\nSaint-Augustin River\n142.5316\n7.32589\n7.32533\n...\n590.479\n68\n166028.213\n13615.816320\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-59.37465 52.00988, -59.37449 52.0...\n\n\n214\n72350800111\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.696292\n-58.702223\nno_data\n104.5083\n12.71013\n12.70981\n...\n1257.012\n97\n79887.666\n19340.975021\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.72011 51.63638, -58.72011 51.6...\n\n\n\n\n116 rows × 127 columns\n\n\n\n\nfig, ax = plt.subplots(figsize=(25,15))\nWSE.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.Esri.NatGeoWorldMap)", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#liquid-water-equivalent-lwe-thickness-grace-grace-fo", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#liquid-water-equivalent-lwe-thickness-grace-grace-fo", + "title": "Amazon Estuary Exploration:", + "section": "Liquid Water Equivalent (LWE) Thickness (GRACE & GRACE-FO)", + "text": "Liquid Water Equivalent (LWE) Thickness (GRACE & GRACE-FO)\n\nSearch for GRACE LWE Thickness data\nSuppose we are interested in LWE data from the dataset (DOI:10.5067/TEMSC-3JC63) described on this PO.DAAC dataset landing page: https://podaac.jpl.nasa.gov/dataset/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3 From the landing page, we see the dataset Short Name under the Information tab. This is what we will be using to search for the collection with earthaccess.\nYou can also access the short name of the dataset through Earthdata search at: https://search.earthdata.nasa.gov.\n\n#search for the granules using the short name\ngrace_results = earthaccess.search_data(short_name=\"TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3\")\n\nGranules found: 1\n\n\n\n\nOpen the .nc file in the s3 bucket and load it into an xarray dataset\n\nds_GRACE = xr.open_mfdataset(earthaccess.open([grace_results[0]]), engine='h5netcdf')\nds_GRACE\n\n Opening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lon: 720, lat: 360, time: 219, bounds: 2)\nCoordinates:\n * lon (lon) float64 0.25 0.75 1.25 1.75 ... 358.2 358.8 359.2 359.8\n * lat (lat) float64 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * time (time) datetime64[ns] 2002-04-17T12:00:00 ... 2023-03-16T1...\nDimensions without coordinates: bounds\nData variables:\n lwe_thickness (time, lat, lon) float64 dask.array<chunksize=(219, 360, 720), meta=np.ndarray>\n uncertainty (time, lat, lon) float64 dask.array<chunksize=(219, 360, 720), meta=np.ndarray>\n lat_bounds (lat, bounds) float64 dask.array<chunksize=(360, 2), meta=np.ndarray>\n lon_bounds (lon, bounds) float64 dask.array<chunksize=(720, 2), meta=np.ndarray>\n time_bounds (time, bounds) datetime64[ns] dask.array<chunksize=(219, 2), meta=np.ndarray>\n land_mask (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\n scale_factor (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\n mascon_ID (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\nAttributes: (12/53)\n Conventions: CF-1.6, ACDD-1.3, ISO 8601\n Metadata_Conventions: Unidata Dataset Discovery v1.0\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadata ...\n title: JPL GRACE and GRACE-FO MASCON RL06.1Mv03 CRI\n summary: Monthly gravity solutions from GRACE and G...\n keywords: Solid Earth, Geodetics/Gravity, Gravity, l...\n ... ...\n C_30_substitution: TN-14; Loomis et al., 2019, Geophys. Res. ...\n user_note_1: The accelerometer on the GRACE-B spacecraf...\n user_note_2: The accelerometer on the GRACE-D spacecraf...\n journal_reference: Watkins, M. M., D. N. Wiese, D.-N. Yuan, C...\n CRI_filter_journal_reference: Wiese, D. N., F. W. Landerer, and M. M. Wa...\n date_created: 2023-05-22T06:05:03Zxarray.DatasetDimensions:lon: 720lat: 360time: 219bounds: 2Coordinates: (3)lon(lon)float640.25 0.75 1.25 ... 359.2 359.8units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :Xvalid_min :0.25valid_max :359.75bounds :lon_boundsarray([2.5000e-01, 7.5000e-01, 1.2500e+00, ..., 3.5875e+02, 3.5925e+02,\n 3.5975e+02])lat(lat)float64-89.75 -89.25 ... 89.25 89.75units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Yvalid_min :-89.75valid_max :89.75bounds :lat_boundsarray([-89.75, -89.25, -88.75, ..., 88.75, 89.25, 89.75])time(time)datetime64[ns]2002-04-17T12:00:00 ... 2023-03-...long_name :timestandard_name :timeaxis :Tbounds :time_boundsarray(['2002-04-17T12:00:00.000000000', '2002-05-10T12:00:00.000000000',\n '2002-08-16T12:00:00.000000000', ..., '2023-01-16T12:00:00.000000000',\n '2023-02-15T00:00:00.000000000', '2023-03-16T12:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (8)lwe_thickness(time, lat, lon)float64dask.array<chunksize=(219, 360, 720), meta=np.ndarray>units :cmlong_name :Liquid_Water_Equivalent_Thicknessstandard_name :Liquid_Water_Equivalent_Thicknessgrid_mapping :WGS84valid_min :-1986.9763606523888valid_max :965.4782725418918comment :Coastline Resolution Improvement (CRI) filter is applied\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n433.08 MiB\n433.08 MiB\n\n\nShape\n(219, 360, 720)\n(219, 360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360 219\n\n\n\n\nuncertainty(time, lat, lon)float64dask.array<chunksize=(219, 360, 720), meta=np.ndarray>units :cmlong_name :uncertaintystandard_name :uncertaintygrid_mapping :WGS84valid_min :0.15854006805783352valid_max :53.34469598560085comment :1-sigma uncertainty: not for each 0.5 degree grid cell, but for each 3-degree mascon estimate\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n433.08 MiB\n433.08 MiB\n\n\nShape\n(219, 360, 720)\n(219, 360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360 219\n\n\n\n\nlat_bounds(lat, bounds)float64dask.array<chunksize=(360, 2), meta=np.ndarray>long_name :latitude boundariesunits :degrees_northcomment :latitude values at the north and south bounds of each pixel\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.62 kiB\n5.62 kiB\n\n\nShape\n(360, 2)\n(360, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 360\n\n\n\n\nlon_bounds(lon, bounds)float64dask.array<chunksize=(720, 2), meta=np.ndarray>long_name :longitude boundariesunits :degrees_eastcomment :longitude values at the west and east bounds of each pixel\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n11.25 kiB\n11.25 kiB\n\n\nShape\n(720, 2)\n(720, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 720\n\n\n\n\ntime_bounds(time, bounds)datetime64[ns]dask.array<chunksize=(219, 2), meta=np.ndarray>long_name :time boundariescomment :time bounds for each time value, i.e. the first day and last day included in the monthly solution\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.42 kiB\n3.42 kiB\n\n\nShape\n(219, 2)\n(219, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2 219\n\n\n\n\nland_mask(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :binarylong_name :Land_Maskstandard_name :Land_Maskdescription :Land Mask that was used with the CRI filter\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nscale_factor(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :dimensionlesslong_name :Scale_Factor_CRIstandard_name :Scale_Factor_CRIvalid_min :-99999.0valid_max :24.133988467789724description :Gridded scale factors to be used with mascon solution that has the CRI filter applied; based on CLM data from 2002-2009\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nmascon_ID(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :dimensionlesslong_name :Mascon_Identifierstandard_name :Mascon_IDvalid_min :1valid_max :4551description :Mascon identifier mapped to the grid\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nIndexes: (3)lonPandasIndexPandasIndex(Index([ 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4.25,\n 4.75,\n ...\n 355.25, 355.75, 356.25, 356.75, 357.25, 357.75, 358.25, 358.75, 359.25,\n 359.75],\n dtype='float64', name='lon', length=720))latPandasIndexPandasIndex(Index([-89.75, -89.25, -88.75, -88.25, -87.75, -87.25, -86.75, -86.25, -85.75,\n -85.25,\n ...\n 85.25, 85.75, 86.25, 86.75, 87.25, 87.75, 88.25, 88.75, 89.25,\n 89.75],\n dtype='float64', name='lat', length=360))timePandasIndexPandasIndex(DatetimeIndex(['2002-04-17 12:00:00', '2002-05-10 12:00:00',\n '2002-08-16 12:00:00', '2002-09-16 00:00:00',\n '2002-10-16 12:00:00', '2002-11-16 00:00:00',\n '2002-12-16 12:00:00', '2003-01-16 12:00:00',\n '2003-02-15 00:00:00', '2003-03-16 12:00:00',\n ...\n '2022-06-16 00:00:00', '2022-07-16 12:00:00',\n '2022-08-16 12:00:00', '2022-09-16 00:00:00',\n '2022-10-16 12:00:00', '2022-11-16 00:00:00',\n '2022-12-16 12:00:00', '2023-01-16 12:00:00',\n '2023-02-15 00:00:00', '2023-03-16 12:00:00'],\n dtype='datetime64[ns]', name='time', length=219, freq=None))Attributes: (53)Conventions :CF-1.6, ACDD-1.3, ISO 8601Metadata_Conventions :Unidata Dataset Discovery v1.0standard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Convention-1.6title :JPL GRACE and GRACE-FO MASCON RL06.1Mv03 CRIsummary :Monthly gravity solutions from GRACE and GRACE-FO as determined from the JPL RL06.1Mv03 mascon solution - with CRI filter appliedkeywords :Solid Earth, Geodetics/Gravity, Gravity, liquid_water_equivalent_thicknesskeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsplatform :GRACE and GRACE-FOinstitution :NASA/JPLcreator_name :David Wiesecreator_email :grace@podaac.jpl.nasa.govcreator_url :https://grace.jpl.nasa.govcreator_type :groupcreator_institution :NASA/JPLpublisher_name :Physical Oceanography Distributed Active Archive Centerpublisher_email :podaac@jpl.nasa.govpublisher_url :https://podaac.jpl.nasa.govpublisher_type :grouppublisher_institution :NASA/JPLproject :NASA Gravity Recovery and Climate Experiment (GRACE) and NASA Gravity Recovery and Climate Experiment Follow-On (GRACE-FO)program :NASA Earth Science System Pathfinder and NASA Earth Systematic Missions Programid :10.5067/TEMSC-3JC62naming_authority :org.doi.dxsource :GRACE and GRACE-FO JPL RL06.1Mv03-CRIprocessing_level :2 and 3acknowledgement :GRACE is a joint mission of NASA (USA) and DLR (Germany). GRACE-FO is a joint mission of NASA (USA) and the German Research Center for Geosciences (GFZ). Use the digital object identifier provided in the id attribute when citing this data. See https://podaac.jpl.nasa.gov/CitingPODAAClicense :https://science.nasa.gov/earth-science/earth-science-data/data-information-policyproduct_version :v3.0time_epoch :2002-01-01T00:00:00Ztime_coverage_start :2002-04-16T00:00:00Ztime_coverage_end :2023-03-16T23:59:59Zgeospatial_lat_min :-89.75geospatial_lat_max :89.75geospatial_lat_units :degrees_northgeospatial_lat_resolution :0.5 degree grid; however the native resolution of the data is 3-degree equal-area masconsgeospatial_lon_min :0.25geospatial_lon_max :359.75geospatial_lon_units :degrees_eastgeospatial_lon_resolution :0.5 degree grid; however the native resolution of the data is 3-degree equal-area masconstime_mean_removed :2004.000 to 2009.999months_missing :2002-06;2002-07;2003-06;2011-01;2011-06;2012-05;2012-10;2013-03;2013-08;2013-09;2014-02;2014-07;2014-12;2015-06;2015-10;2015-11;2016-04;2016-09;2016-10;2017-02;2017-07;2017-08;2017-09;2017-10;2017-11;2017-12;2018-01;2018-02;2018-03;2018-04;2018-05;2018-08-2018-09postprocess_1 : OCEAN_ATMOSPHERE_DEALIAS_MODEL (GAD), MONTHLY_AVE, ADDED BACK TO OCEAN PIXELS ONLYpostprocess_2 :Water density used to convert to equivalent water height: 1000 kg/m^3postprocess_3 :Coastline Resolution Improvement (CRI) filter has been applied to separate land/ocean mass within mascons that span coastlinesGIA_removed :ICE6G-D; Peltier, W. R., D. F. Argus, and R. Drummond (2018) Comment on the paper by Purcell et al. 2016 entitled An assessment of ICE-6G_C (VM5a) glacial isostatic adjustment model, J. Geophys. Res. Solid Earth, 122.geocenter_correction :We use a version of TN-13 based on the JPL masconsC_20_substitution :TN-14; Loomis et al., 2019, Geophys. Res. Lett., doi:10.1029/2019GL082929C_30_substitution :TN-14; Loomis et al., 2019, Geophys. Res. Lett., doi:10.1029/2019GL082929. This substitution is made for all months after August 2016.user_note_1 :The accelerometer on the GRACE-B spacecraft was turned off after August 2016. After this date, the accelerometer on GRACE-A was used to derive the non-gravitational accelerations acting on GRACE-B using a transplant procedure. This has led to a subsequent degradation in the quality of the gravity fields derived. The uncertainties in this file have been scaled to accomodate this degradation.user_note_2 :The accelerometer on the GRACE-D spacecraft began performing sub-optimally after June 21, 2018. After this date, the accelerometer on GRACE-C is used to derive the non-gravitational accelerations acting on GRACE-D using a transplant procedure. The uncertainties in the file have been scaled to accomodate this degradation using the current best state of knowledge.journal_reference :Watkins, M. M., D. N. Wiese, D.-N. Yuan, C. Boening, and F. W. Landerer (2015) Improved methods for observing Earth's time variable mass distribution with GRACE using spherical cap mascons, J. Geophys. Res., 120, doi:10.1002/2014JB011547. CRI_filter_journal_reference :Wiese, D. N., F. W. Landerer, and M. M. Watkins (2016) Quantifying and reducing leakage errors in the JPL RL05M GRACE mascon solution, Water Resour. Res., 52, doi:10.1002/2016WR019344. date_created :2023-05-22T06:05:03Z\n\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data to plot with hvplot.\n\nlat_bnds, lon_bnds = [-18, 10], [275, 330] #degrees east for longitude\nds_GRACE_subset= ds_GRACE.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_GRACE_subset\n\nds_GRACE_subset.lwe_thickness.hvplot.image(y='lat', x='lon', cmap='bwr_r',).opts(clim=(-80,80))", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Shapefile Exploration" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#merging-multiple-reaches-to-a-single-shapefile", - "href": "notebooks/GIS/SWOT_GISshapefiles.html#merging-multiple-reaches-to-a-single-shapefile", - "title": "SWOT North American Continent Hydrology Dataset", - "section": "Merging multiple reaches to a single shapefile", - "text": "Merging multiple reaches to a single shapefile\n\nIf you have multiple River Reaches or Nodes in a folder, it is possible to visualize all on a single map.\nUtilizing both Glob and Pathlib libraries to read the folder, then using Pandas concat to merge the reaches to its own variable.\n\n\n# State filename extension to look for within folder, in this case .shp which is the shapefile\nshapefiles = folder.glob(\"*.shp\")\n\n# Merge/Combine multiple shapefiles in folder into one\ngdf = pd.concat([\n gpd.read_file(shp)\n for shp in shapefiles\n]).pipe(gpd.GeoDataFrame)\n\n# Export merged geodataframe into shapefile\ngdf.to_file(folder / 'SWOTReaches_Feb.shp')\n\n\nfig, ax = plt.subplots(figsize=(25,15))\ngdf.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=gdf.crs, source=cx.providers.OpenTopoMap)", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#river-heights-pre-swot-measures", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#river-heights-pre-swot-measures", + "title": "Amazon Estuary Exploration:", + "section": "River heights (Pre-SWOT MEaSUREs)", + "text": "River heights (Pre-SWOT MEaSUREs)\nThe shortname for MEaSUREs is ‘PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2’ with the concept ID: C2036882359-POCLOUD. The guidebook explains the details of the Pre-SWOT MEaSUREs data.\nOur desired variable is height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Amazon estuary. Time is between April 8, 1993 and April 20, 2019.\nTo get the data for the exact area we need, we have set the boundaries of (-74.67188,-4.51279,-51.04688,0.19622) as reflected in our earthaccess data search.\nLet’s again access the netCDF file from an s3 bucket and look at the data structure.\n\n#earthaccess search using our established parameters to only find necessary granules\nMEaSUREs_results = earthaccess.search_data(short_name=\"PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\", temporal = (\"1993-04-08\", \"2019-04-20\"), bounding_box=(-74.67188,-4.51279,-51.04688,0.19622))\n\nGranules found: 1\n\n\n\nds_MEaSUREs = xr.open_mfdataset(earthaccess.open([MEaSUREs_results[0]]), engine='h5netcdf')\nds_MEaSUREs\n\n Opening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (X: 3311, Y: 3311, distance: 3311, time: 9469,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-08T15:20:40.665117184 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n lat (Y) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n FD (distance) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n height (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\n sat (charlength, time) |S1 dask.array<chunksize=(26, 9469), meta=np.ndarray>\n storage (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\n IceFlag (time) float64 dask.array<chunksize=(9469,), meta=np.ndarray>\n LakeFlag (distance) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n Storage_uncertainty (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: -0.6550700975069503\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 92.7681246287056\n geospatial_vertical_min: -3.5634095181633763\n geospatial_vertical_units: m\n geospatial_vertical_positive: upxarray.DatasetDimensions:X: 3311Y: 3311distance: 3311time: 9469charlength: 26Coordinates: (1)time(time)datetime64[ns]1993-04-08T15:20:40.665117184 .....long_name :timestandard_name :timeaxis :Tarray(['1993-04-08T15:20:40.665117184', '1993-04-09T15:20:40.665117184',\n '1993-04-10T15:20:40.665117184', ..., '2019-04-18T03:39:13.243964928',\n '2019-04-19T03:39:13.243964928', '2019-04-20T03:39:13.243964928'],\n dtype='datetime64[ns]')Data variables: (9)lon(X)float64dask.array<chunksize=(3311,), meta=np.ndarray>units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :X\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nlat(Y)float64dask.array<chunksize=(3311,), meta=np.ndarray>units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Y\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nFD(distance)float64dask.array<chunksize=(3311,), meta=np.ndarray>long_name :distance_from_river_mouthunits :kmcomment :This is the distance along the river centerline from the river mouth to this VS.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nheight(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :mpositive :uplong_name :interpolated_heightsstandard_name :heightvalid_min :-3.5634095181633763valid_max :92.7681246287056comment :A time flow distance grid of river water heights with respect to the EGM08 Geoid).-9999 fill values are for missing data, while -9995 fill values are for lakes and reservoirs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nsat(charlength, time)|S1dask.array<chunksize=(26, 9469), meta=np.ndarray>long_name :satellitecomment :The satellite the measurement is derived from.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n240.42 kiB\n240.42 kiB\n\n\nShape\n(26, 9469)\n(26, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 9469 26\n\n\n\n\nstorage(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :km3positive :uplong_name :river_channel_storagecomment :A time flow distance grid of river channel storage values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nIceFlag(time)float64dask.array<chunksize=(9469,), meta=np.ndarray>long_name :Ice_Flagvalid_range :0, 1flag_masks :1flag_meaning :Time of ice covercomment : This is a flag for masking out times of Ice Cover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n73.98 kiB\n73.98 kiB\n\n\nShape\n(9469,)\n(9469,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 1\n\n\n\n\nLakeFlag(distance)float64dask.array<chunksize=(3311,), meta=np.ndarray>long_name :Lake_Flagvalid_range :0, 1flag_masks :1flag_meaning :River sections that are lakes or reservoirscomment : This is a flag for masking out setions that are lakes or reservoirs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nStorage_uncertainty(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :km3positive :uplong_name :river_channel_storage_uncertaintycomment :A time flow distance grid of river channel storage uncertainty values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(DatetimeIndex(['1993-04-08 15:20:40.665117184',\n '1993-04-09 15:20:40.665117184',\n '1993-04-10 15:20:40.665117184',\n '1993-04-11 15:20:40.665117184',\n '1993-04-12 15:20:40.665117184',\n '1993-04-13 15:20:40.665117184',\n '1993-04-14 15:20:40.665117184',\n '1993-04-15 15:20:40.665117184',\n '1993-04-16 15:20:40.665117184',\n '1993-04-17 15:20:40.665117184',\n ...\n '2019-04-11 03:39:13.243964928',\n '2019-04-12 03:39:13.243964928',\n '2019-04-13 03:39:13.243964928',\n '2019-04-14 03:39:13.243964928',\n '2019-04-15 03:39:13.243964928',\n '2019-04-16 03:39:13.243964928',\n '2019-04-17 03:39:13.243964928',\n '2019-04-18 03:39:13.243964928',\n '2019-04-19 03:39:13.243964928',\n '2019-04-20 03:39:13.243964928'],\n dtype='datetime64[ns]', name='time', length=9469, freq=None))Attributes: (40)title :GRRATS (Global River Radar Altimetry Time Series)1km daily interpolation for the Amazon RiverConventions :CF-1.6, ACDD-1.3institution :Ohio State University, School of Earth Sciencessource :MEaSUREs OSU Storage toolbox 2018keywords :EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURFACE WATER,SURFACE WATER PROCESSES/MEASUREMENTS,STAGE HEIGHTkeywords_vocabulary :Global Change Master Directory (GCMD)cdm_data_type :stationcreator_name :Coss,Stevecreator_email :Coss.31@osu.eduproject :MEaSUREs OSUprogram :NASA Earth Science Data Systems (ESDS)publisher_name :PO.DAAC (Physical Oceanography Distributed Active Archive Center)publisher_email :podaac@podaac.jpl.nasa.govpublisher_url :podaac.jpl.nasa.govpublisher_type :Institutionpublisher_institution :PO.DAACprocessing_level :L2doi :10.5067/PSGRA-DA2V2history :This GRRATS product adds data river surface height data from ERS1, ERS2, TOPEX/Poseidon and Jason-3 to expand the temporal coverage of the product. GRRATS1kd includes interpolated daily 1km resolution height measurements as well as river channel storage measurements. platform :ERS-1(L2),ERS-2(L2),TOPEX/POSEIDON(L2), Jason-1(L2),OSTM/Jason-2(L2),Jason-3(L2),Envisat(L2)platform_vocabulary :NASA/GCMD Platform Keywords. Version 8.6instrument :RA(L2),RA-2(L2),ALT(TOPEX)(L2),POSEIDON-2(L2),POSEIDON-3(L2),POSEIDON-3b(L2)instrument_vocabulary :NASA/GCMD Platform Keywords. Version 8.6references :in review :doi.org/10.5194/essd-2019-84id :GRRATS(Global River Radar Altimeter Time Series) 1km/dailysummary :The Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolations are river heights from ERS1, ERS2, TOPEX/Poseidon OSTM/Jason-2 Envisat and Jason-3 that are interpolated and processed to create a continuous heights for the study over the temporal range of the altimeters used. The purpose of these heights are to provide satellite altimetric river height data in a form that is more recognizable to the observational community and as a way to get users use to using satellite data for river hydrology.time_coverage_resolution :1 daydate_created :2021-06-30T08:03:41time_coverage_start :1992-04-08T15:20:40time_coverage_end :2018-04-20T03:39:13geospatial_lon_min :-73.35433106652545geospatial_lon_max :-51.0426448887506geospatial_lon_units :degree_eastgeospatial_lat_min :-4.3804275867636875geospatial_lat_max :-0.6550700975069503geospatial_lat_units :degree_northgeospatial_vertical_max :92.7681246287056geospatial_vertical_min :-3.5634095181633763geospatial_vertical_units :mgeospatial_vertical_positive :up\n\n\n\nPlot a subset of the data\nPlotting the river distances and associated heights on the map at time t=9069 (March 16, 2018) using plt.\n\nfig = plt.figure(figsize=[11,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-85, -30, -20, 20])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Shapefile Exploration" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/GIS/Subscriber_nc_to_tif_SWOT.html", - "href": "notebooks/GIS/Subscriber_nc_to_tif_SWOT.html", - "title": "podaac-data-subscriber NetCDF to Geotiff Conversion", - "section": "", - "text": "Author: Jack McNelis, PO.DAAC\n\n\nSummary\nThe following workflow extracts a single variable of interest (water surface elevation (wse)) from the SWOT_L2_HR_Raster_2.0 and writes the original raster netCDF it to a geotiff via the podaac-data-subscriber tool.\n\n\nRequirements\n\nThis tutorial can be run in any Linux environment. (The subscriber tool can be run in any environment, not just Linux, but the bash script used as the process will only work in a Linux environment.)\nEarthdata Login - An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nnetrc File - You will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\n\nLearning Objectives\n\nUse the “–process” option in the podaac-data-subscriber\nConvert netCDF files to geotiff files using gdalmdimtranslate in a bash script\n\n\n\nCreate a Bash Script\nInside a bash script entitled, test.sh, set up the following command which calls gdalmdimtranslate to write the wse variable in the downloaded netcdf file to a new geotiff in the same directory:\n#!/bin/bash\ngdalmdimtranslate \\\n -of \"GTiff\" \\\n -co \"COMPRESS=LZW\" \\\n -array \"wse\" \\\n ${1} $(basename $1 | sed 's/.nc/.wse.tif/g')\n\n\nCall the Data Subscriber\nThen, after installing the podaac-data-subscriber package, write the following command in your terminal that uses the podaac-data-subscriber to run the bash script:\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d ~/test_podaac/ -sd 2024-02-15T15:15:00Z -ed 2024-02-15T15:16:00Z --process \"${PWD}/test.sh\"\nIf you get a permission denied error for test.sh, Make sure the permissions on the .sh file are set to read, write & executable. If you are unsure what your permissions are, in the command prompt you can execute “chmod 0755 test.sh” and permissions should be updated.\nListed Results from the above command should be as follows:\n$ ls\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.wse.tif\ntest.sh", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-salinity-multi-mission-smap-aquarius-smos", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-salinity-multi-mission-smap-aquarius-smos", + "title": "Amazon Estuary Exploration:", + "section": "Sea Surface Salinity (Multi-mission: SMAP, Aquarius, SMOS)", + "text": "Sea Surface Salinity (Multi-mission: SMAP, Aquarius, SMOS)\nThe shortname for this dataset is ‘OISSS_L4_multimission_7day_v1’ with the concept ID: C2095055342-POCLOUD. This dataset contains hundreds of granules, so it would be impractical to search and copy all of the URLs in Earthdata Search. Using the shortname, we can access all the files at once in the cloud (1.1 GB data).\n\nsss_results = earthaccess.search_data(short_name=\"OISSS_L4_multimission_7day_v1\")\n\nGranules found: 998\n\n\nThe following cell may take up to around 10 minutes to run due to the size of the dataset\n\n#this line ignores warnings about large chunk sizes\ndask.config.set(**{'array.slicing.split_large_chunks': False})\n\nds_sss = xr.open_mfdataset(earthaccess.open(sss_results),\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks='auto',\n engine='h5netcdf')\nds_sss\n\n Opening 998 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 998)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-08-28 ... 2022-08-02\nData variables:\n sss (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_empirical_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 962), meta=np.ndarray>\n sss_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_7d_v1\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: 0.25\n geospatial_lat_units: degrees_north\n geospatial_lon_min: -180.0\n geospatial_lon_max: 180.0\n geospatial_lon_resolution: 0.25\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 998Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :-180.0valid_max :180.0coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-08-28 ... 2022-08-02long_name :center day of a time period over which satellite Level 2 SSS data have been collected for OISSS analysisstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-08-28T00:00:00.000000000', '2011-09-01T00:00:00.000000000',\n '2011-09-05T00:00:00.000000000', ..., '2022-07-25T00:00:00.000000000',\n '2022-07-29T00:00:00.000000000', '2022-08-02T00:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (3)sss(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :sea surface salinitystandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n150.29 MiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 38)\n\n\nDask graph\n961 chunks in 1939 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nsss_empirical_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 962), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSSunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n3.72 GiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 962)\n\n\nDask graph\n37 chunks in 86 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nsss_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSSunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coordinates :time longitude latududecoverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n150.29 MiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 38)\n\n\nDask graph\n961 chunks in 1934 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nIndexes: (3)longitudePandasIndexPandasIndex(Index([-179.875, -179.625, -179.375, -179.125, -178.875, -178.625, -178.375,\n -178.125, -177.875, -177.625,\n ...\n 177.625, 177.875, 178.125, 178.375, 178.625, 178.875, 179.125,\n 179.375, 179.625, 179.875],\n dtype='float32', name='longitude', length=1440))latitudePandasIndexPandasIndex(Index([-89.875, -89.625, -89.375, -89.125, -88.875, -88.625, -88.375, -88.125,\n -87.875, -87.625,\n ...\n 87.625, 87.875, 88.125, 88.375, 88.625, 88.875, 89.125, 89.375,\n 89.625, 89.875],\n dtype='float32', name='latitude', length=720))timePandasIndexPandasIndex(DatetimeIndex(['2011-08-28', '2011-09-01', '2011-09-05', '2011-09-09',\n '2011-09-13', '2011-09-17', '2011-09-21', '2011-09-25',\n '2011-09-29', '2011-10-03',\n ...\n '2022-06-27', '2022-07-01', '2022-07-05', '2022-07-09',\n '2022-07-13', '2022-07-17', '2022-07-21', '2022-07-25',\n '2022-07-29', '2022-08-02'],\n dtype='datetime64[ns]', name='time', length=998, freq=None))Attributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity 7-Day Global Dataset V1.0Short_Name :OISSS_L4_multimission_7d_v1Version :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2023-01-16T04:04:41ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.edu.orgPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2022month_of_observation :3day_of_observation :11time_coverage_start :2022-03-07T12:00:00Ztime_coverage_end :2022-03-15T12:00:00Ztime_coverage_resolution :P7Dcdm_data_type :gridgeospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lat_resolution :0.25geospatial_lat_units :degrees_northgeospatial_lon_min :-180.0geospatial_lon_max :180.0geospatial_lon_resolution :0.25geospatial_lon_units :degrees_east\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data at the outlet of the Amazon to plot at time t=0 (August 28, 2011) with hvplot.\n\nlat_bnds, lon_bnds = [-2, 6], [-52, -44] \nds_sss_subset = ds_sss.sel(latitude=slice(*lat_bnds), longitude=slice(*lon_bnds))\nds_sss_subset\n\nds_sss_subset.sss[:,:,0].hvplot()", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Transform Data", - "NetCDF to Geotiff", - "Mac/Linux" + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" ] }, { - "objectID": "notebooks/Harmony API.html#harmony-eoss-api-tutorial", - "href": "notebooks/Harmony API.html#harmony-eoss-api-tutorial", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Harmony EOSS API Tutorial", - "text": "Harmony EOSS API Tutorial" - }, - { - "objectID": "notebooks/Harmony API.html#before-you-start", - "href": "notebooks/Harmony API.html#before-you-start", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-temperature-modis", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-temperature-modis", + "title": "Amazon Estuary Exploration:", + "section": "Sea Surface Temperature (MODIS)", + "text": "Sea Surface Temperature (MODIS)\nMODIS has SST data that coincides with the period used for SSS, 2011-present (943 MB), and has the short name: “MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0”. Let’s access this in the same method as before.\nGet a list of files so we can open them all at once, creating an xarray dataset using the open_mfdataset() function to “read in” all of the netCDF4 files in one call. MODIS does not have a built-in time variable like SSS, but it is subset by latitude and longitude coordinates. We need to combine the files using the nested format with a created ‘time’ dimension.\n\nmodis_results = earthaccess.search_data(short_name=\"MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0\", temporal = (\"2011-01-01\", \"2023-01-01\"))\n\nGranules found: 143\n\n\nMODIS did not come with a time variable, so it needs to be extracted from the file names and added in the file preprocessing so files can be successfully concatenated.\n\n#function for time dimension added to each netCDF file\ndef preprocessing(ds): \n file_name = ds.product_name\n file_date = basename(file_name).split(\"_\")[2][:6]\n file_date_c = datetime.strptime(file_date, \"%Y%m\")\n time_point = [file_date_c]\n ds.coords['time'] = ('time', time_point) #expand the dimensions to include time\n return ds\n\nds_MODIS = xr.open_mfdataset(earthaccess.open(modis_results), combine='by_coords', join='override', mask_and_scale=True, decode_cf=True, chunks='auto',preprocess = preprocessing)\nds_MODIS\n\n Opening 143 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 143, lat: 2160, lon: 4320, rgb: 3, eightbitcolor: 256)\nCoordinates:\n * lat (lat) float32 89.96 89.88 89.79 89.71 ... -89.79 -89.88 -89.96\n * lon (lon) float32 -180.0 -179.9 -179.8 -179.7 ... 179.8 179.9 180.0\n * time (time) datetime64[ns] 2011-01-01 2011-02-01 ... 2023-01-01\nDimensions without coordinates: rgb, eightbitcolor\nData variables:\n sst4 (time, lat, lon) float32 dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>\n qual_sst4 (time, lat, lon) float32 dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>\n palette (time, lon, lat, rgb, eightbitcolor) uint8 dask.array<chunksize=(1, 4320, 2160, 3, 256), meta=np.ndarray>\nAttributes: (12/59)\n product_name: AQUA_MODIS.20110101_20110131.L3m.MO.SST...\n instrument: MODIS\n title: MODISA Level-3 Standard Mapped Image\n project: Ocean Biology Processing Group (NASA/GS...\n platform: Aqua\n temporal_range: month\n ... ...\n publisher_url: https://oceandata.sci.gsfc.nasa.gov\n processing_level: L3 Mapped\n cdm_data_type: grid\n data_bins: 4834400\n data_minimum: -1.635\n data_maximum: 32.06999xarray.DatasetDimensions:time: 143lat: 2160lon: 4320rgb: 3eightbitcolor: 256Coordinates: (3)lat(lat)float3289.96 89.88 89.79 ... -89.88 -89.96long_name :Latitudeunits :degrees_northstandard_name :latitudevalid_min :-90.0valid_max :90.0array([ 89.958336, 89.875 , 89.79167 , ..., -89.791664, -89.87501 ,\n -89.958336], dtype=float32)lon(lon)float32-180.0 -179.9 ... 179.9 180.0long_name :Longitudeunits :degrees_eaststandard_name :longitudevalid_min :-180.0valid_max :180.0array([-179.95833, -179.875 , -179.79166, ..., 179.79167, 179.87502,\n 179.95836], dtype=float32)time(time)datetime64[ns]2011-01-01 ... 2023-01-01array(['2011-01-01T00:00:00.000000000', '2011-02-01T00:00:00.000000000',\n '2011-03-01T00:00:00.000000000', '2011-04-01T00:00:00.000000000',\n '2011-05-01T00:00:00.000000000', '2011-06-01T00:00:00.000000000',\n '2011-07-01T00:00:00.000000000', '2011-08-01T00:00:00.000000000',\n '2011-09-01T00:00:00.000000000', '2011-10-01T00:00:00.000000000',\n '2011-11-01T00:00:00.000000000', '2011-12-01T00:00:00.000000000',\n '2012-01-01T00:00:00.000000000', '2012-02-01T00:00:00.000000000',\n '2012-03-01T00:00:00.000000000', '2012-04-01T00:00:00.000000000',\n '2012-05-01T00:00:00.000000000', '2012-06-01T00:00:00.000000000',\n '2012-07-01T00:00:00.000000000', '2012-08-01T00:00:00.000000000',\n '2012-09-01T00:00:00.000000000', '2012-10-01T00:00:00.000000000',\n '2012-11-01T00:00:00.000000000', '2012-12-01T00:00:00.000000000',\n '2013-01-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',\n '2013-03-01T00:00:00.000000000', '2013-04-01T00:00:00.000000000',\n '2013-05-01T00:00:00.000000000', '2013-06-01T00:00:00.000000000',\n '2013-07-01T00:00:00.000000000', '2013-08-01T00:00:00.000000000',\n '2013-09-01T00:00:00.000000000', '2013-10-01T00:00:00.000000000',\n '2013-11-01T00:00:00.000000000', '2013-12-01T00:00:00.000000000',\n '2014-01-01T00:00:00.000000000', '2014-02-01T00:00:00.000000000',\n '2014-03-01T00:00:00.000000000', '2014-04-01T00:00:00.000000000',\n '2014-05-01T00:00:00.000000000', '2014-06-01T00:00:00.000000000',\n '2014-07-01T00:00:00.000000000', '2014-08-01T00:00:00.000000000',\n '2014-09-01T00:00:00.000000000', '2014-10-01T00:00:00.000000000',\n '2014-11-01T00:00:00.000000000', '2014-12-01T00:00:00.000000000',\n '2015-01-01T00:00:00.000000000', '2015-02-01T00:00:00.000000000',\n '2015-03-01T00:00:00.000000000', '2015-04-01T00:00:00.000000000',\n '2015-05-01T00:00:00.000000000', '2015-06-01T00:00:00.000000000',\n '2015-07-01T00:00:00.000000000', '2015-08-01T00:00:00.000000000',\n '2015-09-01T00:00:00.000000000', '2015-10-01T00:00:00.000000000',\n '2015-11-01T00:00:00.000000000', '2015-12-01T00:00:00.000000000',\n '2016-01-01T00:00:00.000000000', '2016-02-01T00:00:00.000000000',\n '2016-03-01T00:00:00.000000000', '2016-04-01T00:00:00.000000000',\n '2016-05-01T00:00:00.000000000', '2016-06-01T00:00:00.000000000',\n '2016-07-01T00:00:00.000000000', '2016-08-01T00:00:00.000000000',\n '2016-09-01T00:00:00.000000000', '2016-10-01T00:00:00.000000000',\n '2016-11-01T00:00:00.000000000', '2016-12-01T00:00:00.000000000',\n '2017-01-01T00:00:00.000000000', '2017-02-01T00:00:00.000000000',\n '2017-03-01T00:00:00.000000000', '2017-04-01T00:00:00.000000000',\n '2017-05-01T00:00:00.000000000', '2017-06-01T00:00:00.000000000',\n '2017-07-01T00:00:00.000000000', '2017-08-01T00:00:00.000000000',\n '2017-09-01T00:00:00.000000000', '2017-10-01T00:00:00.000000000',\n '2017-11-01T00:00:00.000000000', '2017-12-01T00:00:00.000000000',\n '2018-01-01T00:00:00.000000000', '2018-02-01T00:00:00.000000000',\n '2018-03-01T00:00:00.000000000', '2018-04-01T00:00:00.000000000',\n '2018-05-01T00:00:00.000000000', '2018-06-01T00:00:00.000000000',\n '2018-07-01T00:00:00.000000000', '2018-08-01T00:00:00.000000000',\n '2018-09-01T00:00:00.000000000', '2018-10-01T00:00:00.000000000',\n '2018-11-01T00:00:00.000000000', '2018-12-01T00:00:00.000000000',\n '2019-01-01T00:00:00.000000000', '2019-02-01T00:00:00.000000000',\n '2019-03-01T00:00:00.000000000', '2019-04-01T00:00:00.000000000',\n '2019-05-01T00:00:00.000000000', '2019-06-01T00:00:00.000000000',\n '2019-07-01T00:00:00.000000000', '2019-08-01T00:00:00.000000000',\n '2019-09-01T00:00:00.000000000', '2019-10-01T00:00:00.000000000',\n '2019-11-01T00:00:00.000000000', '2019-12-01T00:00:00.000000000',\n '2020-01-01T00:00:00.000000000', '2020-02-01T00:00:00.000000000',\n '2020-03-01T00:00:00.000000000', '2020-04-01T00:00:00.000000000',\n '2020-05-01T00:00:00.000000000', '2020-06-01T00:00:00.000000000',\n '2020-07-01T00:00:00.000000000', '2020-08-01T00:00:00.000000000',\n '2020-09-01T00:00:00.000000000', '2020-10-01T00:00:00.000000000',\n '2020-11-01T00:00:00.000000000', '2020-12-01T00:00:00.000000000',\n '2021-01-01T00:00:00.000000000', '2021-02-01T00:00:00.000000000',\n '2021-03-01T00:00:00.000000000', '2021-04-01T00:00:00.000000000',\n '2021-05-01T00:00:00.000000000', '2021-06-01T00:00:00.000000000',\n '2021-07-01T00:00:00.000000000', '2021-09-01T00:00:00.000000000',\n '2021-10-01T00:00:00.000000000', '2021-11-01T00:00:00.000000000',\n '2021-12-01T00:00:00.000000000', '2022-01-01T00:00:00.000000000',\n '2022-02-01T00:00:00.000000000', '2022-03-01T00:00:00.000000000',\n '2022-04-01T00:00:00.000000000', '2022-05-01T00:00:00.000000000',\n '2022-06-01T00:00:00.000000000', '2022-07-01T00:00:00.000000000',\n '2022-08-01T00:00:00.000000000', '2022-09-01T00:00:00.000000000',\n '2022-10-01T00:00:00.000000000', '2022-11-01T00:00:00.000000000',\n '2023-01-01T00:00:00.000000000'], dtype='datetime64[ns]')Data variables: (3)sst4(time, lat, lon)float32dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>long_name :4um Sea Surface Temperatureunits :degree_Cstandard_name :sea_surface_temperaturevalid_min :-1000valid_max :10000display_scale :lineardisplay_min :-2.0display_max :45.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.97 GiB\n35.60 MiB\n\n\nShape\n(143, 2160, 4320)\n(1, 2160, 4320)\n\n\nDask graph\n143 chunks in 430 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4320 2160 143\n\n\n\n\nqual_sst4(time, lat, lon)float32dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>long_name :Quality Levels, Sea Surface Temperaturevalid_min :0valid_max :5\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.97 GiB\n35.60 MiB\n\n\nShape\n(143, 2160, 4320)\n(1, 2160, 4320)\n\n\nDask graph\n143 chunks in 430 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4320 2160 143\n\n\n\n\npalette(time, lon, lat, rgb, eightbitcolor)uint8dask.array<chunksize=(1, 4320, 2160, 3, 256), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.93 TiB\n6.67 GiB\n\n\nShape\n(143, 4320, 2160, 3, 256)\n(1, 4320, 2160, 3, 256)\n\n\nDask graph\n143 chunks in 716 graph layers\n\n\nData type\nuint8 numpy.ndarray\n\n\n\n\n 4320 143 256 3 2160\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Index([ 89.95833587646484, 89.875, 89.79167175292969,\n 89.70833587646484, 89.625, 89.54167175292969,\n 89.45833587646484, 89.375, 89.29167175292969,\n 89.20833587646484,\n ...\n -89.20833587646484, -89.29166412353516, -89.37500762939453,\n -89.45833587646484, -89.54166412353516, -89.62500762939453,\n -89.70833587646484, -89.79166412353516, -89.87500762939453,\n -89.95833587646484],\n dtype='float32', name='lat', length=2160))lonPandasIndexPandasIndex(Index([ -179.9583282470703, -179.875, -179.79165649414062,\n -179.7083282470703, -179.625, -179.54165649414062,\n -179.4583282470703, -179.375, -179.29165649414062,\n -179.2083282470703,\n ...\n 179.20835876464844, 179.2916717529297, 179.37501525878906,\n 179.45835876464844, 179.5416717529297, 179.62501525878906,\n 179.70835876464844, 179.7916717529297, 179.87501525878906,\n 179.95835876464844],\n dtype='float32', name='lon', length=4320))timePandasIndexPandasIndex(DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01', '2011-04-01',\n '2011-05-01', '2011-06-01', '2011-07-01', '2011-08-01',\n '2011-09-01', '2011-10-01',\n ...\n '2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01',\n '2022-07-01', '2022-08-01', '2022-09-01', '2022-10-01',\n '2022-11-01', '2023-01-01'],\n dtype='datetime64[ns]', name='time', length=143, freq=None))Attributes: (59)product_name :AQUA_MODIS.20110101_20110131.L3m.MO.SST4.sst4.9km.ncinstrument :MODIStitle :MODISA Level-3 Standard Mapped Imageproject :Ocean Biology Processing Group (NASA/GSFC/OBPG)platform :Aquatemporal_range :monthprocessing_version :R2019.0date_created :2019-12-17T18:28:57.000Zhistory :l3mapgen par=AQUA_MODIS.20110101_20110131.L3m.MO.SST4.sst4.9km.nc.param l2_flag_names :LAND,~HISOLZENtime_coverage_start :2010-12-31T12:10:01.000Ztime_coverage_end :2011-01-31T14:29:59.000Zstart_orbit_number :46065end_orbit_number :46518map_projection :Equidistant Cylindricallatitude_units :degrees_northlongitude_units :degrees_eastnorthernmost_latitude :90.0southernmost_latitude :-90.0westernmost_longitude :-180.0easternmost_longitude :180.0geospatial_lat_max :90.0geospatial_lat_min :-90.0geospatial_lon_max :180.0geospatial_lon_min :-180.0latitude_step :0.083333336longitude_step :0.083333336sw_point_latitude :-89.958336sw_point_longitude :-179.95833spatialResolution :9.28 kmgeospatial_lon_resolution :0.083333336geospatial_lat_resolution :0.083333336geospatial_lat_units :degrees_northgeospatial_lon_units :degrees_eastnumber_of_lines :2160number_of_columns :4320measure :Meansuggested_image_scaling_minimum :-2.0suggested_image_scaling_maximum :45.0suggested_image_scaling_type :LINEARsuggested_image_scaling_applied :No_lastModified :2019-12-17T18:28:57.000ZConventions :CF-1.6 ACDD-1.3institution :NASA Goddard Space Flight Center, Ocean Ecology Laboratory, Ocean Biology Processing Groupstandard_name_vocabulary :CF Standard Name Table v36naming_authority :gov.nasa.gsfc.sci.oceandataid :AQUA_MODIS.20110101_20110131.L3b.MO.SST4.nc/L3/AQUA_MODIS.20110101_20110131.L3b.MO.SST4.nclicense :https://science.nasa.gov/earth-science/earth-science-data/data-information-policy/creator_name :NASA/GSFC/OBPGpublisher_name :NASA/GSFC/OBPGcreator_email :data@oceancolor.gsfc.nasa.govpublisher_email :data@oceancolor.gsfc.nasa.govcreator_url :https://oceandata.sci.gsfc.nasa.govpublisher_url :https://oceandata.sci.gsfc.nasa.govprocessing_level :L3 Mappedcdm_data_type :griddata_bins :4834400data_minimum :-1.635data_maximum :32.06999\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data at the outlet of the Amazon to plot with hvplot.\n\nlat_bnds, lon_bnds = [6,-2], [-52, -44] \nds_MODIS_subset = ds_MODIS.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_MODIS_subset\n\nds_MODIS_subset.sst4.hvplot.image(y='lat', x='lon', cmap='viridis').opts(clim=(22,30))", + "crumbs": [ + "Tutorials", + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" + ] }, { - "objectID": "notebooks/Harmony API.html#build-the-eoss-root-url", - "href": "notebooks/Harmony API.html#build-the-eoss-root-url", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Build the EOSS Root URL", - "text": "Build the EOSS Root URL\nNext we will build a URL for the EOSS service for a given granule. To get data using the service, you need a CMR collection ID for a supported collection and the ID of a granule within that collection.\nBy convention, all Harmony services are accessed through <harmony_root>/<collection_id>/<service_name>\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\nconfig = {\n 'collection_id': 'C1233800302-EEDTEST',\n 'eoss_version': '0.1.0'\n}\neoss_collection_root = harmony_root+'/{collection_id}/eoss/{eoss_version}/items/'.format(**config)\nprint(eoss_collection_root)\n\nhttps://harmony.earthdata.nasa.gov/C1233800302-EEDTEST/eoss/0.1.0/items/" - }, - { - "objectID": "notebooks/Harmony API.html#variable-subset-of-a-granule", - "href": "notebooks/Harmony API.html#variable-subset-of-a-granule", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Variable Subset of a Granule", - "text": "Variable Subset of a Granule\nWe can now build onto the root URL in order to actually perform a transformation. The first transformation is a variable subset of a selected granule. At this time, this requires discovering the granule id and variable id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nHarmony stages transformed data in S3 to make it easy to do additional processing in the cloud. The response that Harmony returns is actually a redirect to the S3 location where your data is staged. Should you call Harmony in a tool that follows redirects, like your web browser, your file will be seamlessly downloaded locally for you. However, should you desire to do additional processing in AWS, you have that option as well by simply looking at the redirected URL. The code snippet below uses “geturl()” to show the URL of your staged data.\n\nvarSubsetConfig = {\n 'granule_id' : 'G2524192900-POCLOUD',\n 'variable_id' : 'red_var'\n}\neoss_var_subset_url = eoss_collection_root+'{granule_id}/?rangeSubset={variable_id}'.format(**varSubsetConfig)\n\nprint('Request URL', eoss_var_subset_url)\n\nwith request.urlopen(eoss_var_subset_url) as response:\n print('URL for data staged in S3:', response.geturl())" - }, - { - "objectID": "notebooks/Harmony API.html#add-on-a-spatial-subset", - "href": "notebooks/Harmony API.html#add-on-a-spatial-subset", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Add on a spatial subset", - "text": "Add on a spatial subset\nThe second transformation is a spatial subset of a selected granule. This can be combined with the request we already built above by simply specifying a bounding box.\n\nspatialSubsetConfig = {\n 'west' : '-128',\n 'south' : '23',\n 'east' : '-63',\n 'north' : '47'\n}\neoss_spatial_subset_url = eoss_var_subset_url+'&bbox={west},{south},{east},{north}'.format(**spatialSubsetConfig)\n\nprint('Request URL', eoss_spatial_subset_url)\n\nwith request.urlopen(eoss_spatial_subset_url) as response:\n print('URL for data staged in S3:', response.geturl())" - }, - { - "objectID": "notebooks/Harmony API.html#reprojection", - "href": "notebooks/Harmony API.html#reprojection", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Reprojection", - "text": "Reprojection\nThe third transformation is a reprojection of the data. This can be combined with the requests we already built above by simply specifying a coordinate reference system. Coordinate reference systems are identified by a common name, EPSG code, or URI. Today, this is based on reference systems supported by gdal. Examples include: ‘CRS:84’, ‘EPSG:32611’.\n\nreprojectionConfig = {\n 'crs' : 'EPSG:32611'\n}\neoss_reprojection_url = eoss_spatial_subset_url+'&crs={crs}'.format(**reprojectionConfig)\n\nprint('Request URL', eoss_reprojection_url)\n\nwith request.urlopen(eoss_reprojection_url) as response:\n print('URL for data staged in S3:', response.geturl())" + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#time-series-comparison", + "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#time-series-comparison", + "title": "Amazon Estuary Exploration:", + "section": "Time Series Comparison", + "text": "Time Series Comparison\nPlot each dataset for the time period 2011-2019.\nFirst, we need to average all pixels in the subset lat/lon per time for sea surface salinity and sea surface temperature to set up for the graphs.\n\nsss_mean = []\nfor t in np.arange(len(ds_sss_subset.time)):\n sss_mean.append(np.nanmean(ds_sss_subset.sss[:,:,t].values))\n\n#sss_mean\n\n\n#MODIS\nsst_MODIS_mean = []\nfor t in np.arange(len(ds_MODIS_subset.time)):\n sst_MODIS_mean.append(np.nanmean(ds_MODIS_subset.sst4[t,:,:].values))\n \n#sst_MODIS_mean\n\n\nCombined timeseries plot of river height and LWE thickness\nBoth datasets are mapped for the outlet of the Amazon River into the estuary.\n\n#plot river height and land water equivalent thickness\nfig, ax1 = plt.subplots(figsize=[12,7])\n\n#plot river height\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\n\n#plot LWE thickness on secondary axis\nax2 = ax1.twinx()\nax2.plot(ds_GRACE_subset.time[107:179], ds_GRACE_subset.lwe_thickness[107:179,34,69], color = 'darkorange')\n\nax1.set_xlabel('Date')\nax2.set_ylabel('Land Water Equivalent Thickness (cm)', color='darkorange')\nax1.set_ylabel('River Height (m)', color='darkblue')\nax2.legend(['GRACE-FO'], loc='upper right')\nax1.legend(['Pre-SWOT MEaSUREs'], loc='lower right')\n\nplt.title('Amazon Estuary, 2011-2019 Lat, Lon = (-0.7, -50)')\nax1.grid()\nplt.show()\n\n\n\n\n\n\n\n\nLWE thickness captures the seasonality of Pre-SWOT MEaSUREs river heights well, and so LWE thickness can be compared to all other variables as a representative of the seasonality of both measurements for the purpose of this notebook.\n\n\nCombined timeseries plots of salinity and LWE thickness, followed by temperature\n\n#Combined Subplots\nfig = plt.figure(figsize=(10,10))\n\nax1 = fig.add_subplot(211)\nplt.title('Amazon Estuary, 2011-2019')\nax2 = ax1.twinx()\nax3 = plt.subplot(212)\nax4 = ax3.twinx()\n\n#lwe thickness\nax1.plot(ds_GRACE_subset.time[107:179], ds_GRACE_subset.lwe_thickness[107:179,34,69], color = 'darkorange')\nax1.set_ylabel('LWE Thickness (cm)', color='darkorange')\nax1.grid()\n\n#sea surface salinity\nax2.plot(ds_sss_subset.time[0:750], sss_mean[0:750], 'g')\nax2.set_ylabel('SSS (psu)', color='g')\n\n#sea surface temperature\nax3.plot(ds_MODIS_subset.time[7:108], sst_MODIS_mean[7:108], 'darkred')\nax3.set_ylabel('SST (deg C)', color='darkred')\nax3.grid()\n\n#river height at outlet\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\nax4.set_ylabel('River Height (m)', color='darkblue')\n\nText(0, 0.5, 'River Height (m)')\n\n\n\n\n\n\n\n\n\nMeasurements of LWE thickness and SSS follow expected patterns. When lwe thickness is at its lowest, indicating less water is flowing through during the drought, salinity is at its highest. Without high volume of water pouring into the estuary, salinity increases. We can see that temperature is shifted a bit in time from river height as well at the outlet, a relationship that could be further explored.", + "crumbs": [ + "Tutorials", + "Cloud vs. Local Workflows", + "Estuary Example", + "Cloud" + ] }, { - "objectID": "notebooks/Harmony API.html#reformatting", - "href": "notebooks/Harmony API.html#reformatting", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Reformatting", - "text": "Reformatting\nNext is a reformatting of the output file of the data. This can be combined with the requests we already built above by simply specifying a format. Examples include: image/tiff’, ‘image/png’\n\nreformattingConfig = {\n 'format' : 'image/png'\n}\neoss_reformatting_url = eoss_reprojection_url+'&format={format}'.format(**reformattingConfig)\n\nprint('Request URL', eoss_reformatting_url)\n\nwith request.urlopen(eoss_reformatting_url) as response:\n print('URL for data staged in S3:', response.geturl())" + "objectID": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#accessing-and-visualizing-swot-simulated-datasets", + "href": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#accessing-and-visualizing-swot-simulated-datasets", + "title": "This is an old version of the notebook, see the latest here.", + "section": "Accessing and Visualizing SWOT Simulated Datasets", + "text": "Accessing and Visualizing SWOT Simulated Datasets\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via earthaccess python library; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\nLearning Objectives:\n\nAccess all 5 products of SWOT HR sample data (archived in NASA Earthdata Cloud) within the AWS cloud, without downloading to local machine\nVisualize accessed data\n\n\n\nSWOT Simulated Level 2 North America Continent KaRIn High Rate Version 1 Datasets:\n\nRiver Vector Shapefile - SWOT_SIMULATED_NA_CONTINENT_L2_HR_RIVERSP_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2RSP1\n\n\nLake Vector Shapefile - SWOT_SIMULATED_NA_CONTINENT_L2_HR_LAKESP_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2LSP1\n\n\nWater Mask Pixel Cloud NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXC_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2PIX1\n\n\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXCVEC_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2PXV1\n\n\nRaster NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_RASTER_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2RAS1\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Aug 2022)\n\n\nLibraries Needed\n\nimport glob\nimport os\nimport requests\nimport s3fs\nimport fiona\nimport netCDF4 as nc\nimport h5netcdf\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\n#auth = earthaccess.login(strategy=\"interactive\", persist=True) #if you do not have a netrc created, this line will do so with your credentials\nauth = earthaccess.login(strategy=\"netrc\")\n\n\nSet up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(daac='PODAAC', provider='POCLOUD')" }, { - "objectID": "notebooks/Harmony API.html#continue-exploring", - "href": "notebooks/Harmony API.html#continue-exploring", - "title": "The practice dataset used for this tutorial is no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "section": "Continue Exploring", - "text": "Continue Exploring\nHarmony’s specification is available online. Feel free to read more and continue exploring how to use Harmony. https://harmony.uat.earthdata.nasa.gov/docs/eoss/0.1.0/spec" + "objectID": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#single-file-access", + "href": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#single-file-access", + "title": "This is an old version of the notebook, see the latest here.", + "section": "Single File Access", + "text": "Single File Access\nThe s3 access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to manually search for a single file.\n1. River Vector Shapefiles\n\n#retrieves granule from the day we want\nriver_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_RIVERSP_V1', temporal = ('2022-08-22 19:24:41', '2022-08-22 19:30:37'))\n\n\n#finds the s3 link of the one granule we want (The collection contains both Reaches and Nodes, but here we want only the Reach)\nriver_data_urls = []\nfor g in river_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"Reach\" in l:\n river_data_urls.append(l)\nprint(river_data_urls[0])\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the shp files. If we don’t do this, the alternative would be to download the data to the cloud environment and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nriver_shp_url = f\"zip+{river_data_urls[0]}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp1 = gpd.read_file(river_shp_url) \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\nfig, ax = plt.subplots(figsize=(11,7))\nSWOT_HR_shp1.plot(ax=ax, color='black')\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_LAKESP_V1', temporal = ('2022-08-22 19:24:18', '2022-08-22 19:30:50'))\n\n\n#find the s3 link of the desired granule (This collection has three options: Obs, Unassigned, and Prior - we want Obs)\nlake_data_urls = []\nfor g in lake_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"Obs\" in l:\n lake_data_urls.append(l)\nprint(lake_data_urls[0])\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the shp files. If we don’t do this, the alternative would be to download the data to the cloud environment and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nlake_shp_url = f\"zip+{lake_data_urls[0]}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp2 = gpd.read_file(lake_shp_url) \n\n#view the attribute table\nSWOT_HR_shp2\n\n\nfig, ax = plt.subplots(figsize=(7,12))\nSWOT_HR_shp2.plot(ax=ax, color='black')\n\n3. Water Mask Pixel Cloud NetCDF\nAccessing the remaining files is different than the shp files above. We do not need to unzip the files because they are stored in native netCDF files in the cloud. For the rest of the products, we will open via xarray.\n\nwatermask_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXC_V1', temporal = ('2022-08-22 19:29:00', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(earthaccess.open([watermask_results[0]]), group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\nplt.scatter(x=ds_PIXC.longitude, y=ds_PIXC.latitude, c=ds_PIXC.height)\nplt.colorbar().set_label('Height (m)')\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\nvector_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXCVEC_V1', temporal = ('2022-08-22 19:29:00', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\n\nds_PIXCVEC = xr.open_mfdataset(earthaccess.open([vector_results[0]]), decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals > 80] = np.nan\npixcvec_lonvals[pixcvec_lonvals > 180] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n5. Raster NetCDF\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_RASTER_V1', temporal = ('2022-08-22 19:28:50', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\n\n#this collection has 100m and 250m granules, but we only want 100m\nraster_data = []\nfor g in raster_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"100m\" in l:\n raster_data.append(l)\nprint(raster_data)\n\n\nds_raster = xr.open_mfdataset(earthaccess.open([raster_data[0]], provider = 'POCLOUD'), engine='h5netcdf')\nds_raster\n\nIt’s easy to analyze and plot the data with packages such as hvplot!\n\nds_raster.wse.hvplot.image(y='y', x='x')" }, { - "objectID": "notebooks/batch_download_podaac_data.html#set-up-your-netrc-file", - "href": "notebooks/batch_download_podaac_data.html#set-up-your-netrc-file", - "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", - "section": "Set up your netrc file", - "text": "Set up your netrc file\nFollow these instructions on the Earthdata Wiki to authenticate and store your URS cookies in a local file. You can batch download really efficiently this way, effectively “pre-authenticated” through your previous session." + "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#use-case-co-locate-satellite-and-in-situ-data-for-cross-validation", + "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#use-case-co-locate-satellite-and-in-situ-data-for-cross-validation", + "title": "PO.DAAC Cookbook", + "section": "Use Case: Co-locate satellite and in-situ data for cross-validation", + "text": "Use Case: Co-locate satellite and in-situ data for cross-validation\n\nUser Story\nAs a coastal applications researcher, I would like to co-locate in-situ measurements and satellite data near the European coast for cross-validation of data or model validation, during the winter of 2019. (*Note: this user stroes was developed to demo at the 2nd Annual SWOT Applications Early Adopter Hackweek, 8 March 2021.)\n\n\nLearning Objectives\n\nCo-locate remote sensing data from the Earthdata Cloud archive with in-situ measurements from another provider, programmatically using the Earthdata CMR amd Harmony APIs.\nWorkflow can be conducted either locally or in the cloud (i.e. it is compute environment agnostic).\nWhile capabilities demoed here are shown through an oceanography example, these use cases and examples can be applied as building blocks for developing other user workflows with PO.DAAC and Earthdata datasets, across a range of science and applications disciplines, including for example terrestrial hydrology, coastal, or cryosphere.\nNote: Searching for NASA Earthdata data given point-based observation locations can also be done via the NASA Earthdata Search user interface https://search.earthdata.nasa.gov/search, in addition to programmatically (as shown here).\n\n\n\nDatasets used\n\nArgo floats https://argo.ucsd.edu/\nMODIS-Aqua L2 SST https://podaac.jpl.nasa.gov/dataset/AMSRE-REMSS-L2P-v7a\nMUR L4 SST https://registry.opendata.aws/mur/\n\n\n\nMain Steps in Workflow\n\nDefine study region and period of time of interest: Atlantic Ocean west of Portugal and Morocco, January 2019\nGet in-situ Argo floats using the Argo API and prepapre the Argo data (select Argo SST for one float during its journey in Jan 2019 at the top pressure level i.e. nearest the ocean surface)\nGet coincident SST observed by the MODIS satellite, from the NASA Earthdata Cloud (in AWS)\n\nSearch Earthdata Cloud satellite data for collection of interest (MODIS-Aqua L2) (using the CMR API)\nExtract satellite data at the in-situ location for direct comparison (using the Harmony API)\nDownload locally (from the cloud archive), or download to your cloud storage or compute space if working within the AWS cloud\nQuality control the MODIS data with daytime and quality flag filters\n\n\nPlot time series comparing the in-situ and satellite data at in-situ location(s)\nValidate with a third dataset, MUR L4 SST (once version stored in the AWS Registry of Open Data - public data access)\n\nNote: in order to currently access PO.DAAC Cloud Pathfinder datasets such as MODIS SST L2 from the Earthdata Cloud, your Earthdata login username needs to be added to an restrcited early access list (during the transition period of migrating PO.DAAC data to the Earthdata Cloud). Please contact podaac@podaac.jpl.nasa.gov to make that request.\n\n\n\n\nRequirements\nImport modules: The Python ecosystem is organized into modules. A module must be imported before the contents of that modules can be used. It is good practice to import modules in the first code cell of a notebook or at the top of your script. Not only does this make it clear which modules are being used, but it also ensures that the code fails at the beginning because one of the modules is not installed rather half way through after crunching a load of data.\nFor some modules, it is common practice to shorten the module names according to accepted conventions. For example, the plotting module matplotlib.pyplot is shortened to plt. It is best to stick to these conventions rather than making up your own short names so that people reading your code see immediately what you are doing.\n\nfrom netrc import netrc\nfrom urllib import request\nfrom platform import system\nfrom getpass import getpass\nfrom datetime import datetime\nfrom http.cookiejar import CookieJar\nfrom os.path import join, isfile, basename, abspath, expanduser\nfrom folium.plugins import MarkerCluster\nimport folium\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport cartopy.crs as ccrs\nimport xarray as xr\nimport pandas as pd\nimport numpy as np\nimport requests\nimport json\nimport time\n\nmatplotlib.rc('font', **{'family' : 'sans-serif', 'weight': 'normal', 'size': 16})\n\n!mkdir -p resources/\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nThe setup_earthdata_login_auth function will allow Python scripts to log into any Earthdata Login application programmatically. To avoid being prompted for credentials every time you run and also allow clients such as curl to log in, you can add the following to a .netrc (_netrc on Windows) file in your home directory:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nMake sure that this file is only readable by the current user or you will receive an error stating “netrc access too permissive.”\n$ chmod 0600 ~/.netrc\n\nTOKEN_DATA = (\"<token>\"\n \"<username>%s</username>\"\n \"<password>%s</password>\"\n \"<client_id>PODAAC CMR Client</client_id>\"\n \"<user_ip_address>%s</user_ip_address>\"\n \"</token>\")\n\n\ndef setup_cmr_token_auth(endpoint: str='cmr.earthdata.nasa.gov'):\n ip = requests.get(\"https://ipinfo.io/ip\").text.strip()\n return requests.post(\n url=\"https://%s/legacy-services/rest/tokens\" % endpoint,\n data=TOKEN_DATA % (input(\"Username: \"), getpass(\"Password: \"), ip),\n headers={'Content-Type': 'application/xml', 'Accept': 'application/json'}\n ).json()['token']['id']\n\n\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n\n\n# Get your authentication token for searching restricted records in the CMR:\n_token = setup_cmr_token_auth(endpoint=\"cmr.earthdata.nasa.gov\")\n\n# Start authenticated session with URS to allow restricted data downloads:\nsetup_earthdata_login_auth(endpoint=\"urs.earthdata.nasa.gov\")\n\n\n\nStudy region and period\nSet some “master” inputs to define the time and place contexts for our case studies in the ipynb.\n\n# The timeframe of interest (Argovis API limit == 3 months):\nstart_date = \"2019-01-01\"\nend_date = \"2019-01-31\"\n\n# The area/region of interest by latitude/longitude:\naoi_minlon = -26.0\naoi_minlat = 30.0\naoi_maxlon = -12.0\naoi_maxlat = 40.0\n\nPlot the spatial extent of our study area with a blue polygon:\n\nax = plt.subplot(projection=ccrs.PlateCarree())\n\nax.figure.set_figheight(9)\nax.figure.set_figwidth(9)\n\nax.add_patch(mpatches.Rectangle(xy=[aoi_minlon, aoi_minlat], \n width=aoi_maxlon-aoi_minlon, \n height=aoi_maxlat-aoi_minlat,\n facecolor='white',\n alpha=0.5,\n transform=ccrs.Geodetic())\n )\nax.set_extent((aoi_minlon-20., \n aoi_maxlon+20.,\n aoi_minlat-20.,\n aoi_maxlat+20.), crs=ccrs.PlateCarree())\nax.stock_img()\nax.coastlines()\nax.gridlines(color=\"white\", alpha=0.5)\nplt.show()", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "SST Cross Validation" + ] }, { - "objectID": "notebooks/batch_download_podaac_data.html#prepare-a-list-of-files-to-download", - "href": "notebooks/batch_download_podaac_data.html#prepare-a-list-of-files-to-download", - "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", - "section": "Prepare a list of files to download", - "text": "Prepare a list of files to download\nNow the only step that remains is to get a list of URLs to pass to wget or curl for downloading. There’s a lot of ways to do this but here we will rely on Earthdata Search.\n1. Find the collection/dataset of interest in Earthdata Search.\nStart by searching for your collection of interest. Here we are providing an ECCO example from this complete list of ECCO collections in Earthdata Search (79 in total), and refine the results until we see the dataset of interest. In this example we want monthly sea surface height grids provided at 0.5-degree cell resolution on an interpolated latitude/longitude grid.\n2. Pick your collection, then click the green Download All button on the next page.\nClick the big green button identified by the red arrow/box in the screenshot below.\n\nThat will add all the granules in the collection to your “shopping cart” and then redirect you straight there and present you with the available options for customizing the data prior to download. We will ignore those because they’re mostly in active development and because we want to download all data in the collection.\n\n\n\nThe screenshot above shows the download customization interface (i.e. “shopping cart”)\n\n\n3. Click Download Data to get your list of download urls (bottom-left, another green button)\nThe Download Data button takes you to one final page that provides the list of urls from which to download the files matching your search parameters and any customization options that you selected in the steps that followed. This page will be retained in your User History in case you need to return to it later.\n\nThere are several ways that you could get the list of urls into a text file that’s accessible from Jupyter or your local shell. Click the Save button to download the list of files to a text file. This will by default save it with a name like 5237392644-download.txt (numbers will be different for each download job).\n\nNote: Earthdata Search also provides a shell script for downloading this list of files, accessible from the “Download Script” tab." + "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-temperature-profiles-from-argovis-api", + "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-temperature-profiles-from-argovis-api", + "title": "PO.DAAC Cookbook", + "section": "Access temperature profiles from ArgoVis API", + "text": "Access temperature profiles from ArgoVis API\nArgoVis is an API and visualization service that provides access to Argo float profiles. The endpoint for requesting profile data is given in the cell below:\n\nargo_api_endpoint = 'https://argovis.colorado.edu/selection/profiles/?'\n\nprint(argo_api_endpoint)\n\nhttps://argovis.colorado.edu/selection/profiles/?\n\n\nCreate the AOI polygon in required XY format, make it a string, and collect the dictionary of API parameters:\n\nargo_api_aoi = [[[aoi_minlon, aoi_minlat], \n [aoi_minlon, aoi_maxlat], \n [aoi_maxlon, aoi_maxlat],\n [aoi_maxlon, aoi_minlat],\n [aoi_minlon, aoi_minlat]]]\n\nargo_api_params = {\n 'startDate': start_date.replace(\"-0\",\"-\"), # 1.\n 'endDate': end_date.replace(\"-0\",\"-\"), # 1. No leading zeros in start/end dates\n 'shape': str(argo_api_aoi).replace(\" \",\"\"), # 2. Array of XY vertices for AOI polygon\n #'presRange': \"[0,30]\" # 3. We wont limit by pressure range\n}\n\nargo_api_params\n\n{'startDate': '2019-1-1',\n 'endDate': '2019-1-31',\n 'shape': '[[[-26.0,30.0],[-26.0,40.0],[-12.0,40.0],[-12.0,30.0],[-26.0,30.0]]]'}\n\n\nSubmit the request parameters to the Argovis API. You should receive a JSON response back. Print the number of profiles inside our AOI:\n\nargo_api_response = requests.get(url=argo_api_endpoint, params=argo_api_params)\n\n# Load the response from JSON if the response status is 200:\nif argo_api_response.status_code == 200:\n argo_profiles = argo_api_response.json()\n print(len(argo_profiles))\nelse:\n # Otherwise dump the text for more clues:\n print(argo_api_response.text)\n\n41\n\n\n\nPrepare profile data for further analysis\nConcatenate the list of metadata dictionaries returned for the argos into a table and update a few of its columns with Pythonic types:\n\nargo_df = pd.DataFrame(argo_profiles).sort_values(\"date\")\n\n# Add a column with pandas datetime objects for easier indexing\nargo_df['datetime'] = pd.to_datetime(argo_df['date'])\n# And then replace the original date column with Python dates\nargo_df['date'] = argo_df.datetime.apply(lambda x: x.date).tolist()\n\n# Add two columns of sanitized lats/lons to the data frame\nargo_df['lat'] = argo_df['roundLat'].astype(float).tolist()\nargo_df['lon'] = argo_df['roundLon'].astype(float).tolist()\n\nargo_df.info()\n\n<class 'pandas.core.frame.DataFrame'>\nInt64Index: 41 entries, 40 to 0\nData columns (total 36 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 _id 41 non-null object \n 1 POSITIONING_SYSTEM 41 non-null object \n 2 DATA_CENTRE 41 non-null object \n 3 PI_NAME 41 non-null object \n 4 WMO_INST_TYPE 41 non-null object \n 5 VERTICAL_SAMPLING_SCHEME 41 non-null object \n 6 DATA_MODE 41 non-null object \n 7 PLATFORM_TYPE 41 non-null object \n 8 measurements 41 non-null object \n 9 station_parameters 41 non-null object \n 10 pres_max_for_TEMP 41 non-null float64 \n 11 pres_min_for_TEMP 41 non-null float64 \n 12 pres_max_for_PSAL 41 non-null float64 \n 13 pres_min_for_PSAL 41 non-null float64 \n 14 max_pres 41 non-null float64 \n 15 date 41 non-null object \n 16 date_added 41 non-null object \n 17 date_qc 41 non-null int64 \n 18 lat 41 non-null float64 \n 19 lon 41 non-null float64 \n 20 geoLocation 41 non-null object \n 21 position_qc 41 non-null int64 \n 22 cycle_number 41 non-null int64 \n 23 dac 41 non-null object \n 24 platform_number 41 non-null int64 \n 25 station_parameters_in_nc 41 non-null object \n 26 nc_url 41 non-null object \n 27 DIRECTION 41 non-null object \n 28 BASIN 41 non-null int64 \n 29 core_data_mode 41 non-null object \n 30 roundLat 41 non-null object \n 31 roundLon 41 non-null object \n 32 strLat 41 non-null object \n 33 strLon 41 non-null object \n 34 formatted_station_parameters 41 non-null object \n 35 datetime 41 non-null datetime64[ns, UTC]\ndtypes: datetime64[ns, UTC](1), float64(7), int64(5), object(23)\nmemory usage: 11.9+ KB\n\n\nYou can download profiles in netCDF format from the FTP link stored in the nc_url fields of the response. Here’s the URL for the first of the profiles:\n\nprint(argo_df.iloc[0].nc_url)\n\nftp://ftp.ifremer.fr/ifremer/argo/dac/coriolis/6902663/profiles/R6902663_124.nc\n\n\nDisplay a table summarizing the space/time characteristics of eaach profile:\n\nargo_df[['platform_number', 'cycle_number', 'datetime', 'lon', 'lat']] #, 'measurements']]\n\n\n\n\n\n\n\n\nplatform_number\ncycle_number\ndatetime\nlon\nlat\n\n\n\n\n40\n6902663\n124\n2019-01-01 20:14:00+00:00\n-17.383\n35.601\n\n\n39\n6901260\n49\n2019-01-02 05:43:00+00:00\n-12.812\n37.707\n\n\n38\n6901143\n228\n2019-01-02 09:22:20+00:00\n-21.083\n32.254\n\n\n37\n6902664\n124\n2019-01-02 20:28:00+00:00\n-18.411\n34.985\n\n\n36\n3901643\n43\n2019-01-04 06:13:00+00:00\n-22.429\n37.556\n\n\n35\n3901942\n48\n2019-01-05 20:23:30+00:00\n-15.286\n35.316\n\n\n34\n6901262\n22\n2019-01-06 05:42:59.999000+00:00\n-17.967\n34.228\n\n\n33\n3901932\n22\n2019-01-06 05:49:00+00:00\n-19.904\n33.428\n\n\n32\n1901688\n288\n2019-01-07 03:11:53+00:00\n-23.134\n34.258\n\n\n31\n6901260\n50\n2019-01-07 05:26:00+00:00\n-12.887\n37.905\n\n\n30\n1901688\n289\n2019-01-08 03:15:16+00:00\n-23.137\n34.248\n\n\n29\n6902552\n167\n2019-01-08 12:50:00+00:00\n-23.798\n33.144\n\n\n28\n1901688\n290\n2019-01-09 03:19:48+00:00\n-23.148\n34.233\n\n\n27\n1901688\n291\n2019-01-10 03:27:35+00:00\n-23.158\n34.218\n\n\n26\n6901273\n11\n2019-01-10 05:25:00+00:00\n-12.473\n32.219\n\n\n25\n6902663\n125\n2019-01-11 20:15:00+00:00\n-17.071\n35.830\n\n\n24\n6901260\n51\n2019-01-12 05:18:00+00:00\n-12.982\n38.047\n\n\n23\n6901143\n229\n2019-01-12 07:05:12+00:00\n-21.206\n32.474\n\n\n22\n6902664\n125\n2019-01-12 20:16:00+00:00\n-18.198\n35.057\n\n\n21\n3901643\n44\n2019-01-14 05:58:00+00:00\n-22.706\n37.542\n\n\n20\n3901942\n49\n2019-01-15 20:37:30+00:00\n-15.739\n34.976\n\n\n19\n6901262\n23\n2019-01-16 05:39:00+00:00\n-17.725\n34.223\n\n\n18\n6902785\n54\n2019-01-16 05:56:00+00:00\n-25.507\n38.293\n\n\n17\n3901932\n23\n2019-01-16 06:04:00+00:00\n-19.081\n34.101\n\n\n16\n6901260\n52\n2019-01-17 05:28:00+00:00\n-13.092\n38.266\n\n\n15\n6902552\n168\n2019-01-18 13:02:00+00:00\n-23.575\n33.225\n\n\n14\n1901688\n292\n2019-01-19 20:13:54.002000+00:00\n-23.272\n34.136\n\n\n13\n6901273\n12\n2019-01-20 05:31:00+00:00\n-12.447\n32.181\n\n\n12\n6902663\n126\n2019-01-21 20:21:00+00:00\n-16.892\n35.982\n\n\n11\n6901260\n53\n2019-01-22 05:33:00+00:00\n-13.146\n38.378\n\n\n10\n6901143\n230\n2019-01-22 09:01:03+00:00\n-21.136\n32.880\n\n\n9\n6902664\n126\n2019-01-22 20:23:00+00:00\n-18.099\n35.114\n\n\n8\n3901643\n45\n2019-01-24 06:11:00+00:00\n-23.115\n37.358\n\n\n7\n3901942\n50\n2019-01-25 20:21:30+00:00\n-14.963\n35.402\n\n\n6\n6901262\n24\n2019-01-26 05:47:59.999000+00:00\n-17.474\n34.302\n\n\n5\n3901932\n24\n2019-01-26 06:00:00+00:00\n-18.151\n34.375\n\n\n4\n6902785\n55\n2019-01-26 06:10:00+00:00\n-25.212\n38.213\n\n\n3\n6901260\n54\n2019-01-27 05:38:00+00:00\n-13.265\n38.484\n\n\n2\n6902552\n169\n2019-01-28 12:45:00+00:00\n-23.267\n33.294\n\n\n1\n1901688\n293\n2019-01-29 13:03:27.001000+00:00\n-23.403\n34.206\n\n\n0\n6901273\n13\n2019-01-30 05:27:00+00:00\n-12.737\n32.602\n\n\n\n\n\n\n\nNow plot argo profile locations on an interactive map.\nThis plot uses folium/leaflet. Hover/click the clusters (which correspond to specific Argo float platforms) to zoom to the groups of individual profiles and display metadata about them:\n\ndef _get_tooltip(profile: dict):\n return \"\"\"<b>Date</b>: {date}<br>\n <b>Profile ID</b>: {_id}<br>\n <b>Platform ID</b>: {platform_number}<br>\n <b>Latitude</b>: {lat}<br>\n <b>Longitude</b>: {lon}<br>\"\"\".format(**profile)\n\n\nm = folium.Map(location=[argo_df['lat'].mean(), argo_df['lon'].mean()], \n tiles=\"Stamen Terrain\",\n zoom_start=5, )\n\n# Loop over list of unique platform_numbers (floats)\nunique_argo_platform_numbers = argo_df.platform_number.unique().tolist()\n\nfor i, platform in enumerate(unique_argo_platform_numbers):\n # Get row(s) for the current platform\n p = argo_df[argo_df['platform_number']==platform]\n # Make an empty marker cluster to add to the map widget\n cluster = MarkerCluster(name=p['platform_number'])\n # Make markers in a loop and add to the cluster:\n for c in p['cycle_number'].tolist():\n # Select the row for the current profile ('cycle')\n profile = p[p['cycle_number']==c].iloc[0]\n # Create a new marker and add it to the cluster\n cluster.add_child(folium.Marker(\n location=[profile['lat'], profile['lon']],\n tooltip=_get_tooltip(profile.to_dict())))\n m.add_child(cluster)\n\ndisplay(m)\n\nMake this Notebook Trusted to load map: File -> Trust Notebook\n\n\n\nReformat profile data into data frames\nThe in situ measurements temperature, pressure, and salinity readings collected during each profile are returned inside the JSON response.\nThe format of the measurements field is perfect for conversion to pandas data frames. Apply pandas.DataFrame over the entire measurements column to make a pandas.Series of data frames, and replace the existing content in the measurements column:\n\nargo_df['measurements'] = argo_df['measurements'].apply(pd.DataFrame).tolist()\n\n# Print statistical summary of the table content:\nargo_df.iloc[0].measurements.describe()\n\n\n\n\n\n\n\n\ntemp\npres\npsal\n\n\n\n\ncount\n105.000000\n105.000000\n105.000000\n\n\nmean\n11.579429\n794.390476\n35.832990\n\n\nstd\n4.726514\n655.512828\n0.433002\n\n\nmin\n4.053000\n6.000000\n35.073000\n\n\n25%\n8.096000\n146.000000\n35.597000\n\n\n50%\n10.885000\n713.000000\n35.765000\n\n\n75%\n15.750000\n1363.000000\n36.128000\n\n\nmax\n18.418000\n2010.000000\n36.504000\n\n\n\n\n\n\n\nPlot temperature at the minimum pressure for each profile\nThis cell applies a lambda over the measurements column to slice the row corresponding to the minimum pressure bin for each profile and returns the corresponding temperature measurement:\n\ndef _get_prof_temp_at_pres_min(x):\n return x[x['pres']==x['pres'].min()]['temp'].item()\n\n# Apply the fuunction over the column of measurements tables\nargo_df['temp_at_pres_min'] = argo_df['measurements'].apply(_get_prof_temp_at_pres_min).tolist()\n\n# Plot temperature measured nearest to the sea surface for each profile \nargo_df.plot.scatter(x=\"datetime\", y=\"temp_at_pres_min\", figsize=(16, 4))\nplt.title(\"~Daily temperature at minimum pressure across ~40 argo profiles\")\nplt.xlabel(None)\nplt.ylabel(\"Temperature (degrees C)\")\nplt.ylim(15.5, 20.5)\nplt.grid(alpha=0.25)\n\n\n\n\n\n\n\n\n\n\nSelect an Argo of Interest and its platform_number\nSee which floats had the most profiles within our timeframe/area of interest:\n\nargo_df.groupby(\"platform_number\").count()['cycle_number']\n\nplatform_number\n1901688 6\n3901643 3\n3901932 3\n3901942 3\n6901143 3\n6901260 6\n6901262 3\n6901273 3\n6902552 3\n6902663 3\n6902664 3\n6902785 2\nName: cycle_number, dtype: int64\n\n\nChoose a float with six profiles to study further during the remainder of the notebook.\n\ntarget_argo = 6901260\n\n# Select rows (profiles) for the desired platform:\nargo_skinny = argo_df[argo_df.platform_number==target_argo].copy()\n\nargo_skinny.describe()\n\n\n\n\n\n\n\n\npres_max_for_TEMP\npres_min_for_TEMP\npres_max_for_PSAL\npres_min_for_PSAL\nmax_pres\ndate_qc\nlat\nlon\nposition_qc\ncycle_number\nplatform_number\nBASIN\ntemp_at_pres_min\n\n\n\n\ncount\n6.000000\n6.0\n6.000000\n6.0\n6.000000\n6.0\n6.000000\n6.000000\n6.0\n6.000000\n6.0\n6.0\n6.000000\n\n\nmean\n1992.666667\n6.0\n1992.666667\n6.0\n1992.666667\n1.0\n38.131167\n-13.030667\n1.0\n51.500000\n6901260.0\n1.0\n16.921000\n\n\nstd\n21.500388\n0.0\n21.500388\n0.0\n21.500388\n0.0\n0.297238\n0.168997\n0.0\n1.870829\n0.0\n0.0\n0.495337\n\n\nmin\n1961.000000\n6.0\n1961.000000\n6.0\n1961.000000\n1.0\n37.707000\n-13.265000\n1.0\n49.000000\n6901260.0\n1.0\n16.153000\n\n\n25%\n1980.500000\n6.0\n1980.500000\n6.0\n1980.500000\n1.0\n37.940500\n-13.132500\n1.0\n50.250000\n6901260.0\n1.0\n16.643250\n\n\n50%\n1994.500000\n6.0\n1994.500000\n6.0\n1994.500000\n1.0\n38.156500\n-13.037000\n1.0\n51.500000\n6901260.0\n1.0\n17.014000\n\n\n75%\n2010.750000\n6.0\n2010.750000\n6.0\n2010.750000\n1.0\n38.350000\n-12.910750\n1.0\n52.750000\n6901260.0\n1.0\n17.263250\n\n\nmax\n2014.000000\n6.0\n2014.000000\n6.0\n2014.000000\n1.0\n38.484000\n-12.812000\n1.0\n54.000000\n6901260.0\n1.0\n17.479000", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "SST Cross Validation" + ] }, { - "objectID": "notebooks/batch_download_podaac_data.html#download-files-in-a-batch-with-gnu-wget", - "href": "notebooks/batch_download_podaac_data.html#download-files-in-a-batch-with-gnu-wget", - "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", - "section": "Download files in a batch with GNU Wget", - "text": "Download files in a batch with GNU Wget\nThe key wget option for this purpose is specified using the -i argument – it takes the path to the text file containing the download urls.\nAnother nice feature of wget is the capability to continue downloads started during a previous session if they were interrupted. Pass -c to enable.\nMake a data/ directory, then run wget and give its path to the -P argument to download the files into that directory:\nmkdir data\n\nwget --no-verbose \\\n --no-clobber \\\n --continue \\\n -i 5237392644-download.txt -P data/" + "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-sea-surface-temperature-from-modis", + "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-sea-surface-temperature-from-modis", + "title": "PO.DAAC Cookbook", + "section": "Access sea surface temperature from MODIS", + "text": "Access sea surface temperature from MODIS\nThe user guide for MODIS Level 2 Sea Surface Temperature (SST) from GHRSST is available on the PO.DAAC Drive: https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf\nWe will access L2 SST data for our AOI and time period of interest by submitting two subset requests to the Harmony API.\nRedefine the AOI to the minimum XY bounds of selected profiles\nSimply replace the aoi_* Python variables with min/max of the lat and lon columns in the new argo_skinny data frame:\n\naoi_minlon = argo_skinny.lon.min()\naoi_maxlon = argo_skinny.lon.max()\naoi_minlat = argo_skinny.lat.min()\naoi_maxlat = argo_skinny.lat.max()\n\naoi_minlon, aoi_minlat, aoi_maxlon, aoi_maxlat\n\n(-13.265, 37.707, -12.812, 38.484)\n\n\nSearch the Common Metadata Repository (CMR) for its unique concept-id\nThe API requires a dataset identifier that we must obtain from CMR. In the next cell, submit a request to the CMR API to grab the metadata for to the dataset/collection.\n\nmodis_results = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': \"MODIS_A-JPL-L2P-v2019.0\",\n 'token': _token}\n).json()\n\n# Select the first/only record in the JSON response:\nmodis_coll = modis_results['items'][0]\n\n# Select the 'concept-id' from the 'meta' dictionary:\nmodis_ccid = modis_coll['meta']['concept-id']\n\nmodis_ccid\n\n'C1940473819-POCLOUD'\n\n\n\nRequest subsets from the Harmony API\nWe will submit two requests to the Harmony API. The API is under active development, and it’s therefore recommended that you test your input parameters in the Swagger API interface.\nThe next cell joins the base url for the API to the concept-id obtained above. Run the cell and print the complete url to confirm:\n\nharmony_url = \"https://harmony.earthdata.nasa.gov\"\nharmony_url_modis = f\"{harmony_url}/{modis_ccid}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?\"\n\nprint(harmony_url_modis)\n\nhttps://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?\n\n\nMake a dictionary of subset parameters and format the values to meet requirements of the Harmony API. (See the Swagger UI linked above for more information about those requirements.)\nNote how I’ve commented out the time parameter for the second half of January. I requested the first 15 days and then the second 15 days in two requests to get the whole month.\nHere we print the parameters for the first request:\n\nharmony_params_modis1 = {\n 'time': f'(\"{start_date}T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")',\n 'lat': f'({aoi_minlat}:{aoi_maxlat})',\n 'lon': f'({aoi_minlon}:{aoi_maxlon})',\n}\n\nharmony_params_modis2 = {\n 'time': f'(\"2019-01-16T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")',\n 'lat': f'({aoi_minlat}:{aoi_maxlat})',\n 'lon': f'({aoi_minlon}:{aoi_maxlon})',\n}\n\nharmony_params_modis1\n\n{'time': '(\"2019-01-01T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")',\n 'lat': '(37.707:38.484)',\n 'lon': '(-13.265:-12.812)'}\n\n\nComplete the url by formatting the query portion using the parameters dictionary:\n\nrequest_url_modis1 = harmony_url_modis+\"subset=time{time}&subset=lat{lat}&subset=lon{lon}\".format(**harmony_params_modis1)\nrequest_url_modis2 = harmony_url_modis+\"subset=time{time}&subset=lat{lat}&subset=lon{lon}\".format(**harmony_params_modis2)\n\nprint(request_url_modis1)\n\nhttps://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?subset=time(\"2019-01-01T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")&subset=lat(37.707:38.484)&subset=lon(-13.265:-12.812)\n\n\n\n\nSubmit the request parameters to the Harmony API endpoint\nI’ve already submitted the two requests required to obtain full coverage for our region and timeframe of interest (the two urls in the job_status list below). To submit a new request, or to submit these two MODIS requests again, comment out the two items in the list like this:\njob_status = [\n #'https://...'\n #'https://...\n]\nIt should trigger new requests in the subsequent cells.\n\njob_status = [ \n# \"https://harmony.earthdata.nasa.gov/jobs/512ca343-3bfe-48c5-a480-9281b7348761\", # First time slice\n# \"https://harmony.earthdata.nasa.gov/jobs/5b29414d-3856-4e94-9568-01b32b02a951\", # Second time slice\n]\n\nThe next cell should download a JSON for your new request or from the first request that I submitted while I developed this notebook.\nPrint the message field of the JSON response:\n\nrequest_urls_for_modis = [request_url_modis1, request_url_modis2]\n\nif len(job_status)==0:\n # Loop over the list of request urls:\n for r in request_urls_for_modis:\n # Submit the request and decode the response from json string to dict:\n response_modis = requests.get(r)\n # If the response came back with something other than '2xx', raise an error:\n if not response_modis.status_code // 100 == 2: \n raise Exception(response_modis.text)\n else:\n response_data = response_modis.json()\n # Append the status endpoint to the list of 'job_status' urls:\n job_status.append(response_data['links'][0]['href'])\nelse:\n response_data = requests.get(job_status[0]).json()\n\nresponse_data['message']\n\n'The job is being processed'\n\n\nSuccessful requests to the API will respond with a JSON that starts like this:\n{\n \"username\": \"jmcnelis\",\n \"status\": \"running\",\n \"message\": \"The job is being processed\",\n \"progress\": 0,\n \"createdAt\": \"2021-02-25T02:09:35.972Z\",\n \"updatedAt\": \"2021-02-25T02:09:35.972Z\",\n ...\nThe example above is truncated to the first several lines for the sake of space.\nMonitor the status of an in-progress job\nSelect the status URL(s) from the list(s) of links:\n\nif len(job_status)==0:\n try:\n job_status = [l['href'] for l in response_data['links'] if l['title']==\"Job Status\"]\n except (KeyError, IndexError) as e:\n raise e\n\nprint(job_status)\n\n['https://harmony.earthdata.nasa.gov/jobs/558426d1-3df4-4cc2-80dc-943d03ac5810', 'https://harmony.earthdata.nasa.gov/jobs/dafd8c06-89b5-4dd6-af1d-cacb12512101']\n\n\nRun the next cell to monitor the status of as many requests as you need.\nIt will loop over the job_status list and wait for all the requests to finish processing. (It terminates when the status field of the JSON response does not contain the string \"running\".)\n\nwait = 10 # The number of seconds to wait between each status check\ncompleted = {} # A dict of JSON responses for completed jobs\n\n# Loop repeatedly to check job status. Wait before retrying.\nwhile True:\n for j in job_status: # Iterate over list of job urls\n if j in completed: # Skip if completed.\n continue\n # Get the current job's status as a JSON object.\n job_data = requests.get(j).json()\n if job_data['status']!='running':\n completed[j] = job_data # Add to 'completed' if finished\n # Break loop if 'completed' dictionary contains all jobs.\n if len(completed)==2:\n break\n # If still processing, print a status update and wait ten seconds.\n print(f\"# Job(s) in progress ({len(completed)+1}/{len(job_status)})\")\n time.sleep(wait)\n \nprint(f\"\\n{'&'*40}\\n%\\t\\tDONE!\\n{'&'*40}\\n\")\n\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (2/2)\n\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n% DONE!\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n\n\n\nThe final response(s) are massive whenever your subset results in a large number of output granules. Print everything but the links here:\n\nprint(json.dumps({k:v for k, v in job_data.items() if k!=\"links\"}, indent=2))\n\n{\n \"username\": \"jmcnelis\",\n \"status\": \"successful\",\n \"message\": \"The job has completed successfully\",\n \"progress\": 100,\n \"createdAt\": \"2021-03-15T21:08:45.844Z\",\n \"updatedAt\": \"2021-03-15T21:10:51.310Z\",\n \"request\": \"https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?subset=time(%222019-01-16T00%3A00%3A00.000Z%22%3A%222019-01-31T23%3A59%3A59.999Z%22)&subset=lat(37.707%3A38.484)&subset=lon(-13.265%3A-12.812)\",\n \"numInputGranules\": 55,\n \"jobID\": \"dafd8c06-89b5-4dd6-af1d-cacb12512101\"\n}\n\n\nNow look at the first url that points to a subset file (skip the first two because they point to other stuff about the order):\n\nprint(json.dumps(job_data['links'][2], indent=2))\n\n{\n \"href\": \"https://harmony.earthdata.nasa.gov/service-results/harmony-prod-staging/public/podaac/l2-subsetter/80c8503e-c958-4825-b072-ccdee3f7863b/20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4\",\n \"title\": \"20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4\",\n \"type\": \"application/x-netcdf4\",\n \"rel\": \"data\",\n \"bbox\": [\n -13.3,\n 37.7,\n -12.8,\n 38.5\n ],\n \"temporal\": {\n \"start\": \"2019-01-16T02:30:01.000Z\",\n \"end\": \"2019-01-16T02:34:59.000Z\"\n }\n}\n\n\nThis cell collects all the output links (Python dicts) from our requests in a list and prints the total number of outputs:\n\njob_links = []\n\nfor j in list(completed.values()):\n for l in j['links']:\n if l['href'].endswith(\"subsetted.nc4\"):\n job_links.append(l)\n\nprint(len(job_links))\n\n74\n\n\n\nPrepare subset data for further analysis\nGet the subset metadata as pandas.DataFrame. We can use apply logic to calculate stats over the time series in subsequent steps. Print the number of rows to confirm. (Should match above)\n\nsubsets_df = pd.DataFrame(data=[{**l, **l['temporal']} for l in job_links])\n\nprint(subsets_df.index.size)\n\n74\n\n\nSelect day/drop night observations\nAdd a day/night flag column to the table. Apply a function over the href column to check the source filename for a string indicating day/night for the swath:\n\nsubsets_df['daytime'] = subsets_df['href'].apply(lambda x: 'MODIS_A-N' not in x)\n\nsubsets_df.info()\n\n<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 74 entries, 0 to 73\nData columns (total 9 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 href 74 non-null object\n 1 title 74 non-null object\n 2 type 74 non-null object\n 3 rel 74 non-null object\n 4 bbox 74 non-null object\n 5 temporal 74 non-null object\n 6 start 74 non-null object\n 7 end 74 non-null object\n 8 daytime 74 non-null bool \ndtypes: bool(1), object(8)\nmemory usage: 4.8+ KB\n\n\nAnd finally, reformat the start timestamps as a new column containing pandas datetime objects instead of strings. Then, add one more column containing a date object (rather than the full datetime timestamp) which we’ll use to aggregate the data before plotting.\n\n# Add new 'datetime' column so that we aren't working with strings:\nsubsets_df['datetime'] = pd.to_datetime(subsets_df['start'])\n\n# Add new 'date' column for aggregation during the final steps of the workflow:\nsubsets_df['date'] = subsets_df.datetime.apply(lambda x: x.date()).tolist()\n\nsubsets_df.date.iloc[0]\n\ndatetime.date(2019, 1, 1)\n\n\n\n\n\nAccessing outputs from your subset request\nNow we will download all the netCDF subsets to the local workspace. (I’m inside AWS as I develop this ipynb.) Set a target directory and create it if needed:\n\ntarget_dir = f\"resources/data/\"\n\n!mkdir -p $target_dir\n\nThis function should handle downloads reliably–test by downloading the first netCDF subset from our table (subsets_df):\n\ndef download_target_file(url: str, force: bool=False):\n # Determine the target path for the download\n target_file = join(target_dir, basename(url))\n if isfile(target_file) and force is False:\n print(f\"# File already exists. Skipping...\\n({basename(url)})\\n\")\n return\n print(f\"# File downloading...\\n({basename(url)})\\n\")\n # Open a remote connection for download stream/write to disk:\n with requests.get(url) as r:\n # Raise exception if response has status other than '2xx':\n if not r.status_code // 100 == 2: \n raise Exception(r.text)\n else:\n # Otherwise write the file to disk:\n with open(target_file, 'wb') as f:\n for chunk in r.iter_content(chunk_size=1024):\n if chunk:\n f.write(chunk)\n \n\n# Test the download function by passing the URL for the first subset in the `subsets` table:\ndownload_target_file(url=subsets_df['href'].iloc[0])\n\n# Join the string path to the target file that should have just downloaded.\ntest_nc4 = join(target_dir, basename(subsets_df['href'].iloc[0]))\n\nprint(\"The first file downloaded successfully:\", isfile(test_nc4))\n\n# File already exists. Skipping...\n(20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\nThe first file downloaded successfully: True\n\n\nMake sure you can dump the header of that file with ncdump. (The output below is truncated.)\n\n!ncdump -h $test_nc4 | head -20\n\nnetcdf \\20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted {\ndimensions:\n nj = 92 ;\n ni = 42 ;\n time = 1 ;\nvariables:\n float lat(nj, ni) ;\n lat:_FillValue = -999.f ;\n lat:long_name = \"latitude\" ;\n lat:standard_name = \"latitude\" ;\n lat:units = \"degrees_north\" ;\n lat:valid_min = -90.f ;\n lat:valid_max = 90.f ;\n lat:comment = \"geographical coordinates, WGS84 projection\" ;\n lat:coverage_content_type = \"coordinate\" ;\n float lon(nj, ni) ;\n lon:_FillValue = -999.f ;\n lon:long_name = \"longitude\" ;\n lon:standard_name = \"longitude\" ;\n lon:units = \"degrees_east\" ;\n\n\nNetCDF file format errors indicate that the download was not successful. cat the file for more clues. Read and plot the sea_surface_temperature variable:\n\nwith xr.open_dataset(test_nc4) as ds:\n ds.sea_surface_temperature[0].plot()\n\n\n\n\n\n\n\n\n\nDownload all the netCDF subsets\nGet the links in the href column in a loop:\n\nfor u in subsets_df['href'].tolist():\n download_target_file(u)\n\n# File already exists. Skipping...\n(20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190101141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190102021501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190102132001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190103030000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190103140501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104020501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104034001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104034501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104131001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104144501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190105025001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190105135000-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190106033000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190106143501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190107023501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190107134001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190108032000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190108142000-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190109022501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190109132501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190110030501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190110141001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111021000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111131500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111145500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190112025501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190112140001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113020001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113033501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113130500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113144001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190114024000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190114134500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190115032501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190115143001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190116133500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190117031000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190117141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190118021501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190118132001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190119030001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190119140500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120020501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120034000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120034501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120131001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120144501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190121025001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190121135001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190122033000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190122143500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190123023501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190123134001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190124032001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190124142001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190125022500-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190125132500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190126030501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190126141001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127021001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127131500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127145500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190128025500-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190128140001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129020001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129033501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129130501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129144001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190130024001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190130134500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190131032501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190131143001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n\n\nThe next cell adds a column of absolute paths to the netCDF files to the data frame subsets_df:\n\nsubsets_df['path'] = subsets_df['href'].apply(lambda x: abspath(join(target_dir, basename(x))))\n\nisfile(subsets_df['path'].iloc[0])\n\nTrue\n\n\n\n\nLimit to daytime MODIS observations\nSelect just the daytime observations into a new data frame. (Remember we added a daytime column during a previous step.)\n\nsubsets_day = subsets_df[subsets_df.daytime==True].copy()\n\nprint(subsets_day.index.size, \"of\", subsets_df.index.size, \"MODIS acquisitions were collected during daytime\")\n\n37 of 74 MODIS acquisitions were collected during daytime\n\n\n\n\nData quality\nThe quality_level variable describes the observation quality for each pixel in the L2 swaths. Values are assigned between 1 and 6 corresponding to these quality levels:\n\nno_data\nbad_data\nworst_quality\nlow_quality\nacceptable_quality\nbest_quality\n\nThe next cell plots the masked SST grid for the first daytime observations:\n\nwith xr.open_dataset(subsets_day.iloc[0].path) as ds:\n\n # Create a mask for pixels that are \n quality_mask = ds.quality_level[0]==5\n\n # Fill pixels where ###### with np.nan:\n masked_ds = ds.where(quality_mask)\n\n # Plot the resulting array of sea surface temperature:\n masked_ds.sea_surface_temperature[0].plot()\n\n\n\n\n\n\n\n\n\n\n\nPlot time series from multiple data sources\nRoll the logic above into a few map-able functions that group the SST data by day to produce (up to) one daily mean.\n\nApply filter and mean in two functions\nget_user_stat reads the input netCDF and applies some user-specified function to the dataset to render the desired output, then closes the file.\nThe second function _masked_mean filters and calculates the XY mean of the sea_surface_temperature variable. (You could replace this function with your own to do something different.)\n\nTest the combined routine against the first file in the daytime MODIS table:\n\nsubsets_day['path'].iloc[0]\n\n'/Users/jmcnelis/tmp/appscitmp/tutorials/notebooks/SWOT-EA-2021/resources/data/20190101141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4'\n\n\n\nimport warnings\n\ndef get_user_stat(netcdf, function):\n with xr.open_dataset(netcdf) as ds: \n output = function(ds)\n return output\n\n\ndef _masked_mean(ds):\n '''Produce any output stat/object you want in this function'''\n # Create a mask for pixels that are \n quality_mask = ds.quality_level[0]>=5\n # Fill pixels with np.nan where quality_level is less than 4:\n masked_ds = ds.where(quality_mask)\n # Ignore warnings about calculating mean over an empty array:\n with warnings.catch_warnings():\n warnings.simplefilter(\"ignore\", category=RuntimeWarning)\n # Calculate mean over the XY dimensions (nj, ni in this case)\n value = masked_ds['sea_surface_temperature'].mean(['nj', 'ni']).data.item()\n #value = np.nanmean(masked_sst)\n return value\n\nval = get_user_stat(subsets_day['path'].iloc[0], function=_masked_mean)\n\nval-273.15 # subtract 273.15 to convert Kelvin to Celsius\n\n16.743005371093773\n\n\nThat should give a reasonable value in degrees Celsius.\n\nGet means for the filtered MODIS SST time series in a new column\nApply the _masked_mean function over the column of subsets (i.e. netCDF4 files) to get the time series in a new column sst_mean:\n\nsubsets_day['sst_mean'] = subsets_day['path'].apply(get_user_stat, args=(_masked_mean,))-273.15\n\nsubsets_day['sst_mean'].describe()\n\ncount 15.000000\nmean 16.404915\nstd 0.566561\nmin 15.284357\n25% 15.921838\n50% 16.546533\n75% 16.833688\nmax 17.222162\nName: sst_mean, dtype: float64\n\n\nWe may need to group by the date:\n\nsubsets_day_means = subsets_day.groupby(\"date\", as_index=False).mean()\n\nsubsets_day_means.describe()\n\n\n\n\n\n\n\n\nsst_mean\n\n\n\n\ncount\n15.000000\n\n\nmean\n16.404915\n\n\nstd\n0.566561\n\n\nmin\n15.284357\n\n\n25%\n15.921838\n\n\n50%\n16.546533\n\n\n75%\n16.833688\n\n\nmax\n17.222162\n\n\n\n\n\n\n\nNow plot the two time series along the same date axis for visual comparison:\n\nfig, ax = plt.subplots(figsize=(16, 4))\n\n# Plot mean sea surface temperature from MODIS SST from GHRSST\nsubsets_day_means.plot.scatter(\n x=\"date\",\n y=\"sst_mean\", \n label=\"SST observed by MODIS\",\n s=100,\n ax=ax\n)\n\n# Plot mean sea surface temperature from the Argo floats\nargo_skinny.plot.scatter(\n x=\"date\",\n y=\"temp_at_pres_min\",\n s=100,\n color=\"orange\",\n marker=\"v\",\n label=\"SST measured by Argo floats\",\n ax=ax\n)\n\n# Matplotlib aesthetic treatments starting from here -->\nax.set_ylabel(\"Temperature (deg C)\")\nax.set_ylim(15.0, 18.0)\nax.grid(alpha=0.25)\n\n\n\n\n\n\n\n\n\n\n\nMUR Level 4 SST from AWS Open Registry\nTry plotting the summarized time series for the two datasets against MUR L4 SST from AWS Open Registry: https://registry.opendata.aws/mur/\n\nimport fsspec\nimport xarray as xr\nfrom dask.distributed import Client\n\n# Reference the MUR L4 SST data on the AWS Open Registry\nurl = 's3://mur-sst/zarr'\n\n# Open the remote dataset from its S3 endpoint (pre-consolidated)\nds = xr.open_zarr(fsspec.get_mapper(url, anon=True), consolidated=True)\n\n# Slice the dataset along its X, Y, and T dimensions:\nmur_L4_subset = ds['analysed_sst'].sel(\n time=slice('2019-01-01','2019-01-31'),\n lat=slice(aoi_minlat, aoi_maxlat), \n lon=slice(aoi_minlon, aoi_maxlon),\n).persist()\n\n# Aggregate the spatial dimensions to compute the one-dimensional time series of means:\nmur_L4_subset_means = mur_L4_subset.groupby(\"time\").mean([\"lon\", \"lat\"])-273.15\n\nprint(mur_L4_subset_means)\n\n<xarray.DataArray 'analysed_sst' (time: 31)>\ndask.array<sub, shape=(31,), dtype=float32, chunksize=(1,), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-31T09:00:00\n\n\nAdd the MUR time series to the subsets table so that they share the same time axis with the L2 time series:\n\nsubsets_day_means['L4_MUR_SST'] = mur_L4_subset_means.compute().data\n\nPlot the result alongside our data processed throughout the notebook:\n\nfig, ax = plt.subplots(figsize=(16, 5))\n\n# Plot the L4 SST from MUR (hosted by AWS Open Registry)\nsubsets_day_means.plot.line(\n x=\"date\",\n y=\"L4_MUR_SST\",\n color=\"red\",\n label=\"L4 MUR SST (AWS Open Registry)\",\n ax=ax,\n)\n\n# Plot the L2 SST from GHRSST (subset through Harmony API)\nsubsets_day_means.plot.scatter(\n x=\"date\",\n y=\"sst_mean\", \n label=\"L2 MODIS SST (EOSDIS Cloud)\",\n s=100,\n ax=ax\n)\n\n# Plot the in situ temps measured at the surface during Argo profiles (accessed from ArgoVis)\nargo_skinny.plot.scatter(\n x=\"date\",\n y=\"temp_at_pres_min\",\n s=100,\n color=\"orange\",\n marker=\"v\",\n label=\"In situ measurements (ArgoVis API)\",\n ax=ax\n)\n\n# Matplotlib aesthetic treatments starting from here -->\nplt.xticks(rotation=15)\nax.set_xlabel(None)\nax.set_xlim(subsets_day_means.date.iloc[0], subsets_day_means.date.iloc[-1])\nax.set_ylabel(\"Temperature (deg C)\")\nax.set_ylim(15.0, 18.0)\nax.grid(alpha=0.25)\nax.set_title(\"Daily SST from L2 MODIS, L4 MUR, and in situ measurements (January 2019)\")\n\nText(0.5, 1.0, 'Daily SST from L2 MODIS, L4 MUR, and in situ measurements (January 2019)')", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "SST Cross Validation" + ] }, { - "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html", - "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html", - "title": "Shapefile Search in the Common Metadata Repository (CMR)", + "objectID": "notebooks/podaac_cmr_s3_links.html", + "href": "notebooks/podaac_cmr_s3_links.html", + "title": "CMR search getting S3 Links", "section": "", - "text": "CMR allows the upload of ESRI Shapefiles via command line for granule and collection level search. To use this functionality from the command line, we can use python or curl to do our search. This example will run through a python request and a curl command line program for doing shapefile search.\nPrerequisites:\nWe will use a shapefile located in the github/podaac source repository for this search: https://github.com/podaac/tutorials/blob/master/notebooks/resources/gulf_shapefile.zip\nFor more information on collections, granules, and concept-ids, please refer to the following tutorial:\nhttps://github.com/podaac/tutorials/blob/master/notebooks/podaac_cmr_tutorial.ipynb\nThis collection is the MODIS_A-JPL-L2P-v2019.0 Level 2 collection from the Moderate Resolution Imaging Spectroradiometer (MODIS) on the NASA Terra satellite. In the CMR environment it has the collection id:\nC1940473819-POCLOUD" - }, - { - "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#python-tutorial-shapefile-search", - "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#python-tutorial-shapefile-search", - "title": "Shapefile Search in the Common Metadata Repository (CMR)", - "section": "Python tutorial shapefile search", - "text": "Python tutorial shapefile search\nThe following snippet will use the ‘requests’ library along with the shapefile available at github to perform a shapefile search on the CMR. It will return values that overlap or intersect the shapefile provided.\n\nimport requests\nimport json\nimport pprint\n\n# the URL of the CMR searvice\nurl = 'https://cmr.earthdata.nasa.gov/search/granules.json'\n\n#The shapefile we want to use in our search\nshp_file = open('resources/gulf_shapefile.zip', 'rb')\n\n#need to declare the file and the type we are uploading\nfiles = {'shapefile':('gulf_shapefile.zip',shp_file, 'application/shapefile+zip')}\n\n#used to define parameters such as the concept-id and things like temporal searches\nparameters = {'echo_collection_id':'C1940473819-POCLOUD'}\n\nresponse = requests.post(url, files=files, params=parameters)\npp = pprint.PrettyPrinter(indent=2)\npp.pprint(response.json())\n\n{ 'feed': { 'entry': [ { 'boxes': ['28.481 -83.616 49.941 -51.077'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966128926-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '49.94093 -81.73856 31.93185 -83.6126 '\n '30.8223 -71.67589 28.48104 -59.75119 '\n '37.68658 -55.70623 45.51698 '\n '-51.07733 48.7527 -66.02296 49.94093 '\n '-81.73856']],\n 'time_end': '2002-07-04T06:39:59.000Z',\n 'time_start': '2002-07-04T06:35:00.000Z',\n 'title': '20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T11:02:35.998Z'},\n { 'boxes': ['10.927 -86.378 32.007 -59.736'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1965906207-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '32.00729 -83.61582 13.9926 -86.3664 '\n '10.92705 -65.23521 28.55306 '\n '-59.73598 30.82465 -71.75616 '\n '32.00729 -83.61582']],\n 'time_end': '2002-07-04T06:44:59.000Z',\n 'time_start': '2002-07-04T06:40:00.000Z',\n 'title': '20020704064005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T00:49:16.190Z'},\n { 'boxes': ['24.59 -108.887 45.934 -78.166'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '17.538349151611328',\n 'id': 'G1966184358-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '45.93343 -106.75979 27.9175 '\n '-108.87063 26.78721 -97.43111 '\n '24.58949 -85.88849 41.80767 '\n '-78.18217 44.76529 -92.2568 45.93343 '\n '-106.75979']],\n 'time_end': '2002-07-04T08:19:59.000Z',\n 'time_start': '2002-07-04T08:15:00.000Z',\n 'title': '20020704081505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T13:47:31.352Z'},\n { 'boxes': ['6.959 -111.829 27.994 -85.876'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966151010-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '27.99214 -108.86564 9.98915 '\n '-111.82863 6.95943 -90.93935 '\n '24.66195 -85.8759 27.99214 '\n '-108.86564']],\n 'time_end': '2002-07-04T08:24:59.000Z',\n 'time_start': '2002-07-04T08:20:00.000Z',\n 'title': '20020704082005-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T12:08:23.694Z'},\n { 'boxes': ['29.15 -87.003 50.655 -54.096'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966083052-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '32.55957 -54.09549 50.65467 '\n '-55.92677 49.49397 -71.94393 '\n '46.24421 -86.99546 37.16275 '\n '-81.58549 29.14963 -78.08743 '\n '31.46126 -66.30155 32.55957 '\n '-54.09549']],\n 'time_end': '2002-07-04T17:45:00.000Z',\n 'time_start': '2002-07-04T17:40:00.000Z',\n 'title': '20020704174005-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T08:57:42.956Z'},\n { 'boxes': ['15.564 -104.417 36.655 -76.757'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '20.634543418884277',\n 'id': 'G1966162557-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '18.63178 -76.75741 36.65489 '\n '-79.31566 35.49725 -92.06644 '\n '33.09602 -104.39378 15.56437 '\n '-98.30582 18.63178 -76.75741']],\n 'time_end': '2002-07-04T19:19:59.000Z',\n 'time_start': '2002-07-04T19:15:00.000Z',\n 'title': '20020704191505-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T12:45:28.980Z'},\n { 'boxes': ['22.183 -95.334 43.467 -65.561'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '21.469408988952637',\n 'id': 'G1966027719-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '43.46704 -93.09718 25.44967 '\n '-95.33366 22.18354 -72.7837 39.4902 '\n '-65.56145 42.29645 -79.14141 '\n '43.46704 -93.09718']],\n 'time_end': '2002-07-05T07:25:00.000Z',\n 'time_start': '2002-07-05T07:20:01.000Z',\n 'title': '20020705072006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T06:11:18.592Z'},\n { 'boxes': ['4.511 -98.385 25.522 -72.768'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '24.31655979156494',\n 'id': 'G1966089108-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '25.52185 -95.33205 7.52587 -98.3848 '\n '4.5112 -77.59271 22.25405 -72.76811 '\n '25.52185 -95.33205']],\n 'time_end': '2002-07-05T07:29:59.000Z',\n 'time_start': '2002-07-05T07:25:01.000Z',\n 'title': '20020705072506-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T09:16:40.271Z'},\n { 'boxes': ['18.257 -120.668 39.456 -92.208'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.34600830078125E-5',\n 'id': 'G1966064828-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '39.455 -118.21204 21.43644 '\n '-120.66811 18.2618 -98.75371 '\n '35.69537 -92.21542 38.28696 '\n '-105.14129 39.455 -118.21204']],\n 'time_end': '2002-07-05T09:05:00.000Z',\n 'time_start': '2002-07-05T09:00:01.000Z',\n 'title': '20020705090006-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0',\n 'updated': '2020-11-12T08:04:19.259Z'},\n { 'boxes': ['17.991 -91.581 39.125 -63.246'],\n 'browse_flag': True,\n 'collection_concept_id': 'C1940473819-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface '\n 'Skin Temperature from the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS) on the NASA Aqua satellite '\n '(GDS2)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '22.20408535003662',\n 'id': 'G1966080708-POCLOUD',\n 'links': [ { 'href': 's3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct '\n 'download access via S3 to the '\n 'granule.'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc.md5'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.cmr.json'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve '\n 'temporary credentials valid '\n 'for same-region direct s3 '\n 'access'},\n { 'href': 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%202P%20Global%20Sea%20Surface%20Skin%20Temperature%20from%20the%20Moderate%20Resolution%20Imaging%20Spectroradiometer%20(MODIS)%20on%20the%20NASA%20Aqua%20satellite%20(GDS2)/granules/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'OPeNDAP request URL'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sea_surface_temperature.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.quality_level.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_bias.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MODIS_A-JPL-L2P-v2019.0/20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.sses_standard_deviation.png',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#',\n 'type': 'image/png'},\n { 'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n { 'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n { 'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'polygons': [ [ '21.10151 -63.24635 39.12532 '\n '-65.68633 37.97627 -78.84272 35.4481 '\n '-91.57713 17.99084 -85.09664 '\n '21.10151 -63.24635']],\n 'time_end': '2002-07-05T18:25:00.000Z',\n 'time_start': '2002-07-05T18:20:01.000Z',\n 'title': '20020705182006-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0',\n 'updated': '2020-11-12T08:49:28.019Z'}],\n 'id': 'https://cmr.earthdata.nasa.gov:443/search/granules.json',\n 'title': 'ECHO granule metadata',\n 'updated': '2022-10-24T23:43:37.549Z'}}" - }, - { - "objectID": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#curl-command-line-syntax", - "href": "notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html#curl-command-line-syntax", - "title": "Shapefile Search in the Common Metadata Repository (CMR)", - "section": "Curl command line syntax", - "text": "Curl command line syntax\nThis command submits the same request as the Python example above, returning search results in JSON format for Granules that share spatial coverage with the input shapefile (resources/gulf_shapefile.zip) and belong to the target Collection (echo_collection_id=C1940473819-POCLOUD):\ncurl -XPOST \"https://cmr.earthdata.nasa.gov/search/granules.json\" -F \"shapefile=@resources/gulf_shapefile.zip;type=application/shapefile+zip\" -F \"echo_collection_id=C1940473819-POCLOUD\" -F \"pretty=true\"\nThe (truncated) results:\n{\n \"feed\" : {\n \"updated\" : \"2020-05-18T22:09:58.452Z\",\n \"id\" : \"https://cmr.earthdata.nasa.gov:443/search/granules.json\",\n \"title\" : \"ECHO granule metadata\",\n \"entry\" : [ {\n \"time_start\" : \"2002-07-04T06:35:00.000Z\",\n \"granule_size\" : \"9.34600830078125E5\",\n \"online_access_flag\" : true,\n \"id\" : \"G1966128926-POCLOUD\",\n \"day_night_flag\" : \"UNSPECIFIED\",\n \"browse_flag\" : true,\n \"time_end\" : \"2002-07-04T06:39:59.000Z\",\n \"coordinate_system\" : \"CARTESIAN\",\n \"polygons\" : [ [ \"-74.21 -163.74 -72.95 -180 -75.43 -180 -74.21 -163.74\" ], [ \"-72.95 180 -69.22 161.56 -63.56 148.24 -59.74 142.63 -54.76 137.29 -43.19 129.21 -28.81 123 -9.39 117.38 70.28 101.89 78.71 98.84 83.8 94.5 85.75 90.5 87.14 84.43 88.59 63.9 89.12 2.26 88.28 -48.29 87.12 -61.14 85.38 -68.1 82.54 -72.63 77.71 -75.93 63.62 -80.05 9.8 -89.82 -15.54 -95.55 -35.84 -102.3 -50.51 -110.4 -56.3 -115.37 -60.99 -120.88 -64.95 -127.37 -68.22 -135.08 -70.76 -143.97 -72.76 -155.11 -74.35 -180 -89.345 -180 -88.32 -113.33 -86.69 -101.61 -83.86 -95.95 -79.32 -92.73 -70.2 -89.86 -10.6 -79.24 16.19 -73.27 33.1 -67.88 46.23 -61.6 52.76 -57.05 57.86 -52.26 62.64 -46.04 66.5 -38.81 69.5 -30.55 71.71 -21.38 74.26 1.26 73.75 29.71 72.1 42.61 69.64 53.42 66.25 62.72 62.36 69.82 57.32 76.19 51.2 81.62 37.2 89.55 18.32 96.04 -10.4 102.56 -70.39 113.28 -79.49 116.19 -83.94 119.43 -86.33 123.83 -87.89 131.86 -86.97 131.68 -85.71 133.93 -81.4 147.95 -77.84 164.04 -75.43 180 -72.95 180\" ], [ \"-74.35 180 -74.81 162.65 -77.45 142.63 -82.89 118.89 -85.78 110.18 -87.46 107.84 -88.13 109.51 -88.85 123.7 -89.345 180 -74.35 180\" ] ],\n \"original_format\" : \"UMM_JSON\",\n \"collection_concept_id\" : \"C1940473819-POCLOUD\",\n \"data_center\" : \"POCLOUD\",\n \"links\" : [ {\n \"rel\" : \"http://esipfed.org/ns/fedsearch/1.1/s3#\",\n \"hreflang\" : \"en-US\",\n \"href\" : \"s3://podaac-ops-cumulus-protected/MODIS_A-JPL-L2P-v2019.0/20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc\"\n },\n ...\nThis command gets the same listing again with curl, this time returning the search results in their native xml format:\ncurl -XPOST \"https://cmr.earthdata.nasa.gov/search/granules\" -F \"shapefile=@resources/gulf_shapefile.zip;type=application/shapefile+zip\" -F \"echo_collection_id=C1940473819-POCLOUD\" -F \"pretty=true\"\nThe (truncated) results:\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<results>\n <hits>1912</hits>\n <took>970</took>\n <references>\n <reference>\n <name>20020704063505-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0.nc</name>\n <id>G1966128926-POCLOUD</id>\n <location>https://cmr.earthdata.nasa.gov:443/search/concepts/G1226019017-POCUMULUS/1</location>\n <revision-id>1</revision-id>\n </reference>\n ..." + "text": "This is a tutorial to show how to retrive a list of s3 links from a CMR granules search.\n\nPrerequisites\nBefore proceeding, ensure you have the following:\nPython installed on your system. The requests library installed. If not, you can install it using “pip install requests”\nDefine function below to get s3 links for granules based on CMR search criterias.\n\nimport requests\nimport netrc\n\ndef get_s3_links(collection_concept_id, provider, bounding_box=None,\n time_range=None, cycle=None, wildcard=None, edl_token=None):\n \"\"\"\n Fetch S3 links from CMR API based on search criteria.\n\n :param collection_concept_id: The concept ID of the collection to search within.\n :param provider: The data provider for the collection.\n :param bounding_box: A list of coordinates [min_lon, min_lat, max_lon, max_lat] to filter by bounding box.\n :param time_range: A list of two datetime strings [start_time, end_time] to filter by temporal range.\n :param cycle: The cycle value to filter by.\n :param wildcard: A native_id wildcard pattern to filter granules.\n :param edl_token: The EDL token for authentication (optional).\n :return: A list of S3 links from the CMR API.\n \"\"\"\n base_url = 'https://cmr.earthdata.nasa.gov'\n search_endpoint = '/search/granules.umm_json'\n\n # Set up query parameters\n params = {\n 'collection_concept_id': collection_concept_id,\n 'provider': provider,\n 'page_size': 2000\n }\n\n if bounding_box:\n params['bounding_box'] = ','.join(map(str, bounding_box))\n\n if time_range:\n params['temporal'] = ','.join(map(str, time_range))\n\n if cycle:\n params['cycle'] = cycle\n\n if wildcard:\n params['options[native_id][pattern]'] = 'true'\n params['native_id'] = wildcard\n\n s3_links = []\n\n headers = {'cmr-search-after': None}\n if edl_token:\n headers[\"Authorization\"] = f\"Bearer {edl_token}\"\n\n try:\n while True:\n response = requests.get(base_url + search_endpoint, params=params, headers=headers)\n response.raise_for_status() # Check for request errors\n response_data = response.json()\n cmr_search_after = response.headers.get(\"cmr-search-after\")\n\n if 'items' not in response_data:\n break\n\n for item in response_data['items']:\n if 'umm' in item and 'RelatedUrls' in item['umm']:\n for url_info in item['umm']['RelatedUrls']:\n if url_info['Type'] == 'GET DATA VIA DIRECT ACCESS' and url_info['URL'] and 's3://' in url_info['URL']:\n s3_links.append(url_info['URL'])\n\n headers['cmr-search-after'] = cmr_search_after\n\n if cmr_search_after is None:\n break\n\n except requests.exceptions.RequestException as e:\n print(f\"Error: {e}\")\n\n return s3_links\n\n\n\nProvide CMR Credentials\nYou may need authentication for the CMR API (e.g., Earthdata Login), the following function will create an EDL token for you, also you will need to create a .netrc file with your EDL credentials. More information on .netrc files https://everything.curl.dev/usingcurl/netrc\n\n# GET TOKEN FROM CMR \ndef get_token():\n urs_root = 'urs.earthdata.nasa.gov'\n username, _, password = netrc.netrc().authenticators(urs_root)\n token_api = \"https://{}/api/users/tokens\".format(urs_root)\n response = requests.get(token_api, auth=(username, password))\n content = response.json()\n if len(content) > 0:\n return content[0].get('access_token')\n else:\n create_token_api = \"https://{}/api/users/token\".format(urs_root)\n response = requests.post(create_token_api, auth=(username, password))\n content = response.json()\n return content.get('access_token')\n\nedl_token = get_token()\n\n\n\nSearch Collection Concept id\nSearch for a collection concept id using CMR API, we will use a collections shortname to find the collection concept id.\n\ncollection_short_name = \"SWOT_L2_LR_SSH_BASIC_1.0\"\nheaders = {\"Authorization\": f\"Bearer {edl_token}\"}\ncmr_collection_url = f\"https://cmr.earthdata.nasa.gov/search/collections.json?short_name={collection_short_name}\"\nresponse = requests.get(headers=headers, url=cmr_collection_url)\ncollection_concept_id = response.json().get('feed').get('entry')[0].get('id')\n\n\n\nDefine Search Criteria\nDefine the search criteria to filter the granules. This can include the collection concept ID, provider, bounding box, time range, cycle, and wildcard (if needed). Wildcard are used to search for granules name that falls within the wildcard regex.\n\n# Example usage:\nprovider = 'POCLOUD'\nbounding_box = [-90, -90, 90, 90]\ntime_range = [\"2023-01-01T00:00:00Z\", \"2023-12-30T23:59:59Z\"]\ncycle = \"560\"\nwildcard = \"*2023*\"\n\n\n\nFetch S3 Links\nNow, let’s call the get_s3_links function with the provided search criteria to fetch the S3 links from the CMR API.\n\ns3_links = get_s3_links(collection_concept_id, provider,\n bounding_box=bounding_box, time_range=time_range, \n wildcard=wildcard, edl_token=edl_token, cycle=cycle)\n\nprint(len(s3_links))\ndisplay(s3_links)" }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#in-aws-cloud-version", - "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#in-aws-cloud-version", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "In AWS Cloud Version", - "text": "In AWS Cloud Version\n\nAuthors: Nicholas Tarpinian, PO.DAAC | Catalina Taglialatela (JPL, PO.DAAC)", + "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#import-packages", + "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#import-packages", + "title": "Hydrocron API: SWOT Time Series Examples", + "section": "Import Packages", + "text": "Import Packages\n\nimport dask\nimport dask.dataframe as dd\nfrom dask.distributed import Client\nimport hvplot.dask\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport pprint\nimport requests\n\nimport datetime\nfrom io import StringIO", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", "Access & Visualization", - "Raster Multifile", - "Cloud" + "Hydrocron Time Series" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#summary-learning-objectives", - "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#summary-learning-objectives", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Summary & Learning Objectives", - "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with multiple files from the SWOT Raster Image data product version 2.0 in the cloud\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on user’s choice; choosing between two resolutions either by ‘100m’ or ‘250m’.\nVisualizing multiple raster images on a single map.\nStacking multiple raster images and creating a time dimension to analyze over time.\nAdjusting images based on quality flag", + "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#set-up-dask-workers-for-parallelization", + "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#set-up-dask-workers-for-parallelization", + "title": "Hydrocron API: SWOT Time Series Examples", + "section": "Set up Dask Workers for Parallelization", + "text": "Set up Dask Workers for Parallelization\n\nA note on Dask\nWe use Dask for the notebook as it aggregates the data into a Dask DataFrame which can then be used in a variety of ways to explore, visualize, and analyze the data and it optimizes these operations by preforming various tasks in parallel. See the Dask Documentation for more information.\nWe also recognize that it may be a bit complex to use for smaller queries and offer the recommedation below to set the number of workers n_workers to 1 which will run the operations on a single thread instead of parallel.\n\nclient = Client(n_workers=4) # Set to n workers for number of CPUs or parallel processes or set to 1 worker to run things on a single thread\nclient\n\n\n\n\n\n\n\n\nClient\n\nScheduler: tcp://127.0.0.1:63944\nDashboard: http://127.0.0.1:8787/status\n\nCluster\n\nWorkers: 4\nCores: 16\nMemory: 34.16 GB", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", "Access & Visualization", - "Raster Multifile", - "Cloud" + "Hydrocron Time Series" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#requirements", - "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#requirements", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via an s3fs session; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - This workflow as written works on a 14.8 GB RAM, upto 3.7 CPU cloud compute instance type. Smaller instances tent to crash.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport io\nimport s3fs\nimport xarray as xr\nimport numpy as np\nfrom datetime import datetime\nfrom pathlib import Path\nimport hvplot\nimport hvplot.xarray \nimport earthaccess", + "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#obtain-sword-reach-ids", + "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#obtain-sword-reach-ids", + "title": "Hydrocron API: SWOT Time Series Examples", + "section": "Obtain SWORD reach IDs", + "text": "Obtain SWORD reach IDs\nIn this section, we query the Feature Translation Service (FTS) to give us a list of river IDs from the SWOT River Database (SWORD). One river reach ID has the format CBBBBBRRRRT and a node ID has the format, CBBBBBRRRRNNNT where C stands for continent, B for basin, R for reach, N for node, and T for type. The first 6 digits of the id (CBBBBB) are the HydroBASINS Pfafstetter level 6 basin code, where the first digit represents one of nine continental regions (1 = Africa, 2 = Europe, 3 = Siberia, 4 = Asia, 5 = Oceania, 6 = South America, 7 = North America, 8 = Arctic, 9 = Greenland), and the remaining digits are nested basin levels 2–6. In this example, we search by the beginning of a SWORD ID (basin code). For example, ID 732520 represents multiple reaches along the Savannah River and its tributaries in Georgia, USA.\nThe query_fts function can query the Feature Translation Service for reach identifiers by river name, reach identifier, HUC, or region. In this notebook, the function is used to query the FTS for reach identifiers associated with the basin identifier, and can be altered to search via river name. You can query the FTS and use a combination of page_size and page_number parameters to retrieve all reach identifier results for a query.\n\n# Assign URLs to Variables for the APIs we use, FTS and Hydrocron\nFTS_URL = \"https://fts.podaac.earthdata.nasa.gov/v1\" \nHYDROCRON_URL = \"https://soto.podaac.earthdatacloud.nasa.gov/hydrocron/v1/timeseries\"\n\n# BASIN or RIVER to query FTS for\nBASIN_IDENTIFIER = \"732520\" # to search via basin ID, find within SWORD database\nRIVER_NAME = \"Rhine\" # to search via river name\n\n\ndef query_fts(query_url, params):\n \"\"\"Query Feature Translation Service (FTS) for reach identifers using the query_url parameter.\n\n Parameters\n ----------\n query_url: str - URL to use to query FTS\n params: dict - Dictionary of parameters to pass to query\n\n Returns\n -------\n dict of results: hits, page_size, page_number, reach_ids\n \"\"\"\n\n reaches = requests.get(query_url, params=params)\n reaches_json = reaches.json()\n\n hits = reaches_json['hits']\n if 'search on' in reaches_json.keys():\n page_size = reaches_json['search on']['page_size']\n page_number = reaches_json['search on']['page_number']\n else:\n page_size = 0\n page_number = 0\n\n return {\n \"hits\": hits,\n \"page_size\": page_size,\n \"page_number\": page_number,\n \"reach_ids\": [ item['reach_id'] for item in reaches_json['results'] ]\n }\n\n\n# Search by basin code\nquery_url = f\"{FTS_URL}/rivers/reach/{BASIN_IDENTIFIER}\"\nprint(f\"Searching by basin ...{query_url}\")\n\n# Search by river name\n# query_url = f\"{FTS_URL}/rivers/{RIVER_NAME}\" #if searching via river name instead\n# print(f\"Searching by river name ...{query_url}\")\n\npage_size = 100 # Set FTS to retrieve 100 results at a time\npage_number = 1 # Set FTS to retrieve the first page of results\nhits = 1 # Set hits to intial value to start while loop\nreach_ids = []\nwhile (page_size * page_number) != 0 and len(reach_ids) < hits:\n params = { \"page_size\": page_size, \"page_number\": page_number }\n results = query_fts(query_url, params)\n \n hits = results['hits']\n page_size = results['page_size']\n page_number = results['page_number'] + 1\n reach_ids.extend(results['reach_ids'])\n\n print(\"page_size: \", page_size, \", page_number: \", page_number - 1, \", hits: \", hits, \", # reach_ids: \", len(reach_ids))\n \nprint(\"Total number of reaches: \", len(reach_ids))\nreach_ids = list(set(reach_ids)) # Remove duplicates\nprint(\"Total number of non-duplicate reaches: \", len(reach_ids))\n\nSearching by basin ...https://fts.podaac.earthdata.nasa.gov/v1/rivers/reach/732520\npage_size: 100 , page_number: 1 , hits: 190 , # reach_ids: 100\npage_size: 100 , page_number: 2 , hits: 190 , # reach_ids: 190\nTotal number of reaches: 190\nTotal number of non-duplicate reaches: 190\n\n\nOnce you have a list of reach identifiers, you can query Hydrocron for SWOT time series data. For now, we will just pull the first 10 reaches we discovered.\n\nreach_ids = reach_ids[:10]\nlen(reach_ids)\n\n10", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", "Access & Visualization", - "Raster Multifile", - "Cloud" + "Hydrocron Time Series" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#authentication-with-earthaccess", - "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#authentication-with-earthaccess", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch for SWOT Raster products using earthaccess\nEach dataset has its own unique collection concept ID. For the SWOT_L2_HR_Raster_2.0 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Mead Reservoir in the United States.\nWe used bbox finder to get the exact coordinates for our area of interest.\n\nraster_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-115.112686,35.740939,-114.224167,36.937819),\n temporal =('2024-02-01 12:00:00', '2024-02-01 23:59:59'),\n granule_name = '*_100m_*', #specify we are interested in the 100m standard raster\n count =200\n)\n\nGranules found: 2\n\n\n\n\nVisualizing Multiple Tiles\nLet’s now visualize multiple raster tiles that we searched and explore the data.\nUtilizing xarray.open_mfdataset which supports the opening of multiple files.\n\nds = xr.open_mfdataset(earthaccess.open(raster_results), engine='h5netcdf',combine='nested', concat_dim='x')\nds\n\nOpening 2 granules, approx size: 0.07 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (y: 2784, x: 3074)\nCoordinates:\n * y (y) float64 3.899e+06 3.899e+06 ... 4.177e+06\n * x (x) float64 5.391e+05 5.392e+05 ... 7.217e+05\nData variables: (12/39)\n crs (x) object b'1' b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(512, 513), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(512, 513), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(2784, 1538), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(768, 769), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T08:37:45Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 539100.0\n x_max: 692800.0\n y_min: 4023100.0\n y_max: 4176900.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:y: 2784x: 3074Coordinates: (2)y(y)float643.899e+06 3.899e+06 ... 4.177e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3898600., 3898700., 3898800., ..., 4176700., 4176800., 4176900.])x(x)float645.391e+05 5.392e+05 ... 7.217e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([539100., 539200., 539300., ..., 721500., 721600., 721700.])Data variables: (39)crs(x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1', ..., b'1', b'1', b'1'], dtype=object)longitude(y, x)float64dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nIndexes: (2)yPandasIndexPandasIndex(Float64Index([3898600.0, 3898700.0, 3898800.0, 3898900.0, 3899000.0, 3899100.0,\n 3899200.0, 3899300.0, 3899400.0, 3899500.0,\n ...\n 4176000.0, 4176100.0, 4176200.0, 4176300.0, 4176400.0, 4176500.0,\n 4176600.0, 4176700.0, 4176800.0, 4176900.0],\n dtype='float64', name='y', length=2784))xPandasIndexPandasIndex(Float64Index([539100.0, 539200.0, 539300.0, 539400.0, 539500.0, 539600.0,\n 539700.0, 539800.0, 539900.0, 540000.0,\n ...\n 720800.0, 720900.0, 721000.0, 721100.0, 721200.0, 721300.0,\n 721400.0, 721500.0, 721600.0, 721700.0],\n dtype='float64', name='x', length=3074))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T08:37:45Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :218scene_number :45tile_numbers :[88 89 90 91 88 89 90 91]tile_names :218_088L, 218_089L, 218_090L, 218_091L, 218_088R, 218_089R, 218_090R, 218_091Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T18:38:14.266613Ztime_granule_end :2024-02-01T18:38:35.362539Ztime_coverage_start :2024-02-01T18:38:14.805141Ztime_coverage_end :2024-02-01T18:38:34.816548Zgeospatial_lon_min :-116.55823577002582geospatial_lon_max :-114.84459394683485geospatial_lat_min :36.350992807631336geospatial_lat_max :37.724496129136035left_first_longitude :-115.14314896157633left_first_latitude :37.724496129136035left_last_longitude :-114.84459394683485left_last_latitude :36.5951883116925right_first_longitude :-116.55823577002582right_first_latitude :37.474717676188774right_last_longitude :-116.24045666354958right_last_latitude :36.350992807631336xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_218_088L_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_089L_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_088R_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_089R_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091R_20240201T183834_20240201T183845_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_218_088L_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_089L_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_088R_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_089R_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091R_20240201T183834_20240201T183845_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :539100.0x_max :692800.0y_min :4023100.0y_max :4176900.0institution :CNESproduct_version :01\n\n\n\nraster_plot = ds.wse.hvplot.quadmesh(x='x', y='y', rasterize=True, title=f'SWOT Raster 100m: Lake Mead Reservoir')\nraster_plot.opts(width=700, height=600, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nCreating a Time Series\nSWOT Raster product does not include a time dimension, each file is a snapshot in time, but it can be inserted by extracting from the file name.\n\nExpand the time range of your earthaccess search to get an adequate range.\nExtract the datetime from the s3 file name then concatenate based on the new time dimension.\n\n\ntime_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-114.502048,36.060175,-114.390983,36.210182),\n temporal =('2024-01-25 00:00:00', '2024-03-04 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 3\n\n\n\nfs_s3 = earthaccess.get_s3fs_session(results=time_results)\n\n\n# Get links list\nraster = []\nfor g in time_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n raster.append(l)\n\nprint(len(raster))\nraster\n\n3\n\n\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc',\n 's3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc',\n 's3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc']\n\n\n\ndef add_time_dimension(ds, file_path):\n # Extract filename from s3 file path\n file_name = file_path.split('/')[-1]\n # Extract date/time string from filename\n date_str = file_name.split('_')[-4][:15]\n # Convert the date string to a datetime object\n time_value = datetime.strptime(date_str, \"%Y%m%dT%H%M%S\")\n # Assign the time coordinate to the dataset\n ds.coords['time'] = time_value\n return ds\n\n\ndatasets = []\nfile_names = []\n\nfor file_path in raster:\n with fs_s3.open(file_path, 'rb') as file:\n file_bytes = file.read()\n file_obj = io.BytesIO(file_bytes)\n dataset = xr.open_dataset(file_obj, engine='h5netcdf')\n dataset_with_time = add_time_dimension(dataset, file_path)\n datasets.append(dataset_with_time)\n file_names.append(file_path.split('/')[-1])\n dataset.close()\n\n\n# sorting the time dimension in correct order\ndatasets.sort(key=lambda ds: ds.time.values)\n\n\nds2 = xr.concat(datasets, dim='time')\nds2\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1549, y: 1549, time: 3)\nCoordinates:\n * x (x) float64 6.788e+05 6.789e+05 ... 8.336e+05\n * y (y) float64 3.9e+06 3.901e+06 ... 4.055e+06\n * time (time) datetime64[ns] 2024-02-01T07:50:48 ... 20...\nData variables: (12/39)\n crs (time) object b'1' b'1' b'1'\n longitude (time, y, x) float64 nan nan nan ... nan nan nan\n latitude (time, y, x) float64 nan nan nan ... nan nan nan\n wse (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual_bitwise (time, y, x) float64 nan nan nan ... nan nan nan\n ... ...\n load_tide_fes (time, y, x) float32 nan nan nan ... nan nan nan\n load_tide_got (time, y, x) float32 nan nan nan ... nan nan nan\n pole_tide (time, y, x) float32 nan nan nan ... nan nan nan\n model_dry_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n model_wet_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n iono_cor_gim_ka (time, y, x) float32 nan nan nan ... nan nan nan\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T12:55:01Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 680100.0\n x_max: 829300.0\n y_min: 3903300.0\n y_max: 4052400.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1549y: 1549time: 3Coordinates: (3)x(x)float646.788e+05 6.789e+05 ... 8.336e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([678800., 678900., 679000., ..., 833400., 833500., 833600.])y(y)float643.9e+06 3.901e+06 ... 4.055e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3900500., 3900600., 3900700., ..., 4055100., 4055200., 4055300.])time(time)datetime64[ns]2024-02-01T07:50:48 ... 2024-02-...array(['2024-02-01T07:50:48.000000000', '2024-02-11T17:00:50.000000000',\n '2024-02-22T04:35:54.000000000'], dtype='datetime64[ns]')Data variables: (39)crs(time)objectb'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1'], dtype=object)longitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])latitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])wse(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])wse_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])water_area_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])sig0_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)inc(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)cross_track(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)illumination_time(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')illumination_time_tai(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')n_wse_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_water_area_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_sig0_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_other_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])dark_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_clim_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_dyn_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)layover_impact(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_cor_atmos_model(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)height_cor_xover(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)geoid(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)solid_earth_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_fes(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_got(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)pole_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_dry_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_wet_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)iono_cor_gim_ka(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)Indexes: (3)xPandasIndexPandasIndex(Float64Index([678800.0, 678900.0, 679000.0, 679100.0, 679200.0, 679300.0,\n 679400.0, 679500.0, 679600.0, 679700.0,\n ...\n 832700.0, 832800.0, 832900.0, 833000.0, 833100.0, 833200.0,\n 833300.0, 833400.0, 833500.0, 833600.0],\n dtype='float64', name='x', length=1549))yPandasIndexPandasIndex(Float64Index([3900500.0, 3900600.0, 3900700.0, 3900800.0, 3900900.0, 3901000.0,\n 3901100.0, 3901200.0, 3901300.0, 3901400.0,\n ...\n 4054400.0, 4054500.0, 4054600.0, 4054700.0, 4054800.0, 4054900.0,\n 4055000.0, 4055100.0, 4055200.0, 4055300.0],\n dtype='float64', name='y', length=1549))timePandasIndexPandasIndex(DatetimeIndex(['2024-02-01 07:50:48', '2024-02-11 17:00:50',\n '2024-02-22 04:35:54'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T12:55:01Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :205scene_number :109tile_numbers :[216 217 218 219 216 217 218 219]tile_names :205_216L, 205_217L, 205_218L, 205_219L, 205_216R, 205_217R, 205_218R, 205_219Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T07:50:48.872250Ztime_granule_end :2024-02-01T07:51:09.965949Ztime_coverage_start :2024-02-01T07:50:49.410994Ztime_coverage_end :2024-02-01T07:51:09.428854Zgeospatial_lon_min :-115.01465895670609geospatial_lon_max :-113.33094509647773geospatial_lat_min :35.225727504637376geospatial_lat_max :36.595188311791034left_first_longitude :-115.01465895670609left_first_latitude :35.46460890403489left_last_longitude :-114.72680781313967left_last_latitude :36.595188311791034right_first_longitude :-113.63706815703668right_first_latitude :35.225727504637376right_last_longitude :-113.33094509647773right_last_latitude :36.350992807533125xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :680100.0x_max :829300.0y_min :3903300.0y_max :4052400.0institution :CNESproduct_version :01\n\n\n\ntimeplot = ds2.wse.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nLet’s plot the wse quality flag, wse_qual which ranges 0-3 where 0=good, 1=suspect, 2=degraded, 3=bad (as described when printing variable with xarray).\n\ntimeplot = ds2.wse_qual.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nMasking a variable with its quaility flag\n\nvariable_to_mask = ds2['wse']\nmask_variable = ds2['wse_qual']\n\n\n# Define the condition for masking based on the range of the quaility flag\nmask_condition = mask_variable <2\n\nmasked_variable = variable_to_mask.where(mask_condition)\n\n\n# Update the masked variable in the dataset\nds2['wse'] = masked_variable\n\nds2['wse'].hvplot.image(y='y', x='x').opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nOur end product is a time series of the data showing only the values where the quality flag is either good (0) or suspect (1).\n\n\nAppendix: Alternate Plot\n\n# # Alternate plotting with matplotlib\n# %matplotlib inline\n\n# import matplotlib.pyplot as plt\n# from matplotlib import animation\n# from matplotlib.animation import FuncAnimation, PillowWriter\n# from IPython.display import display, Image, HTML\n\n# variable_name = 'wse'\n# data = ds2[variable_name]\n\n# fig, ax = plt.subplots(figsize=(10, 8))\n# fig.set_tight_layout({'rect': [0.01, 0.01, 1.0, 1.0]})\n\n# contour = ax.contourf(data.isel(time=0), cmap='viridis')\n# cbar = plt.colorbar(contour)\n# cbar.set_label('Water Surface Elevation (meters)', fontsize=14) \n# times = ds2.time.values\n\n# # Function to update the plot for each time step\n# def update(frame):\n# ax.clear()\n# contour = ax.contourf(data.isel(time=frame), cmap='viridis')\n# formatted_time = str(times[frame])[:-7]\n# ax.set_title(f'Date: {formatted_time}')\n# ax.set_xlabel('Longitude', fontsize=14)\n# ax.set_ylabel('Latitude', fontsize=14)\n# ax.text(0.5, 1.05, 'SWOT Raster 100M Lake Mead Reservoir', transform=ax.transAxes, ha='center', fontsize=14)\n# return contour,\n\n# # Creating a gif animation\n# ani = animation.FuncAnimation(fig, update, repeat=True, frames=len(data['time']), blit=True, interval=3000)\n\n# output = ('time_series.gif')\n# ani.save(output, writer='pillow', fps=.5)\n\n# with open(output,'rb') as f:\n# display(Image(data=f.read(), format='gif'))\n\n# plt.close(fig)\n# ds2.close()", + "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#query-hydrocron-for-time-series-data", + "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#query-hydrocron-for-time-series-data", + "title": "Hydrocron API: SWOT Time Series Examples", + "section": "Query Hydrocron for time series data", + "text": "Query Hydrocron for time series data\n\nDask Delayed Function to Query in Parallel\nWe define a function that will query hydrocron and return a database of the time series data for the reaches identified. This is defined as a Dask delayed function with the @dask.delayed decorator so that we can query reaches in parallel and return a Dask Dataframe to use in our visualizations.\n\n@dask.delayed\ndef query_hydrocron(query_url, reach_id, start_time, end_time, fields, empty_df):\n \"\"\"Query Hydrocron for reach-level time series data.\n\n Parameters\n ----------\n query_url: str - URL to use to query FTS\n reach_id: str - String SWORD reach identifier\n start_time: str - String time to start query\n end_time: str - String time to end query\n fields: list - List of fields to return in query response\n empty_df: pandas.DataFrame that contains empty query results\n\n Returns\n -------\n pandas.DataFrame that contains query results\n \"\"\"\n\n params = {\n \"feature\": \"Reach\",\n \"feature_id\": reach_id,\n \"output\": \"csv\",\n \"start_time\": start_time,\n \"end_time\": end_time,\n \"fields\": fields\n }\n results = requests.get(query_url, params=params)\n if \"results\" in results.json().keys():\n results_csv = results.json()[\"results\"][\"csv\"]\n df = pd.read_csv(StringIO(results_csv))\n else:\n df = empty_df\n\n return df\n\n\n\nCreate the query for Hydrocron!\nAll parameter options are listed in the Hydrocron documentation: https://podaac.github.io/hydrocron/timeseries.html\n\n%%time\n# Create queries that return Pandas.DataFrame objects\nstart_time = \"2023-07-28T00:00:00Z\"\nend_time = \"2024-04-16T00:00:00Z\"\nfields = \"reach_id,time_str,wse\"\nresults = []\nfor reach in reach_ids:\n # Create an empty dataframe for cases where no data is returned for a reach identifier\n empty_df = pd.DataFrame({\n \"reach_id\": np.int64(reach),\n \"time_str\": datetime.datetime(1900, 1, 1).strftime(\"%Y-%m-%dT%H:%M:%S\"),\n \"wse\": -999999999999.0,\n \"wse_units\": \"m\"\n }, index=[0])\n results.append(query_hydrocron(HYDROCRON_URL, reach, start_time, end_time, fields, empty_df))\n\n# Load DataFrame results into dask.dataframe\nddf = dd.from_delayed(results)\nddf.head(n=20, npartitions=len(reach_ids))\n\nCPU times: user 444 ms, sys: 131 ms, total: 575 ms\nWall time: 10.7 s\n\n\n\n\n\n\n\n\n\nreach_id\ntime_str\nwse\nwse_units\n\n\n\n\n0\n73252000433\n2024-02-09T04:28:31Z\n1.004017e+02\nm\n\n\n1\n73252000433\n2024-02-09T15:17:26Z\n9.985260e+01\nm\n\n\n2\n73252000433\n2024-03-01T01:13:37Z\n1.272824e+02\nm\n\n\n3\n73252000433\n2024-03-01T12:02:32Z\n1.005151e+02\nm\n\n\n4\n73252000433\n2024-03-21T21:58:40Z\n1.103624e+02\nm\n\n\n5\n73252000433\n2024-04-11T18:43:45Z\n1.142618e+02\nm\n\n\n6\n73252000433\n2024-04-12T05:32:40Z\n1.006057e+02\nm\n\n\n0\n73252001533\n2024-02-09T04:28:41Z\n2.006382e+02\nm\n\n\n1\n73252001533\n2024-02-09T15:17:16Z\n2.007256e+02\nm\n\n\n2\n73252001533\n2024-03-01T01:13:47Z\n2.008445e+02\nm\n\n\n3\n73252001533\n2024-03-01T12:02:22Z\n2.016775e+02\nm\n\n\n4\n73252001533\n2024-03-21T21:58:50Z\n2.009672e+02\nm\n\n\n5\n73252001533\n2024-04-11T18:43:55Z\n2.008128e+02\nm\n\n\n6\n73252001533\n2024-04-12T05:32:30Z\n2.008465e+02\nm\n\n\n0\n73252001404\n1900-01-01T00:00:00\n-1.000000e+12\nm\n\n\n0\n73252001434\n2024-01-30T06:06:26Z\n-1.000000e+12\nm\n\n\n1\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n2\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n3\n73252001434\n2024-02-20T02:51:31Z\n-1.000000e+12\nm\n\n\n4\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n\n\n\n\n\n\n# Remove fill values for missing observations\nddf = ddf.loc[(ddf[\"wse\"] != -999999999999.0)]\n\n# Convert time_str to datetime format\nddf.time_str = dd.to_datetime(ddf.time_str)\n\nddf.head(n=20, npartitions=len(reach_ids))\n\n\n\n\n\n\n\n\nreach_id\ntime_str\nwse\nwse_units\n\n\n\n\n0\n73252000433\n2024-02-09 04:28:31+00:00\n100.4017\nm\n\n\n1\n73252000433\n2024-02-09 15:17:26+00:00\n99.8526\nm\n\n\n2\n73252000433\n2024-03-01 01:13:37+00:00\n127.2824\nm\n\n\n3\n73252000433\n2024-03-01 12:02:32+00:00\n100.5151\nm\n\n\n4\n73252000433\n2024-03-21 21:58:40+00:00\n110.3624\nm\n\n\n5\n73252000433\n2024-04-11 18:43:45+00:00\n114.2618\nm\n\n\n6\n73252000433\n2024-04-12 05:32:40+00:00\n100.6057\nm\n\n\n0\n73252001533\n2024-02-09 04:28:41+00:00\n200.6382\nm\n\n\n1\n73252001533\n2024-02-09 15:17:16+00:00\n200.7256\nm\n\n\n2\n73252001533\n2024-03-01 01:13:47+00:00\n200.8445\nm\n\n\n3\n73252001533\n2024-03-01 12:02:22+00:00\n201.6775\nm\n\n\n4\n73252001533\n2024-03-21 21:58:50+00:00\n200.9672\nm\n\n\n5\n73252001533\n2024-04-11 18:43:55+00:00\n200.8128\nm\n\n\n6\n73252001533\n2024-04-12 05:32:30+00:00\n200.8465\nm\n\n\n0\n73252001695\n2024-01-29 06:05:14+00:00\n-0.2095\nm\n\n\n3\n73252001695\n2024-02-19 02:50:19+00:00\n-0.1801\nm\n\n\n4\n73252001695\n2024-02-19 13:40:15+00:00\n0.1047\nm\n\n\n6\n73252001695\n2024-03-10 23:35:22+00:00\n-0.0288\nm\n\n\n7\n73252001695\n2024-03-11 10:25:17+00:00\n0.2217\nm\n\n\n9\n73252001695\n2024-03-31 20:20:26+00:00\n-0.0407\nm\n\n\n\n\n\n\n\n\n# Plot results\nline_plot = ddf.hvplot(x=\"time_str\", y=\"wse\", by=\"reach_id\", kind=\"line\", persist=True)\nline_plot.opts(xrotation=90)\n\nscatter_plot = ddf.hvplot(x=\"time_str\", y=\"wse\", by=\"reach_id\", kind=\"scatter\", persist=True)\nline_plot * scatter_plot\n\n\n\n\n\n \n\n\n\n\n\nclient.close()", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", "Access & Visualization", - "Raster Multifile", - "Cloud" + "Hydrocron Time Series" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#summary", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#summary", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#summary", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#summary", + "title": "Download and Access L2 SWOT Oceanography Data", "section": "Summary", - "text": "Summary\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\n\nTable of Modules (Algorithms) and Discharge variables\nThe following lists the algorithms alongside their discharge variables and location in the SoS results file assuming that the SoS is an open file represented by the results variable.\nThe first six reference discharge time series for the flow law parameter estimate (FLPE) algorithms while the last six reference the Mean Optimization Integrator (MOI) results. The MOI uses a river topology to force mass conservation at confluences to produce a discharge time series for each reach-level FLPE.\n\n\n\n\n\n\n\n\nModule (Algorithm)\nDischarge Variable\nLocation in the SoS\n\n\n\n\nHiVDI\nQ\nresults[“hivdi”][“Q”]\n\n\nMetroMan\nallq\nresults[“metroman”][“allq”]\n\n\nMOMMA\nQ\nresults[“momma”][“Q”]\n\n\nneoBAM\nq1, q2, or q3\nresults[“neobam”][“q”][“q1”]\n\n\nSAD\nQa\nresults[“sad”][“Qa”]\n\n\nSIC4DVar\nQ_da\nresults[“sic4dvar”][“Q_da”]\n\n\nMOI HiVDI\nq\nresults[“moi”][“hivdi”][“q”]\n\n\nMOI MetroMan\nq\nresults[“moi”][“metroman”][“q”]\n\n\nMOI MOMMA\nq\nresults[“moi”][“momma”][“q”]\n\n\nMOI neoBAM\nq\nresults[“moi”][“qeobam”][“q”]\n\n\nMOI SAD\nq\nresults[“moi”][“sad”][“q”]\n\n\nMOI SIC4DVar\nq\nresults[“moi”][“sic4dvar”][“q”]", + "text": "Summary\nThis notebook will show direct download of PO.DAAC archived products onto your local machine. In this demo, we will showcase the usage of SWOT Level 2 Low Rate products:\n\nSWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product - shortname SWOT_L2_LR_SSH_2.0\nSWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0 - shortname SWOT_L2_NALT_IGDR_SSHA_2.0\n\nThis is a subcollection of the parent collection: SWOT_L2_NALT_IGDR_2.0\n\nSWOT Level 2 Radiometer Data Products - overview of all\n\nWe will download the data and load a time series made of multiple netCDF files into a single xarray dataset.\n\nRequirements\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#requirements", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#requirements", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#learning-objectives", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#learning-objectives", + "title": "Download and Access L2 SWOT Oceanography Data", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nauthenticate for earthaccess Python Library using your NASA Earthdata Login\naccess DAAC data by downloading directly into your local machine and operating on those files.\nplot the first time step in the data\n\n\nImport Libraries\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#learning-objectives", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#learning-objectives", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nTo explore and begin to understand the structure of the SoS.\nTo locate and plot river discharge.", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", + "title": "Download and Access L2 SWOT Oceanography Data", + "section": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product", + "text": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product\nOutlined below is a map of the different KaRIn Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nSearch and Download Data!\nIt’s time to find our data! Below we are searching using earthaccess Python library.\n\n#retrieves granule from the day we want\nkarin_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_2.0', \n temporal = (\"2024-02-01 12:00:00\", \"2024-02-01 19:43:00\"), \n granule_name = '*Expert*') # filter by files with \"Expert\" in file name. This collection has subcollections of 'Basic', 'Windwave', 'Unsmoothed' and 'Expert' granules.\n\nGranules found: 10\n\n\n\nearthaccess.download(karin_results, \"./data_downloads/SWOT_files\", provider='POCLOUD')\n\n Getting 10 granules, approx download size: 0.32 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_210_20240201T113157_20240201T122325_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_211_20240201T122324_20240201T131449_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_212_20240201T131459_20240201T140619_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_213_20240201T140618_20240201T145746_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_214_20240201T145745_20240201T154830_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_215_20240201T154954_20240201T164039_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_216_20240201T164038_20240201T173206_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_217_20240201T173205_20240201T182333_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_218_20240201T182332_20240201T191500_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_219_20240201T191459_20240201T200627_PIC0_01.nc\n\n\n[PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_210_20240201T113157_20240201T122325_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_211_20240201T122324_20240201T131449_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_212_20240201T131459_20240201T140619_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_213_20240201T140618_20240201T145746_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_214_20240201T145745_20240201T154830_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_215_20240201T154954_20240201T164039_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_216_20240201T164038_20240201T173206_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_217_20240201T173205_20240201T182333_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_218_20240201T182332_20240201T191500_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_219_20240201T191459_20240201T200627_PIC0_01.nc')]\n\n\n\n#load downloaded data into dataset to be used for plotting\nds = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert*.nc\", combine='nested', concat_dim=\"num_lines\", decode_times=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 4GB\nDimensions: (num_lines: 98660, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-02-03T22:27:17Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 76.4772191457865\n ssha_variance: 0.4263933333980923\n references: V1.2.1\n equator_longitude: -5.36xarray.DatasetDimensions:num_lines: 98660num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nData variables: (98)time(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timecalendar :gregoriantai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ntime_tai(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregoriantai_utc_difference :37.0units :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nobject numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nswh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_model(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_alt_rate(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n385.39 kiB\n38.54 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npole_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndac(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_rate(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nice_conc(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-02-03T22:27:17Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :10pass_number :210equator_time :2024-02-01T11:57:39.935000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-02-01T11:31:57.844839time_coverage_end :2024-02-01T12:23:25.880560geospatial_lon_min :270.91792399999997geospatial_lon_max :78.362457geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :270.91792399999997left_first_latitude :78.27200599999999left_last_longitude :78.343086left_last_latitude :-77.05370099999999right_first_longitude :270.93575right_first_latitude :77.053837right_last_longitude :78.36245699999999right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_010_210_20240201T113154_20240201T122329_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP010_209_20240201_104031_20240201_113158.nc, SWOT_IPN_2PfP010_210_20240201_113158_20240201_122325.nc, SWOT_IPN_2PfP010_211_20240201_122325_20240201_131452.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP010_209_20240201_104027_20240201_113202_PIC0_01.nc, SWOT_IPRAD_2PaP010_210_20240201_113154_20240201_122329_PIC0_01.nc, SWOT_IPRAD_2PaP010_211_20240201_122321_20240201_131455_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240131T233132_20240201T233223_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240202_103657_20240131_225923_20240202_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_PMA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_PMA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_WEA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_WEA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_VWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_UWA_AXVCNE20240202_030828_20240201_180000_20240201_180000, SMM_VWA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240201_174042_20240201_060000_20240201_060000, SMM_PSA_AXVCNE20240201_174042_20240201_120000_20240201_120000, SMM_PSA_AXVCNE20240202_054023_20240201_180000_20240201_180000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_T2M_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_T2M_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CWV_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CWV_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CLW_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CLW_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_SWH_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_SWH_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_gim_files :JPLQ0320.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240203_020000_19900101_000000_20240801_000000xref_dac_files :SMM_MOG_AXPCNE20240201_203002_20240201_060000_20240201_060000, SMM_MOG_AXPCNE20240201_203002_20240201_120000_20240201_120000, SMM_MOG_AXPCNE20240202_074502_20240201_180000_20240201_180000xref_precipitation_files :SMM_LSR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_CRR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grbxref_sea_ice_mask_files :SMM_ICS_AXFCNE20240202_042003_20240201_000000_20240201_235959.nc, SMM_ICN_AXFCNE20240202_041506_20240201_000000_20240201_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240202_072016_20240201_030000_20240202_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :76.4772191457865ssha_variance :0.4263933333980923references :V1.2.1equator_longitude :-5.36\n\n\n\n\nCross Over Calibration Correction\nIn order to get the corrected SSHA, we must compute a new column like the following:\n\nds['ssha_karin_corrected'] = ds.ssha_karin + ds.height_cor_xover\nds.ssha_karin_corrected\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'ssha_karin_corrected' (num_lines: 98660, num_pixels: 69)> Size: 54MB\ndask.array<add, shape=(98660, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixelsxarray.DataArray'ssha_karin_corrected'num_lines: 98660num_pixels: 69dask.array<chunksize=(9866, 69), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 43 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nCoordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nIndexes: (0)Attributes: (0)\n\n\n\n\nPlot\nNow let’s plot a variable (ssha_karin_corrected) from these 10 files in a chosen projection.\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nds.ssha_karin_corrected.plot.pcolormesh(\n ax=ax, transform=ccrs.PlateCarree(), x=\"longitude\", y=\"latitude\", vmin = -1, vmax=1, cmap='coolwarm', add_colorbar=True\n)\nax.coastlines()", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#import-packages", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#import-packages", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Import Packages", - "text": "Import Packages\n\nimport datetime\nimport pathlib\n\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\nimport earthaccess\nimport matplotlib.pyplot as plt\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", + "title": "Download and Access L2 SWOT Oceanography Data", + "section": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0", + "text": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0\nOutlined below is a map of the different Nadir Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nSearch and Download Data!\nBelow we are searching using earthaccess Python library.\n\n#retrieves granule from the day we want\nnadir_results = earthaccess.search_data(short_name = 'SWOT_L2_NALT_IGDR_SSHA_2.0', temporal = (\"2024-01-30 12:00:00\", \"2024-01-30 19:43:00\"))\n\nGranules found: 10\n\n\n\nearthaccess.download(nadir_results, \"./data_downloads/SWOT_files\")\n\n Getting 10 granules, approx download size: 0.0 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc\n\n\n[PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc')]\n\n\n\n#load downloaded data into dataset to be used for plotting\nds_nadir = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_IPR_*.nc\", combine='nested', concat_dim=\"time\", decode_times=False, engine='h5netcdf', group='data_01')\nds_nadir\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 6MB\nDimensions: (time: 27927)\nCoordinates:\n * time (time) float64 223kB 7.599e+08 ... 7.6...\n latitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n longitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\nData variables: (12/31)\n time_tai (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n surface_classification_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_1_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_2_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n alt_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n ... ...\n pole_tide (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n internal_tide_hret (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt_mle3 (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_water_vapor (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_cloud_liquid_water (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>xarray.DatasetDimensions:time: 27927Coordinates: (3)time(time)float647.599e+08 7.599e+08 ... 7.6e+08long_name :time in UTCstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute [leap_second] is set to the UTC time at which the leap second occurstai_utc_difference :37.0leap_second :0000-00-00 00:00:00array([7.599295e+08, 7.599295e+08, 7.599295e+08, ..., 7.599603e+08,\n 7.599603e+08, 7.599603e+08])latitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :latitudestandard_name :latitudeunits :degrees_northcomment :Positive latitude is North latitude, negative latitude is South latitude. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nlongitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :longitudestandard_name :longitudeunits :degrees_eastcomment :East longitude relative to Greenwich meridian. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nData variables: (31)time_tai(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsurface_classification_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :surface classificationflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]comment :Computed from a mask built with MODIS and GlobCover data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from first radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from second radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nalt_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all altimeter flags except altimeter echo type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all radiometer flags except radiometer surface type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ngeo_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geophysical quality flagflag_meanings :good badflag_values :[0 1]comment :Check on validity of all geophysical fields : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmeteo_map_availability_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ECMWF meteorological map availabilityflag_meanings :2_maps_nominal 2_maps_degraded 1_map_closest_used no_valid_mapflag_values :[0 1 2 3]comment :Possible values are: 0 meaning ’2 maps, nominal’ (six hours apart), 1 meaning ’2 maps, degraded’ (more than six hours apart), 2 meaning ’1 map, closest map used’, 3 meaning ’no valid map’\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor_interp_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correction interpolation quality flagflag_meanings :good degraded badflag_values :[0 1 2]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :rain flagflag_meanings :no_rain rain high_rain_probability_from_altimeter high_probability_of_no_rain_from_altimeter ambiguous_situation_possibility_of_ice evaluation_not_possibleflag_values :[0 1 2 3 4 5]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from first radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from second radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ice flagflag_meanings :no_ice iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from first radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from second radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\naltitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :1 Hz altitude of satellitestandard_name :height_above_reference_ellipsoidunits :mcomment :Altitude of satellite above the reference ellipsoid. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmodel_dry_tropo_cor_zero_altitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :model dry tropospheric correction at zero altitudestandard_name :altimeter_range_correction_due_to_dry_tropospheresource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at Mean Sea Level Pressure at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. A dry tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for dry tropospheric range delays of the radar pulse. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correctionstandard_name :altimeter_range_correction_due_to_wet_tropospheresource :AMRinstitution :NASA/JPLunits :mcomment :A wet tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for wet tropospheric range delays of the radar pulse\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_sea_surface_cnescls(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS solution) above reference ellipsoidsource :MSS_CNES_CLS-2015institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_dynamic_topography(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean dynamic topography above geoidsource :MDT_CNES_CLS-2018institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndepth_or_elevation(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ocean depth/land elevationsource :ACE2institution :EAPRS Laboratoryunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninv_bar_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :inverted barometer height correctionstandard_name :sea_surface_height_correction_due_to_air_pressure_at_low_frequencysource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndac(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :dynamic atmospheric correctioninstitution :LEGOS/CLS/CNESunits :mcomment :Sum of the high frequency fluctuations correction and of the low frequency inverted barometer correction (inv_bar_cor). See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nocean_tide_fes(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric ocean tide height (FES solution)standard_name :sea_surface_height_amplitude_due_to_geocentric_ocean_tidesource :FES2014binstitution :LEGOS/NOVELTIS/CNES/CLSunits :mcomment :Includes the equilibrium long-period ocean tide height and only the short-period part of the corresponding loading tide. The permanent tide (zero frequency) is not included in this parameter because it is included in the geoid and mean sea surface (geoid, mean_sea_surface_cnescls). To get the total geocentric tide height (FES solution), do: ocean_tide_fes + ocean_tide_non_eq. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsolid_earth_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :solid earth tide heightstandard_name :sea_surface_height_amplitude_due_to_earth_tidesource :Cartwright and Edden [1973] Corrected tables of tidal harmonics - J. Geophys. J. R. Astr. Soc., 33, 253-264.units :mcomment :Calculated using Cartwright and Tayler tables and consisting of the second and third degree constituents. The permanent tide (zero frequency) is not included. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\npole_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric pole tide heightstandard_name :sea_surface_height_amplitude_due_to_pole_tidesource :Desai, S., Wahr, J. & Beckley, B. J Geod [2015] 89: 1233units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninternal_tide_hret(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :internal tide heightsource :E. D. Zaron. Baroclinic tidal sea level from exact-repeat mission altimetry. Journal of Physical Oceanography, 49(1):193-210, 2019.units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speedstandard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.06 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt_mle3(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speed (MLE3 retracking)standard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.109 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean_mle3) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_water_vapor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer water vapor contentstandard_name :atmosphere_water_vapor_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_cloud_liquid_water(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer liquid water contentstandard_name :atmosphere_cloud_liquid_water_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(Index([759929456.5671339, 759929457.6690049, 759929458.770874,\n 759929459.872746, 759929460.9746141, 759929462.0764852,\n 759929463.1783538, 759929464.2802248, 759929465.3820939,\n 759929466.4839649,\n ...\n 759960314.5902781, 759960315.6921468, 759960316.7940178,\n 759960317.8958869, 759960318.9977579, 759960320.099627,\n 759960321.201498, 759960322.3033671, 759960323.4052382,\n 759960324.5071082],\n dtype='float64', name='time', length=27927))Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nax.coastlines()\nplt.scatter(x=ds_nadir.longitude, y=ds_nadir.latitude, c=ds_nadir.depth_or_elevation, marker='.')\nplt.colorbar().set_label('Depth or Elevation (m)')", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#authenticate", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#authenticate", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Authenticate", - "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x16aa132c0>", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", + "title": "Download and Access L2 SWOT Oceanography Data", + "section": "3. SWOT Level 2 Radiometer Datasets", + "text": "3. SWOT Level 2 Radiometer Datasets\nOutlined below is a map of the different Radiometer Data Products we host at PO.DAAC, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can search and visualize this dataset in a workflow similar to the above datasets.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#search-and-access-sos-data", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#search-and-access-sos-data", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Search and Access SoS data", - "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" - ] - }, - { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#explore-the-sos", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#explore-the-sos", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Explore the SoS", - "text": "Explore the SoS\nWe can now explore the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n\n# Display the priors groups\nprint(\"Priors Groups:\")\nprint(priors.groups)\n\nPriors Groups:\n{'reaches': <class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches)\n groups: , 'nodes': <class 'netCDF4._netCDF4.Group'>\ngroup /nodes:\n dimensions(sizes): \n variables(dimensions): int64 node_id(num_nodes), int64 reach_id(num_nodes), float64 x(num_nodes), float64 y(num_nodes), <class 'str'> river_name(num_nodes)\n groups: , 'model': <class 'netCDF4._netCDF4.Group'>\ngroup /model:\n dimensions(sizes): num_months(12), probability(20)\n variables(dimensions): int32 num_months(num_months), int32 probability(probability), float64 flow_duration_q(num_reaches, probability), float64 max_q(num_reaches), float64 monthly_q(num_reaches, num_months), float64 mean_q(num_reaches), float64 min_q(num_reaches), float64 two_year_return_q(num_reaches), int32 area_estimate_flag(num_reaches)\n groups: , 'gbpriors': <class 'netCDF4._netCDF4.Group'>\ngroup /gbpriors:\n dimensions(sizes): \n variables(dimensions): \n groups: reach, node, 'EAU': <class 'netCDF4._netCDF4.Group'>\ngroup /EAU:\n dimensions(sizes): num_days(16130), num_months(12), probability(20), nchars(100), num_EAU_reaches(243)\n variables(dimensions): int32 num_days(num_days), int32 CAL(num_EAU_reaches), int32 EAU_reaches(num_EAU_reaches), int64 EAU_reach_id(num_EAU_reaches), float64 EAU_flow_duration_q(num_EAU_reaches, probability), float64 EAU_max_q(num_EAU_reaches), float64 EAU_monthly_q(num_EAU_reaches, num_months), float64 EAU_mean_q(num_EAU_reaches), float64 EAU_min_q(num_EAU_reaches), float64 EAU_two_year_return_q(num_EAU_reaches), |S1 EAU_id(num_EAU_reaches, nchars), float64 EAU_q(num_EAU_reaches, num_days), float64 EAU_qt(num_EAU_reaches, num_days)\n groups: , 'DEFRA': <class 'netCDF4._netCDF4.Group'>\ngroup /DEFRA:\n dimensions(sizes): num_days(16130), num_months(12), probability(20), nchars(100), num_DEFRA_reaches(26)\n variables(dimensions): int32 num_days(num_days), int32 CAL(num_DEFRA_reaches), int32 DEFRA_reaches(num_DEFRA_reaches), int64 DEFRA_reach_id(num_DEFRA_reaches), float64 DEFRA_flow_duration_q(num_DEFRA_reaches, probability), float64 DEFRA_max_q(num_DEFRA_reaches), float64 DEFRA_monthly_q(num_DEFRA_reaches, num_months), float64 DEFRA_mean_q(num_DEFRA_reaches), float64 DEFRA_min_q(num_DEFRA_reaches), float64 DEFRA_two_year_return_q(num_DEFRA_reaches), |S1 DEFRA_id(num_DEFRA_reaches, nchars), float64 DEFRA_q(num_DEFRA_reaches, num_days), float64 DEFRA_qt(num_DEFRA_reaches, num_days)\n groups: }\n\n\n\n# Display the module groups\nprint(\"Results Groups:\")\nprint(results.groups)\n\nResults Groups:\n{'reaches': <class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches), int32 observations(num_reaches), float64 time(num_reaches)\n groups: , 'nodes': <class 'netCDF4._netCDF4.Group'>\ngroup /nodes:\n dimensions(sizes): \n variables(dimensions): int64 node_id(num_nodes), int64 reach_id(num_nodes), float64 x(num_nodes), float64 y(num_nodes), <class 'str'> river_name(num_nodes), int32 observations(num_nodes), float64 time(num_nodes)\n groups: , 'hivdi': <class 'netCDF4._netCDF4.Group'>\ngroup /hivdi:\n dimensions(sizes): \n variables(dimensions): float64 Q(num_reaches), float64 A0(num_reaches), float64 beta(num_reaches), float64 alpha(num_reaches)\n groups: , 'metroman': <class 'netCDF4._netCDF4.Group'>\ngroup /metroman:\n dimensions(sizes): \n variables(dimensions): float64 allq(num_reaches), float64 A0hat(num_reaches), float64 nahat(num_reaches), float64 x1hat(num_reaches), float64 q_u(num_reaches)\n groups: , 'moi': <class 'netCDF4._netCDF4.Group'>\ngroup /moi:\n dimensions(sizes): \n variables(dimensions): \n groups: geobam, hivdi, metroman, momma, sad, sic4dvar, 'momma': <class 'netCDF4._netCDF4.Group'>\ngroup /momma:\n dimensions(sizes): \n variables(dimensions): float64 stage(num_reaches), float64 width(num_reaches), float64 slope(num_reaches), float64 Qgage(num_reaches), float64 seg(num_reaches), float64 n(num_reaches), float64 Y(num_reaches), float64 v(num_reaches), float64 Q(num_reaches), float64 Q_constrained(num_reaches), float64 gage_constrained(num_reaches), float64 input_Qm_prior(num_reaches), float64 input_Qb_prior(num_reaches), float64 input_Yb_prior(num_reaches), float64 input_known_ezf(num_reaches), float64 input_known_bkfl_stage(num_reaches), float64 input_known_nb_seg1(num_reaches), float64 input_known_x_seg1(num_reaches), float64 Qgage_constrained_nb_seg1(num_reaches), float64 Qgage_constrained_x_seg1(num_reaches), float64 input_known_nb_seg2(num_reaches), float64 input_known_x_seg2(num_reaches), float64 Qgage_constrained_nb_seg2(num_reaches), float64 Qgage_constrained_x_seg2(num_reaches), float64 n_bkfl_Qb_prior(num_reaches), float64 n_bkfl_slope(num_reaches), float64 vel_bkfl_Qb_prior(num_reaches), float64 Froude_bkfl_diag_Smean(num_reaches), float64 width_bkfl_solved_obs(num_reaches), float64 depth_bkfl_solved_obs(num_reaches), float64 depth_bkfl_diag_Wb_Smean(num_reaches), float64 zero_flow_stage(num_reaches), float64 bankfull_stage(num_reaches), float64 Qmean_prior(num_reaches), float64 Qmean_momma(num_reaches), float64 Qmean_momma.constrained(num_reaches), float64 width_stage_corr(num_reaches)\n groups: , 'neobam': <class 'netCDF4._netCDF4.Group'>\ngroup /neobam:\n dimensions(sizes): \n variables(dimensions): \n groups: r, logn, logDb, logWb, q, 'offline': <class 'netCDF4._netCDF4.Group'>\ngroup /offline:\n dimensions(sizes): \n variables(dimensions): float64 d_x_area(num_reaches), float64 d_x_area_u(num_reaches), float64 metro_q_c(num_reaches), float64 bam_q_c(num_reaches), float64 hivdi_q_c(num_reaches), float64 momma_q_c(num_reaches), float64 sads_q_c(num_reaches), float64 consensus_q_c(num_reaches), float64 metro_q_uc(num_reaches), float64 bam_q_uc(num_reaches), float64 hivdi_q_uc(num_reaches), float64 momma_q_uc(num_reaches), float64 sads_q_uc(num_reaches), float64 consensus_q_uc(num_reaches)\n groups: , 'postdiagnostics': <class 'netCDF4._netCDF4.Group'>\ngroup /postdiagnostics:\n dimensions(sizes): nchar(10)\n variables(dimensions): \n groups: basin, reach, 'prediagnostics': <class 'netCDF4._netCDF4.Group'>\ngroup /prediagnostics:\n dimensions(sizes): \n variables(dimensions): \n groups: reach, node, 'sad': <class 'netCDF4._netCDF4.Group'>\ngroup /sad:\n dimensions(sizes): \n variables(dimensions): float64 A0(num_reaches), float64 n(num_reaches), float64 Qa(num_reaches), float64 Q_u(num_reaches)\n groups: , 'sic4dvar': <class 'netCDF4._netCDF4.Group'>\ngroup /sic4dvar:\n dimensions(sizes): \n variables(dimensions): float64 A0(num_reaches), float64 n(num_reaches), float64 Q_mm(num_reaches), float64 Q_da(num_reaches)\n groups: , 'validation': <class 'netCDF4._netCDF4.Group'>\ngroup /validation:\n dimensions(sizes): num_algos(14), nchar(16)\n variables(dimensions): |S1 algo_names(num_reaches, num_algos, nchar), int32 has_validation(num_reaches), float64 nse(num_reaches, num_algos), float64 rsq(num_reaches, num_algos), float64 kge(num_reaches, num_algos), float64 rmse(num_reaches, num_algos), float64 testn(num_reaches, num_algos), float64 nrmse(num_reaches, num_algos), float64 nbias(num_reaches, num_algos), float64 rrmse(num_reaches, num_algos)\n groups: }", + "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#a-final-word", + "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#a-final-word", + "title": "Download and Access L2 SWOT Oceanography Data", + "section": "A final word…", + "text": "A final word…\nAccessing data completely in memory are affected by various things. Tools like xarray make a lot of assumptions about how to open and read a file. Sometimes the internals don’t fit the xarray ‘mould’ and we need to continue to work with data providers and software providers to make these two sides work together. Level 2 data (non-gridded), specifically, suffers from some of the assumptions made.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "Access & Visualization", + "SWOT Oceanography", + "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-river-reach-locations", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-river-reach-locations", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Plot river reach locations", - "text": "Plot river reach locations\nInformation about the spatial location of river reaches is in the reaches and nodes groups including river names. This data is taken directly from SWOT River Database (SWORD).\n\nreaches = results.groups['reaches'] # Access the reaches group\n\nprint(\"Reaches Group\")\nprint(reaches, \"\\n\")\n\nprint(\"Longitude\")\nprint(reaches.variables['x'])\n\nReaches Group\n<class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches), int32 observations(num_reaches), float64 time(num_reaches)\n groups: \n\nLongitude\n<class 'netCDF4._netCDF4.Variable'>\nfloat64 x(num_reaches)\n long_name: longitude\n comment: longitude of the reach center decimal ranging from 180°E to 180°W\n units: degrees_east\n valid_min: -180.0\n valid_max: 180.0\n coverage_content_type: coordinate\npath = /reaches\nunlimited dimensions: \ncurrent shape = (30768,)\nfilling on, default _FillValue of 9.969209968386869e+36 used\n\n\n\n# Unpack the spatial coordinates and river names\nreach_lon = results.groups['reaches'].variables['x']\nreach_lat = results.groups['reaches'].variables['y']\n\nriver_names = results.groups['reaches'].variables['river_name']\n\n# Filter data to only find the river of interest\nidx = np.where(river_names[:] == RIVER_NAME)\nprint(f\"Indexes for {RIVER_NAME}:\\n {idx}\")\n\nIndexes for Rhine:\n (array([12597, 12598, 12599, 12600, 12601, 12602, 12603, 12606, 12616,\n 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625,\n 12626, 12627, 12628, 12629, 12630, 12631, 12634, 12635, 12636,\n 12638, 12639, 12640, 12769, 12918, 12919, 12920, 12923, 12924,\n 12925, 12926, 12931, 12932, 12933, 12938, 12939, 12940, 12941,\n 12942, 12943, 12944, 13098, 13099, 13100, 13101, 13102, 13152,\n 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, 13161,\n 13162, 13163, 13164, 13165, 13166, 13168, 13169, 13170, 13172,\n 13173, 13174, 13175, 13176, 13177, 13178, 13179, 13180, 13181,\n 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190,\n 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 13199,\n 13200, 13201, 13202, 13204, 13205, 13206, 13207, 13208, 13316,\n 13317, 13319, 13324, 13325, 13326, 13327, 13328, 13329, 13330,\n 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13339, 13340,\n 13341, 13342, 13343, 13345, 13346, 13362, 13363, 13364, 13365,\n 13366, 13367, 13368, 13369, 13370, 13371, 13372, 13373, 13374,\n 13375, 13385]),)\n\n\n\n# Plot the location of the river\nfig = plt.figure(figsize=(10,10))\n\n# Add map elements gridlines\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.add_feature(cfeature.STATES, edgecolor='black')\n\ngl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=1, color='black', alpha=0.5, linestyle='--', draw_labels=True)\ngl.xlabels_top = False\ngl.ylabels_left = True\ngl.ylabels_right=False\ngl.xlines = True\n\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\n\n# Plot the river reach centerpoint locations\nax.scatter(reach_lon[idx], y=reach_lat[idx], color='c')\n\n# Add the title\nplt.title(f'{RIVER_NAME} Reach Centerpoint Locations')\n\nText(0.5, 1.0, 'Rhine Reach Centerpoint Locations')", + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "", + "text": "This tutorial only works in a jupyterhub hosted at AWS US-WEST-2." + }, + { + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#content", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#content", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "Content", + "text": "Content\n\nSpecify parameters\nThe following parameters are used for this particular dataset.\n\n#Short_name is used to identify a specific dataset in NASA Earthdata. \nshort_name='OISSS_L4_multimission_monthly_v1'" + }, + { + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#direct-s3-access", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#direct-s3-access", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "Direct S3 access", + "text": "Direct S3 access\nUse EarthData Login (EDL) to get a direct S3 access. Direct S3 access is only available to users running in AWS, us-west-2 region. All other access must come from HTTP requests for PO.DAAC data.\nCreate an EDL following this link.\nCreate a .netrc file in the home folder following these instructions.\n.netrc is essential to enable the following blocks.\n\ndef init_S3FileSystem():\n import requests,s3fs\n s3_cred_endpoint = {\n 'podaac':'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'lpdaac':'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials'}\n\n temp_creds_url = s3_cred_endpoint['podaac']\n creds = requests.get(temp_creds_url).json()\n s3 = s3fs.S3FileSystem(anon=False,\n key=creds['accessKeyId'],\n secret=creds['secretAccessKey'], \n token=creds['sessionToken'])\n return s3\ns3sys=init_S3FileSystem()" + }, + { + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#explore-the-file-system.", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#explore-the-file-system.", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "Explore the file system.", + "text": "Explore the file system.\n\nimport pprint\n\n#s3://podaac-ops-cumulus-protected is the PODAAC S3 bucket. \n#s3://podaac-ops-cumulus-protected/{short_name} is the path to this dataset. \n\n#This dataset is organized by year.\n\nyears=s3sys.glob(\"s3://podaac-ops-cumulus-protected/%s/*\"%short_name)\npprint.pprint(years)\n\nfor year in years:\n fns= s3sys.glob(year+\"/*nc\")\n print(\"Year %s: total files (granules) %i.\"%(year.split('/')[-1], len(fns)))\n\n['podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2011',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2012',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2013',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2014',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2015',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2016',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2017',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2018',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2019',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2020',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2021']\nYear 2011: total files (granules) 4.\nYear 2012: total files (granules) 12.\nYear 2013: total files (granules) 12.\nYear 2014: total files (granules) 12.\nYear 2015: total files (granules) 12.\nYear 2016: total files (granules) 12.\nYear 2017: total files (granules) 12.\nYear 2018: total files (granules) 12.\nYear 2019: total files (granules) 12.\nYear 2020: total files (granules) 12.\nYear 2021: total files (granules) 8.\n\n\n\nfns= s3sys.glob(\"s3://podaac-ops-cumulus-protected/%s/*/*nc\"%short_name)\nprint(\"Open all %i files.\"%len(fns))\n#pprint.pprint(fns)\n\nimport xarray as xr\n\nd=xr.open_dataset(s3sys.open(fns[0]))\nd\n\nOpen all 120 files.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 1)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 -179.4 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 -89.38 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-09-16\nData variables:\n sss (latitude, longitude, time) float32 ...\n sss_uncertainty (latitude, longitude, time) float32 ...\n sss_climatology (latitude, longitude, time) float32 ...\n sss_anomaly (latitude, longitude, time) float32 ...\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_v1_monthly\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: [0.25]\n geospatial_lat_units: degrees_north\n geospatial_lon_min: [-180.]\n geospatial_lon_max: [180.]\n geospatial_lon_resolution: [0.25]\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 1Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :[-180.]valid_max :[180.]coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :[-90.]valid_max :[90.]coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-09-16long_name :reference time of analyzed variable field corresponding to the center of the product time intervalstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-09-16T00:00:00.000000000'], dtype='datetime64[ns]')Data variables: (4)sss(latitude, longitude, time)float32...long_name :multi-mission OISSS monthly averagestandard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :physicalMeasurement[1036800 values with dtype=float32]sss_uncertainty(latitude, longitude, time)float32...long_name :estimated empirical uncertainty of multi-mission OISSS monthly averageunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]sss_climatology(latitude, longitude, time)float32...long_name :monthly climatological sea surface salinity based on multi-mission OISSS dataset from 09/2011 to 08/2021standard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]sss_anomaly(latitude, longitude, time)float32...long_name :sea surface salinity anomaly relative to the product-based monthly climatologyunits :1e-3valid_min :[-10.]valid_max :[10.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]Attributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity Global Dataset V1.0 MonthlyShort_Name :OISSS_L4_multimission_v1_monthlyVersion :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2022-02-15T02:49:51ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.eduPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2011month_of_observation :9center_day_of_observation :16time_coverage_start :2011-09-01T12:00:00Ztime_coverage_end :2011-09-30T12:00:00Ztime_coverage_resolution :P1Mcdm_data_type :gridgeospatial_lat_min :[-90.]geospatial_lat_max :[90.]geospatial_lat_resolution :[0.25]geospatial_lat_units :degrees_northgeospatial_lon_min :[-180.]geospatial_lon_max :[180.]geospatial_lon_resolution :[0.25]geospatial_lon_units :degrees_east" + }, + { + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-an-example", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-an-example", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "Plot an example", + "text": "Plot an example\n\nplt.figure(figsize=(15,5))\nd['sss'][:,:,0].plot(cmap=plt.cm.jet,vmin=30,vmax=37)\n\n\n\n\n\n\n\n\n\nimport pylab as plt\n\nfig,ax=plt.subplots(2,2,figsize=(20,10))\n\nvars=d.keys()\n\naxx=ax.flatten()\n\n#set the colorbar limit\nclim=[[30,37],[0,0.1],[30,37],[-1,1]]\n\nfor i,var in enumerate(vars):\n d[var][:,:,0].plot(ax=axx[i],cmap='jet',vmin=clim[i][0],vmax=clim[i][1])\n axx[i].set_title(var)\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nLoad all files to plot a time series\n\n%timeit\nfileset = [s3sys.open(file) for file in fns]\ndata = xr.open_mfdataset(fileset ,concat_dim='time',combine='nested',engine='h5netcdf')\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 120)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 -179.4 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 -89.38 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-09-16 2011-10-16 ... 2021-08-16\nData variables:\n sss (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_climatology (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_anomaly (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_v1_monthly\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: [0.25]\n geospatial_lat_units: degrees_north\n geospatial_lon_min: [-180.]\n geospatial_lon_max: [180.]\n geospatial_lon_resolution: [0.25]\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 120Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :[-180.]valid_max :[180.]coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :[-90.]valid_max :[90.]coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-09-16 ... 2021-08-16long_name :reference time of analyzed variable field corresponding to the center of the product time intervalstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-09-16T00:00:00.000000000', '2011-10-16T00:00:00.000000000',\n '2011-11-16T00:00:00.000000000', '2011-12-16T00:00:00.000000000',\n '2012-01-16T00:00:00.000000000', '2012-02-15T00:00:00.000000000',\n '2012-03-16T00:00:00.000000000', '2012-04-16T00:00:00.000000000',\n '2012-05-16T00:00:00.000000000', '2012-06-16T00:00:00.000000000',\n '2012-07-16T00:00:00.000000000', '2012-08-16T00:00:00.000000000',\n '2012-09-16T00:00:00.000000000', '2012-10-16T00:00:00.000000000',\n '2012-11-16T00:00:00.000000000', '2012-12-16T00:00:00.000000000',\n '2013-01-16T00:00:00.000000000', '2013-02-15T00:00:00.000000000',\n '2013-03-16T00:00:00.000000000', '2013-04-16T00:00:00.000000000',\n '2013-05-16T00:00:00.000000000', '2013-06-16T00:00:00.000000000',\n '2013-07-16T00:00:00.000000000', '2013-08-16T00:00:00.000000000',\n '2013-09-16T00:00:00.000000000', '2013-10-16T00:00:00.000000000',\n '2013-11-16T00:00:00.000000000', '2013-12-16T00:00:00.000000000',\n '2014-01-16T00:00:00.000000000', '2014-02-15T00:00:00.000000000',\n '2014-03-16T00:00:00.000000000', '2014-04-16T00:00:00.000000000',\n '2014-05-16T00:00:00.000000000', '2014-06-16T00:00:00.000000000',\n '2014-07-16T00:00:00.000000000', '2014-08-16T00:00:00.000000000',\n '2014-09-16T00:00:00.000000000', '2014-10-16T00:00:00.000000000',\n '2014-11-16T00:00:00.000000000', '2014-12-16T00:00:00.000000000',\n '2015-01-16T00:00:00.000000000', '2015-02-15T00:00:00.000000000',\n '2015-03-16T00:00:00.000000000', '2015-04-16T00:00:00.000000000',\n '2015-05-16T00:00:00.000000000', '2015-06-16T00:00:00.000000000',\n '2015-07-16T00:00:00.000000000', '2015-08-16T00:00:00.000000000',\n '2015-09-16T00:00:00.000000000', '2015-10-16T00:00:00.000000000',\n '2015-11-16T00:00:00.000000000', '2015-12-16T00:00:00.000000000',\n '2016-01-16T00:00:00.000000000', '2016-02-15T00:00:00.000000000',\n '2016-03-15T00:00:00.000000000', '2016-04-15T00:00:00.000000000',\n '2016-05-15T00:00:00.000000000', '2016-06-15T00:00:00.000000000',\n '2016-07-15T00:00:00.000000000', '2016-08-15T00:00:00.000000000',\n '2016-09-15T00:00:00.000000000', '2016-10-15T00:00:00.000000000',\n '2016-11-15T00:00:00.000000000', '2016-12-16T00:00:00.000000000',\n '2017-01-16T00:00:00.000000000', '2017-02-15T00:00:00.000000000',\n '2017-03-16T00:00:00.000000000', '2017-04-16T00:00:00.000000000',\n '2017-05-16T00:00:00.000000000', '2017-06-16T00:00:00.000000000',\n '2017-07-16T00:00:00.000000000', '2017-08-16T00:00:00.000000000',\n '2017-09-16T00:00:00.000000000', '2017-10-16T00:00:00.000000000',\n '2017-11-16T00:00:00.000000000', '2017-12-16T00:00:00.000000000',\n '2018-01-16T00:00:00.000000000', '2018-02-15T00:00:00.000000000',\n '2018-03-16T00:00:00.000000000', '2018-04-16T00:00:00.000000000',\n '2018-05-16T00:00:00.000000000', '2018-06-16T00:00:00.000000000',\n '2018-07-16T00:00:00.000000000', '2018-08-16T00:00:00.000000000',\n '2018-09-16T00:00:00.000000000', '2018-10-16T00:00:00.000000000',\n '2018-11-16T00:00:00.000000000', '2018-12-16T00:00:00.000000000',\n '2019-01-16T00:00:00.000000000', '2019-02-15T00:00:00.000000000',\n '2019-03-16T00:00:00.000000000', '2019-04-16T00:00:00.000000000',\n '2019-05-16T00:00:00.000000000', '2019-06-16T00:00:00.000000000',\n '2019-07-16T00:00:00.000000000', '2019-08-16T00:00:00.000000000',\n '2019-09-16T00:00:00.000000000', '2019-10-16T00:00:00.000000000',\n '2019-11-16T00:00:00.000000000', '2019-12-16T00:00:00.000000000',\n '2020-01-16T00:00:00.000000000', '2020-02-15T00:00:00.000000000',\n '2020-03-15T00:00:00.000000000', '2020-04-15T00:00:00.000000000',\n '2020-05-15T00:00:00.000000000', '2020-06-15T00:00:00.000000000',\n '2020-07-15T00:00:00.000000000', '2020-08-15T00:00:00.000000000',\n '2020-09-15T00:00:00.000000000', '2020-10-15T00:00:00.000000000',\n '2020-11-15T00:00:00.000000000', '2020-12-16T00:00:00.000000000',\n '2021-01-16T00:00:00.000000000', '2021-02-15T00:00:00.000000000',\n '2021-03-16T00:00:00.000000000', '2021-04-16T00:00:00.000000000',\n '2021-05-16T00:00:00.000000000', '2021-06-16T00:00:00.000000000',\n '2021-07-16T00:00:00.000000000', '2021-08-16T00:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (4)sss(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :multi-mission OISSS monthly averagestandard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSS monthly averageunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_climatology(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :monthly climatological sea surface salinity based on multi-mission OISSS dataset from 09/2011 to 08/2021standard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_anomaly(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :sea surface salinity anomaly relative to the product-based monthly climatologyunits :1e-3valid_min :[-10.]valid_max :[10.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nAttributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity Global Dataset V1.0 MonthlyShort_Name :OISSS_L4_multimission_v1_monthlyVersion :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2022-02-15T02:49:51ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.eduPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2011month_of_observation :9center_day_of_observation :16time_coverage_start :2011-09-01T12:00:00Ztime_coverage_end :2011-09-30T12:00:00Ztime_coverage_resolution :P1Mcdm_data_type :gridgeospatial_lat_min :[-90.]geospatial_lat_max :[90.]geospatial_lat_resolution :[0.25]geospatial_lat_units :degrees_northgeospatial_lon_min :[-180.]geospatial_lon_max :[180.]geospatial_lon_resolution :[0.25]geospatial_lon_units :degrees_east" + }, + { + "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-a-time-series-at-a-point-in-the-california-current.", + "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-a-time-series-at-a-point-in-the-california-current.", + "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", + "section": "Plot a time series at a point in the california current.", + "text": "Plot a time series at a point in the california current.\nPlot the time series of the SSS at (124W, 35N).\n\nplt.figure(figsize=(16,4))\ndata['sss'].interp(latitude=35,longitude=-124).plot()" + }, + { + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#in-aws-cloud-version", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#in-aws-cloud-version", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "In AWS Cloud Version", + "text": "In AWS Cloud Version\n\nAuthor: Nicholas Tarpinian, PO.DAAC", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#navigating-reaches-and-nodes", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#navigating-reaches-and-nodes", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Navigating Reaches and Nodes", - "text": "Navigating Reaches and Nodes\nThe SoS is organized by continent following the conventions set in the SWOT River Database for the NetCDF file format. Reach identifiers can be found in the “reaches” group and node identifiers can be found in the “nodes” group. The following sections show you how to locate reaches and nodes by river name which allows you to index into the reach and/or node level data.\nHow to locate reach and node identifiers by river name\nYou can search for a river name using the same convention as used when plotting river reach locations to obtain the reach identifiers for that river. You can then use the reach identifiers to locate the nodes that belong to each reach for that river as the nodes are indexed on a different dimension (num_nodes) than reaches (num_reaches).\n\n# Locate the indexes for the specific river you are interested in\nriver_names = results['reaches']['river_name'][:]\nreach_idx = np.where(river_names[:] == RIVER_NAME)\n\n# Locate the reach identifiers for the river name\nreach_identifiers = results['reaches']['reach_id'][reach_idx]\n\n# Locate the reach identifiers of interest on the node-level\nreach_node_identifiers = results['nodes']['reach_id'][:]\nnode_idx = []\nfor reach_identifier in reach_identifiers:\n node_idx.extend(np.where(reach_node_identifiers == reach_identifier)[0])\n\n# Locate the node identifiers of interest using the reach identifiers to index\nnode_identifiers = results['nodes']['node_id'][:]\nprint(f\"Node identifiers: {node_identifiers}\")\n\nNode identifiers: [21101200010013 21101200010023 21101200010033 ... 29690900020221\n 29690900020231 29690900030746]\n\n\n\n# Unpack the spatial coordinates on the node level and index to values of interest\nnode_lon = results['nodes']['x'][node_idx]\nnode_lat = results['nodes']['y'][node_idx]\nprint(f\"Longitude #: {node_lon.shape}\")\nprint(f\"Latitude #: {node_lat.shape}\")\n\nLongitude #: (4620,)\nLatitude #: (4620,)\n\n\n\n# Plot the nodes\nfig = plt.figure(figsize=(10,10))\n\n# Add map elements gridlines\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.add_feature(cfeature.STATES, edgecolor='black')\n\ngl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=1, color='black', alpha=0.5, linestyle='--', draw_labels=True)\ngl.xlabels_top = False\ngl.ylabels_left = True\ngl.ylabels_right=False\ngl.xlines = True\n\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\n\n# Plot the river reach centerpoint locations\nax.scatter(x=node_lon, y=node_lat)\n\n# Add the title\nplt.title(f'{RIVER_NAME} Node Centerpoint Locations')\n\nText(0.5, 1.0, 'Rhine Node Centerpoint Locations')", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#summary-learning-objectives", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#summary-learning-objectives", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Summary & Learning Objectives", + "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with OPERA DSWx data in the cloud\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on users choice; either by classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’), etc.\nVisualizing the dataset based on its classified layer values.\nMosaicking multiple layers into a single layer.\nUtilizing Change Detection for further analysis.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-discharge-timeseries", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-discharge-timeseries", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Plot Discharge Timeseries", - "text": "Plot Discharge Timeseries\nThe main data of interest in the results files is the timeseries of river discharge (q) estimates produced by each module. The SoS is a global dataset organized by continents and not every reach will have an associated discharge for each module. So it is helpful to filter out missing values in order to isolate and visualize discharge for the various modules.\n\nHow to locate data amongst missing values\nYou can use the missing_value NetCDF variable attribute to locate the value used to indicate missing data. You can then filter on that value to isolate the time steps with discharge estimates. The following example uses the HiVDI algorithm results to demonstrate filtering missing values and plotting discharge.\n\n# Retrieve discharge from discharge algorithm group\ndischarge_algo_q = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][:]\n\n# Save the missing value\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\n\n# Loop through each reach and filter out places where the missing value is present\ndata_indexes = []\nfor i in range(discharge_algo_q.shape[0]):\n if discharge_algo_q[i].shape[0] > 1:\n if np.any(discharge_algo_q[i] != missing): data_indexes.append(i) # For multiple time steps with non-missing values\n if discharge_algo_q[i].shape[0] == 1 and discharge_algo_q[i] != missing: data_indexes.append(i) # For one time step with non-missing value\n\n# Display the numeric indexes where discharge data is present\nprint(f\"10 indexes for locations that have values:\\n {data_indexes[:10]}\")\n\n10 indexes for locations that have values:\n [12635, 12636, 12639, 12769, 12773, 12919, 12922, 12925, 12930, 12931]\n\n\n\nreach_identifiers = results['reaches']['reach_id'][data_indexes]\nprint(f\"10 reach identifiers for locations that have values:\\n {reach_identifiers[:10]}\")\n\n10 reach identifiers for locations that have values:\n [23261000571 23261000581 23261000631 23262000011 23262000051 23263000021\n 23263000051 23263000081 23263000131 23263000141]\n\n\nYou can now use the data indexes to retrieve location, time, and river name data about the reaches that have discharge data.\n\n# Review what river names are present in the data\nprint(\"10 River Names\")\nprint(river_names[data_indexes[:10]])\n\nriver_indexes = np.where(river_names == RIVER_NAME)\nprint(f\"\\nIndexes for the {RIVER_NAME}\")\nprint(river_indexes)\n\n# Locate overlap\noverlap_indexes = np.intersect1d(data_indexes, river_indexes)\nprint(f\"\\nOverlapping indexes for the {RIVER_NAME} with {DISCHARGE_ALGORITHM.upper()} Discharge data\")\nprint(overlap_indexes)\n\n10 River Names\n['Rhine' 'Rhine' 'Rhine' 'Rhine' 'Mosel' 'Rhine' 'Lahn; Rhine' 'Rhine'\n 'Lahn' 'Rhine']\n\nIndexes for the Rhine\n(array([12597, 12598, 12599, 12600, 12601, 12602, 12603, 12606, 12616,\n 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625,\n 12626, 12627, 12628, 12629, 12630, 12631, 12634, 12635, 12636,\n 12638, 12639, 12640, 12769, 12918, 12919, 12920, 12923, 12924,\n 12925, 12926, 12931, 12932, 12933, 12938, 12939, 12940, 12941,\n 12942, 12943, 12944, 13098, 13099, 13100, 13101, 13102, 13152,\n 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, 13161,\n 13162, 13163, 13164, 13165, 13166, 13168, 13169, 13170, 13172,\n 13173, 13174, 13175, 13176, 13177, 13178, 13179, 13180, 13181,\n 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190,\n 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 13199,\n 13200, 13201, 13202, 13204, 13205, 13206, 13207, 13208, 13316,\n 13317, 13319, 13324, 13325, 13326, 13327, 13328, 13329, 13330,\n 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13339, 13340,\n 13341, 13342, 13343, 13345, 13346, 13362, 13363, 13364, 13365,\n 13366, 13367, 13368, 13369, 13370, 13371, 13372, 13373, 13374,\n 13375, 13385]),)\n\nOverlapping indexes for the Rhine with HIVDI Discharge data\n[12635 12636 12639 12769 12919 12925 12931 12932 12933 12938 12939 12940\n 12941 12942 12943 13098 13099 13100 13101 13102 13152 13153 13154 13155\n 13156 13157 13158 13159 13161 13162 13163 13164 13165 13168 13169 13174\n 13178 13180 13181 13189 13190 13191 13193 13195 13197 13207]\n\n\n\n# Select the first reach from the overlapping indexes\ndata_index = overlap_indexes[0]\n\n# Locate the reach identifier\nreach_id = reaches['reach_id'][data_index]\nprint(f\"{RIVER_NAME} reach identifier to plot: {reach_id}\")\n\n# Retrieve discharge\ndischarge_algo_q = discharge_algo_q[data_index]\nprint(f\"\\nDischarge for {RIVER_NAME} reach identifier # {reach_id}\")\nprint(discharge_algo_q)\n\n# Retrieve time\ntime = results['reaches']['time'][data_index]\nprint(f\"\\nTime for {RIVER_NAME} reach identifier # {reach_id}\")\nprint(results['reaches']['time'][data_index])\n\nRhine reach identifier to plot: 23261000571\n\nDischarge for Rhine reach identifier # 23261000571\n[-1.00000000e+12 -1.00000000e+12 -1.00000000e+12 -1.00000000e+12\n -1.00000000e+12 -1.00000000e+12 -1.00000000e+12 -1.00000000e+12\n -1.00000000e+12 5.40782194e+01 4.99487494e+01 3.42913882e+01\n 3.44913537e+01]\n\nTime for Rhine reach identifier # 23261000571\n[7.34223036e+08 7.34308874e+08 7.34394712e+08 7.34909740e+08\n 7.34995578e+08 7.35081416e+08 7.35167254e+08 7.35253092e+08\n 7.35338929e+08 7.35510605e+08 7.35596443e+08 7.35682281e+08\n 7.35768119e+08]\n\n\n\n# Transform time to correct format\nswot_ts = datetime.datetime(2000,1,1,0,0,0)\nmissing_time = results['reaches']['time'].missing_value\ntime_str = []\nfor t in time:\n if t == missing_time: \n time_str.append('NO_DATA')\n else:\n time_str.append((swot_ts + datetime.timedelta(seconds=t)).strftime('%Y-%m-%dT%H:%M:%S'))\ntime_str = np.array(time_str)\nprint(f\"Formatted time: {time_str}\")\n\nFormatted time: ['2023-04-07T22:50:35' '2023-04-08T22:41:13' '2023-04-09T22:31:52'\n '2023-04-15T21:35:40' '2023-04-16T21:26:18' '2023-04-17T21:16:56'\n '2023-04-18T21:07:33' '2023-04-19T20:58:11' '2023-04-20T20:48:49'\n '2023-04-22T20:30:05' '2023-04-23T20:20:43' '2023-04-24T20:11:21'\n '2023-04-25T20:01:58']\n\n\n\n# Filter any missing values out of reach identifier discharge and time\nmissing_reach_index = np.where(discharge_algo_q != missing)\n\ndischarge_algo_q = discharge_algo_q[missing_reach_index]\nprint(f\"Discharge for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(discharge_algo_q)\n\ntime_str = time_str[missing_reach_index]\nprint(f\"\\nTime for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(time_str)\n\nDischarge for Rhine reach identfier # 23261000571\n[54.07821944 49.94874936 34.29138816 34.49135369]\n\nTime for Rhine reach identfier # 23261000571\n['2023-04-22T20:30:05' '2023-04-23T20:20:43' '2023-04-24T20:11:21'\n '2023-04-25T20:01:58']\n\n\n\n# Plot Discharge for the River Reach Identifier\n\n# Set up plot\nfig = plt.figure(figsize=(10,5))\nax1 = plt.subplot(311)\n\n# Plot data\nax1.scatter(time_str, discharge_algo_q)\nax1.plot(time_str, discharge_algo_q)\n\n# Define labels and title\nax1.set_ylabel('Discharge')\nax1.set_xlabel('Time')\nplt.xticks(rotation = 45)\n\nplt.suptitle(f\"Discharge Timeseries from HIVDI for the Ohio River reach identifier: {reach_id}.\")\n\nText(0.5, 0.98, 'Discharge Timeseries from HIVDI for the Ohio River reach identifier: 23261000571.')", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#requirements", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#requirements", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can only be run in the following environment: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via and s3fs session; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport Packages\n\nimport os\nimport requests \nimport json\nimport boto3\nimport s3fs\nfrom osgeo import gdal\nimport rasterio as rio\nfrom rasterio.plot import show\nfrom rasterio.merge import merge\nfrom rasterio.io import MemoryFile\nimport matplotlib.pyplot as plt\nfrom matplotlib.patches import Patch\nfrom mpl_toolkits.axes_grid1.inset_locator import inset_axes\nfrom mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes \nfrom mpl_toolkits.axes_grid1.inset_locator import mark_inset\nimport numpy as np\nfrom pathlib import Path\nfrom urllib.request import urlretrieve\nfrom json import dumps\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plotting-integrator-results-for-comparison", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plotting-integrator-results-for-comparison", - "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", - "section": "Plotting integrator results for comparison", - "text": "Plotting integrator results for comparison\nThe SoS contains reach-level Flow Law Parameter (FLPE) algorithms: HiVDI, neoBAM, MetroMan, MOMMA, SAD, SIC4DVar that produce discharge estimates using SWOT observations, SoS Priors and SWORD data. It can be helpful to compare the reach-level FLPEs to the discharge values produced by the Mean Optimization Integrator (MOI). The MOI takes SWOT observation data and reach-level FLPE output and integrates the results. It uses river topology to force mass conservation and also defined uncertainty.\n\n# Locate MOI discharge results for discharge algorithm making sure to filter out missing values\nmoi_q = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"][data_index]\nmoi_q = moi_q[missing_reach_index]\n\nprint(f\"{DISCHARGE_ALGORITHM.upper()} MOI Discharge for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(moi_q)\n\nHIVDI MOI Discharge for Rhine reach identfier # 23261000571\n[0.0009796 0.00062748 0.00012596 0.00014881]\n\n\n\n# Plot discharge algorithm alongside MOI discharge\n\n# Discharge algorithm Q\nplt.scatter(time_str, discharge_algo_q)\nplt.plot(time_str, discharge_algo_q, label=f\"{DISCHARGE_ALGORITHM.upper()}\")\n\n# MOI Q\nplt.scatter(time_str, moi_q)\nplt.plot(time_str, moi_q, label=\"MOI\")\n\nplt.suptitle(f\"Discharge Timeseries from HIVDI for the {RIVER_NAME} reach identifier: {reach_id}.\")\nplt.legend()\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nClose dataset and file handler references\n\npriors.close()\nresults.close()\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#authentication-with-earthaccess", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#authentication-with-earthaccess", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOTHR_localmachine.html#accessing-and-visualizing-swot-datasets", - "href": "notebooks/datasets/SWOTHR_localmachine.html#accessing-and-visualizing-swot-datasets", - "title": "SWOT Hydrology Dataset Exploration on a local machine", - "section": "Accessing and Visualizing SWOT Datasets", - "text": "Accessing and Visualizing SWOT Datasets\n\nRequirement:\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\nLearning Objectives:\n\nAccess SWOT HR data products (archived in NASA Earthdata Cloud) by downloading to local machine\nVisualize accessed data for a quick check\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nRiver Vector Shapefile - SWOT_L2_HR_RIVERSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LAKESP_2.0\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\nSingle Look Complex Data product - SWOT_L1B_HR_SLC_2.0\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Feb 2024) || Other Contributors: Zoe Walschots (PO.DAAC Summer Intern 2023), Catalina Taglialatela (NASA PO.DAAC), Luis Lopez (NASA NSIDC DAAC), Brent Williams (NASA JPL)\nLast updated: 9 July 2024\n\n\n\nLibraries Needed\n\nimport glob\nimport h5netcdf\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport contextily as cx\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport zipfile\nimport earthaccess\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nSingle File Access\n\n1. River Vector Shapefiles\nThe https access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to manually search in a GUI interface.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for the data of interest\n\n#Retrieves granule from the day we want, in this case by passing to `earthdata.search_data` function the data collection shortname, temporal bounds, and filter by wildcards\nriver_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*Reach*_287_NA*') # here we filter by Reach files (not node), pass=287, continent code=NA\n\nGranules found: 8\n\n\n\n\nDowload, unzip, read the data\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([river_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_RiverSP_Reach_010_287_NA_20240204T060400_20240204T060409_PIC0_01.zip']\n\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we must first extract the data to open it. First, we’ll programmatically get the filename we just downloaded, and then extract all data to the data_downloads folder.\n\nfilename = earthaccess.results.DataGranule.data_links(river_results[0], access='external')\nfilename = filename[0].split(\"/\")[-1]\nfilename\n\n'SWOT_L2_HR_RiverSP_Reach_010_287_NA_20240204T060400_20240204T060409_PIC0_01.zip'\n\n\n\nwith zipfile.ZipFile(f'data_downloads/{filename}', 'r') as zip_ref:\n zip_ref.extractall('data_downloads')\n\nOpen the shapefile using geopandas\n\nfilename_shp = filename.replace('.zip','.shp')\n\n\nSWOT_HR_shp1 = gpd.read_file(f'data_downloads/{filename_shp}') \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n71224800093\n-1.000000e+12\n-1.000000e+12\nno_data\n48.724265\n-92.406254\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n232341.227\n90\n47778.423\n18013.132474\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.51093 48.70847, -92.51052 48.7...\n\n\n1\n71224800101\n-1.000000e+12\n-1.000000e+12\nno_data\n48.739159\n-92.290054\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n767.700\n6\n48958.712\n1180.288364\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.29723 48.73905, -92.29682 48.7...\n\n\n2\n71224800114\n-1.000000e+12\n-1.000000e+12\nno_data\n48.743344\n-92.283320\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n2911.208\n3\n49549.648\n590.936467\n-1.000000e+12\n23000\n2\n1\n0\nLINESTRING (-92.28569 48.74125, -92.28495 48.7...\n\n\n3\n71224800123\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:10Z\n48.751442\n-92.242669\nno_data\n3.585147e+02\n2.006910e+00\n2.004890e+00\n...\n57688.777\n31\n55684.066\n6134.417666\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.28196 48.74559, -92.28163 48.7...\n\n\n4\n71224800133\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:10Z\n48.762334\n-92.189341\nno_data\n3.579681e+02\n1.451600e-01\n1.138900e-01\n...\n20821.463\n13\n58222.719\n2538.653439\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-92.20553 48.75837, -92.20512 48.7...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n1058\n77127000061\n7.603418e+08\n7.603419e+08\n2024-02-04T06:04:09Z\n18.050684\n-98.761645\nno_data\n6.529558e+02\n1.000896e+02\n1.000896e+02\n...\n784.041\n67\n667747.660\n13493.202300\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.81280 18.06539, -98.81280 18.0...\n\n\n1059\n77127000071\n-1.000000e+12\n-1.000000e+12\nno_data\n17.981704\n-98.686712\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n824.145\n97\n687123.984\n19376.324005\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-98.71239 18.03246, -98.71239 18.0...\n\n\n1060\n77127000131\n7.603418e+08\n7.603419e+08\n2024-02-04T06:04:09Z\n18.102586\n-98.771552\nno_data\n6.576003e+02\n1.240586e+02\n1.240586e+02\n...\n281.012\n77\n683164.834\n15417.173639\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.81280 18.06539, -98.81280 18.0...\n\n\n1061\n77127000141\n-1.000000e+12\n-1.000000e+12\nno_data\n18.094132\n-98.694466\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n414.760\n54\n693896.634\n10731.799933\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.71770 18.11625, -98.71764 18.1...\n\n\n1062\n77127000151\n-1.000000e+12\n-1.000000e+12\nno_data\n18.097046\n-98.657280\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n436.883\n54\n704624.208\n10727.574606\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.66628 18.07224, -98.66611 18.0...\n\n\n\n\n1063 rows × 127 columns\n\n\n\n\n\nQuickly plot the SWOT river data\n\n# Simple plot\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp1.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=SWOT_HR_shp1.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\n\n# Another way to plot geopandas dataframes is with `explore`, which also plots a basemap\n#SWOT_HR_shp1.explore()\n\n\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for data of interest\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*Prior*_287_NA*') # here we filter by files with 'Prior' in the name (This collection has three options: Obs, Unassigned, and Prior), pass 287 and continent code=NA\n\nGranules found: 8\n\n\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([lake_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.07 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.zip']\n\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we must first extract the data to open it. First, we’ll programmatically get the filename we just downloaded, and then extract all data to the SWOT_downloads folder.\n\nfilename2 = earthaccess.results.DataGranule.data_links(lake_results[0], access='external')\nfilename2 = filename2[0].split(\"/\")[-1]\nfilename2\n\n'SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.zip'\n\n\n\nwith zipfile.ZipFile(f'data_downloads/{filename2}', 'r') as zip_ref:\n zip_ref.extractall('data_downloads')\n\nOpen the shapefile using geopandas\n\nfilename_shp2 = filename2.replace('.zip','.shp')\nfilename_shp2\n\n'SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.shp'\n\n\n\nSWOT_HR_shp2 = gpd.read_file(f'data_downloads/{filename_shp2}') \n\n#view the attribute table\nSWOT_HR_shp2\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n0\n7120822822\nno_data\n712239R999998\n99\n1\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:08Z\n5.281870e+02\n1.500000e-02\n...\nno_data\n-99999999\n-91.557528\n47.616292\n-1.000000e+12\n1.038600\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-91.56583 47.61200, -91.56589 ...\n\n\n1\n7120822902\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-91.623241\n47.756499\n-1.000000e+12\n0.113400\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n2\n7120822932\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nTONY LAKE\n-99999999\n-91.635242\n47.726123\n-1.000000e+12\n0.017100\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n3\n7120822982\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-91.665522\n47.705366\n-1.000000e+12\n0.026100\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n4\n7120823182\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nHEART LAKE\n-99999999\n-91.651807\n47.769148\n-1.000000e+12\n0.124200\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n65495\n7130133552\nno_data\n713244L999972;713244L000002\n73;2\n2\n7.603424e+08\n7.603424e+08\n2024-02-04T06:14:01Z\n3.926960e+02\n5.900000e-02\n...\nno_data\n-99999999\n-90.889026\n50.669027\n-1.000000e+12\n0.695690\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-90.89210 50.67709, -90.89185 50.677...\n\n\n65496\n7130141612\nno_data\n713245L999974;713245L000001\n31;5\n2\n7.603424e+08\n7.603425e+08\n2024-02-04T06:14:08Z\n3.741850e+02\n8.200000e-02\n...\nLAKE ST JOSEPH;ST JOSEPH\n-99999999\n-90.750682\n51.061383\n-1.000000e+12\n0.256500\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-90.75251 51.06305, -90.75228 ...\n\n\n65497\n7420206383\n74226000013;74227100043;74227100013;7422710006...\n742214L000175;742214L999934;742214L000500;7422...\n64;23;0;0\n4\n7.603421e+08\n7.603422e+08\n2024-02-04T06:09:01Z\n1.875740e+02\n1.000000e-03\n...\nLAKE TEXOMA\n1135\n-96.688976\n33.901142\n-1.000000e+12\n257.028517\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-96.70899 33.82534, -96.70885 ...\n\n\n65498\n7420280413\n74246000423;74246000413;74246000404\n742218L999996;742218L001654;742219L999885\n4;0;0\n3\n7.603422e+08\n7.603422e+08\n2024-02-04T06:09:48Z\n1.941800e+02\n2.100000e-02\n...\nOOLAGAHL LAKE;OOLOGAH LAKE\n1032\n-95.593848\n36.550604\n-1.000000e+12\n123.796498\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-95.67217 36.43803, -95.67157 ...\n\n\n65499\n7710056183\n77125000273;77125000263;77125000283;7712500030...\n771186L999995;771186L000013;771186L999993\n12;1;0\n3\n7.603419e+08\n7.603419e+08\n2024-02-04T06:04:22Z\n4.586500e+02\n3.400000e-02\n...\nPRESA EL CARACOL\n1384\n-99.861530\n17.975030\n-1.000000e+12\n35.410155\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-99.75753 18.02115, -99.75739 ...\n\n\n\n\n65500 rows × 51 columns\n\n\n\n\n\nQuickly plot the SWOT lakes data\n\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp2.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=SWOT_HR_shp2.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\nAccessing the remaining files is different than the shp files above. We do not need to extract the shapefiles from a zip file because the following SWOT HR collections are stored in netCDF files in the cloud. For the rest of the products, we will open via xarray, not geopandas.\n\n\n3. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n temporal = ('2024-01-25 00:00:00', '2024-05-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 27\n\n\nLet’s download one data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([pixc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.37 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXC_*.nc\", group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 3959179, complex_depth: 2,\n num_pixc_lines: 3278)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(3959179, 2), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3278\n interferogram_size_range: 5718\n looks_to_efflooks: 1.550665505987333\n num_azimuth_looks: 7.0\n azimuth_offset: 6xarray.DatasetDimensions:points: 3959179complex_depth: 2num_pixc_lines: 3278Coordinates: (2)latitude(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(3959179, 2), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179, 2)\n(3959179, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 3959179\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3278interferogram_size_range :5718looks_to_efflooks :1.550665505987333num_azimuth_looks :7.0azimuth_offset :6\n\n\n\n\nFor plotting PIXC using classification and quality flags\n\n# mask to get good water pixels\nmask = np.where(np.logical_and(ds_PIXC.classification > 2, ds_PIXC.geolocation_qual <28800)) \n#For more conservative filtering, use ds_PIXC.geolocation_qual <4 to also remove suspect values \n\nplt.scatter(x=ds_PIXC.longitude[mask], y=ds_PIXC.latitude[mask], c=ds_PIXC.height[mask])\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\n\nSearch for data of interest\n\n#Let's plot the same pass and tile as the above\npixcvec_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXCVEC_2.0', \n granule_name = '*010_106_086R*') #The same cycle, pass and tile as previously downloaded\n\nGranules found: 1\n\n\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([pixcvec_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.29 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXCVec_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data using xarray\nFirst, we’ll programmatically get the filename we just downloaded and then view the file via xarray.\n\nds_PIXCVEC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXCVec_*.nc\", decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 3959179, nchar_reach_id: 11,\n nchar_node_id: 14, nchar_lake_id: 10,\n nchar_obs_id: 13)\nDimensions without coordinates: points, nchar_reach_id, nchar_node_id,\n nchar_lake_id, nchar_obs_id\nData variables:\n azimuth_index (points) int32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n range_index (points) int32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n latitude_vectorproc (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n longitude_vectorproc (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n height_vectorproc (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n reach_id (points, nchar_reach_id) |S1 dask.array<chunksize=(3959179, 11), meta=np.ndarray>\n node_id (points, nchar_node_id) |S1 dask.array<chunksize=(3959179, 14), meta=np.ndarray>\n lake_id (points, nchar_lake_id) |S1 dask.array<chunksize=(3959179, 10), meta=np.ndarray>\n obs_id (points, nchar_obs_id) |S1 dask.array<chunksize=(3959179, 13), meta=np.ndarray>\n ice_clim_f (points) int8 dask.array<chunksize=(3959179,), meta=np.ndarray>\n ice_dyn_f (points) int8 dask.array<chunksize=(3959179,), meta=np.ndarray>\nAttributes: (12/45)\n Conventions: CF-1.7\n title: Level 2 KaRIn high rate pixel cloud vect...\n short_name: L2_HR_PIXCVec\n institution: CNES\n source: Level 1B KaRIn High Rate Single Look Com...\n history: 2024-02-02T11:20:25.557946Z: Creation\n ... ...\n xref_prior_river_db_file: \n xref_prior_lake_db_file: SWOT_LakeDatabase_Nom_106_20000101T00000...\n xref_reforbittrack_files: SWOT_RefOrbitTrackTileBoundary_Nom_20000...\n xref_param_l2_hr_laketile_file: SWOT_Param_L2_HR_LakeTile_20000101T00000...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805xarray.DatasetDimensions:points: 3959179nchar_reach_id: 11nchar_node_id: 14nchar_lake_id: 10nchar_obs_id: 13Coordinates: (0)Data variables: (11)azimuth_index(points)int32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nrange_index(points)int32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlatitude_vectorproc(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation latitudestandard_name :latitudeunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Height-constrained geodetic latitude of the pixel. Units are in degrees north of the equator.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlongitude_vectorproc(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation longitudestandard_name :longitudeunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Height-constrained geodetic longitude of the pixel. Positive=degrees east of the Greenwich meridian. Negative=degrees west of the Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight_vectorproc(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.96921e+36long_name :height above reference ellipsoidunits :mvalid_min :-1500.0valid_max :15000.0coordinates :longitude_vectorproc latitude_vectorproccomment :Height-constrained height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nreach_id(points, nchar_reach_id)|S1dask.array<chunksize=(3959179, 11), meta=np.ndarray>long_name :identifier of the associated prior river reachcoordinates :longitude_vectorproc latitude_vectorproccomment :Unique reach identifier from the prior river database. The format of the identifier is CBBBBBRRRRT, where C=continent, B=basin, R=reach, T=type.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n43.55 MB\n43.55 MB\n\n\nShape\n(3959179, 11)\n(3959179, 11)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 11 3959179\n\n\n\n\nnode_id(points, nchar_node_id)|S1dask.array<chunksize=(3959179, 14), meta=np.ndarray>long_name :identifier of the associated prior river nodecoordinates :longitude_vectorproc latitude_vectorproccomment :Unique node identifier from the prior river database. The format of the identifier is CBBBBBRRRRNNNT, where C=continent, B=basin, R=reach, N=node, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n55.43 MB\n55.43 MB\n\n\nShape\n(3959179, 14)\n(3959179, 14)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 14 3959179\n\n\n\n\nlake_id(points, nchar_lake_id)|S1dask.array<chunksize=(3959179, 10), meta=np.ndarray>long_name :identifier of the associated prior lakecoordinates :longitude_vectorproc latitude_vectorproccomment :Identifier of the lake from the lake prior database) associated to the pixel. The format of the identifier is CBBNNNNNNT, where C=continent, B=basin, N=counter within the basin, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.59 MB\n39.59 MB\n\n\nShape\n(3959179, 10)\n(3959179, 10)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 10 3959179\n\n\n\n\nobs_id(points, nchar_obs_id)|S1dask.array<chunksize=(3959179, 13), meta=np.ndarray>long_name :identifier of the observed featurecoordinates :longitude_vectorproc latitude_vectorproccomment :Tile-specific identifier of the observed feature associated to the pixel. The format of the identifier is CBBTTTSNNNNNN, where C=continent, B=basin, T=tile number, S=swath side, N=lake counter within the PIXC tile.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.47 MB\n51.47 MB\n\n\nShape\n(3959179, 13)\n(3959179, 13)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 13 3959179\n\n\n\n\nice_clim_f(points)int8dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :127long_name :climatological ice cover flagflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the surface is not ice covered, may or may not be partially or fully ice covered, and fully ice covered, respectively. A value of 127 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.96 MB\n3.96 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint8\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nice_dyn_f(points)int8dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :127long_name :dynamical ice cover flagflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Dynamic ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the surface is not ice covered, partially ice covered, and fully ice covered, respectively. A value of 255 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.96 MB\n3.96 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint8\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nIndexes: (0)Attributes: (45)Conventions :CF-1.7title :Level 2 KaRIn high rate pixel cloud vector attribute productshort_name :L2_HR_PIXCVecinstitution :CNESsource :Level 1B KaRIn High Rate Single Look Complex Data Producthistory :2024-02-02T11:20:25.557946Z: Creationplatform :SWOTreferences :SWOT-DD-CDM-0565-CNES_SAS_Design_L2_HR_LakeSP - Revision A - 20220531reference_document :SWOT-TN-CDM-0677-CNES_Product_Description_L2_HR_PIXCVec - Revision A - 20220531product_version :V5.3.0crid :PIC0pge_name :PGE_L2_HR_LakeSPpge_version :V4.3.1contact :SWOT-contact@cnes.frcycle_number :10pass_number :106tile_number :86swath_side :Rtile_name :106_086Rcontinent_id :NAcontinent_code :7time_granule_start :2024-01-28T18:35:40.339553Ztime_granule_end :2024-01-28T18:35:51.432035Ztime_coverage_start :2024-01-28T18:35:40.910059Ztime_coverage_end :2024-01-28T18:35:50.843156Zgeospatial_lon_min :-107.22389946582723geospatial_lon_max :-106.3237849756706geospatial_lat_min :38.56189986918592geospatial_lat_max :39.32030445228022inner_first_longitude :-106.47726704132805inner_first_latitude :39.32030445228022inner_last_longitude :-106.3237849756706inner_last_latitude :38.69213417084364outer_first_longitude :-107.22389946582723outer_first_latitude :39.18417696382458outer_last_longitude :-107.0411942763215outer_last_latitude :38.56189986918592xref_l2_hr_pixc_file :SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.ncxref_l2_hr_pixcvecriver_file :SWOT_L2_HR_PIXCVecRiver_010_106_086R_20240128T183540_20240128T183551_PIC0_01.ncxref_prior_river_db_file :xref_prior_lake_db_file :SWOT_LakeDatabase_Nom_106_20000101T000000_20991231T235959_20231017T000000_v105.sqlitexref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_param_l2_hr_laketile_file :SWOT_Param_L2_HR_LakeTile_20000101T000000_20991231T235959_20230922T160000_v411.cfgellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805\n\n\n\n\nSimple plot\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals == 0] = np.nan\npixcvec_lonvals[pixcvec_lonvals == 0] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n5. Raster NetCDF\n\n\nSearch for data of interest\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', \n temporal = ('2024-01-25 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*100m*', # here we filter by files with '100m' in the name (This collection has two resolution options: 100m & 250m)\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 83\n\n\nLet’s download one data file.\n\nearthaccess.download([raster_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.05 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_Raster_100m_UTM13S_N_x_x_x_010_106_043F_20240128T183530_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data with xarray\nFirst, we’ll programmatically get the filename we just downloaded and then view the file via xarray.\n\nds_raster = xr.open_mfdataset(f'data_downloads/SWOT_L2_HR_Raster*', engine='h5netcdf')\nds_raster\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1520, y: 1519)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 4.488e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 4.426e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-02T15:24:17Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1520y: 1519Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 4.488e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 448600., 448700., 448800.])y(y)float644.274e+06 4.274e+06 ... 4.426e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 4425600., 4425700., 4425800.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 447900.0, 448000.0, 448100.0, 448200.0, 448300.0, 448400.0,\n 448500.0, 448600.0, 448700.0, 448800.0],\n dtype='float64', name='x', length=1520))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 4424900.0, 4425000.0, 4425100.0, 4425200.0, 4425300.0, 4425400.0,\n 4425500.0, 4425600.0, 4425700.0, 4425800.0],\n dtype='float64', name='y', length=1519))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-02T15:24:17Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-01-28T18:35:30.338268Ztime_granule_end :2024-01-28T18:35:51.435533Ztime_coverage_start :2024-01-28T18:35:30.881182Ztime_coverage_end :2024-01-28T18:35:50.897419Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_106_084L_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_085L_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_086L_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_087L_20240128T183550_20240128T183601_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_084R_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_085R_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_087R_20240128T183550_20240128T183601_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_106_084L_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_085L_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_086L_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_087L_20240128T183550_20240128T183601_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_084R_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_085R_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_087R_20240128T183550_20240128T183601_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :01\n\n\n\n\nQuick interactive plot with hvplot\nNote: this is not filtered by quality\n\nds_raster.wse.hvplot.image(y='y', x='x')\n\n\n\n\n\n \n\n\n\n\n\n\n6. SLC\n\n\nSearch for data collection and time of interest\n\nslc_results = earthaccess.search_data(short_name = 'SWOT_L1B_HR_SLC_2.0', \n #temporal = ('2024-01-01 00:00:00', '2024-01-30 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 291\n\n\nLet’s download one data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([slc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 2.25 GB\n\n\nQUEUEING TASKS | : 100%|██████████| 1/1 [00:00<00:00, 113.65it/s]\nPROCESSING TASKS | : 100%|██████████| 1/1 [04:44<00:00, 284.14s/it]\nCOLLECTING RESULTS | : 100%|██████████| 1/1 [00:00<?, ?it/s]\n\n\n['data_downloads\\\\SWOT_L1B_HR_SLC_566_022_137L_20230629T015538_20230629T015549_PGC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe L1B_HR_SLC product file contains five NetCDF data group called the slc, xfactor, noise, tvp, and grdem groups. More info can be found in the product description document within the dataset table for each group.\n\nds_SLC = xr.open_mfdataset(\"data_downloads/SWOT_L1B_HR_SLC*.nc\", group = 'slc', engine='h5netcdf')\nds_SLC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 2GB\nDimensions: (num_lines: 22804, num_pixels: 5622, complex_depth: 2)\nDimensions without coordinates: num_lines, num_pixels, complex_depth\nData variables:\n slc_plus_y (num_lines, num_pixels, complex_depth) float32 1GB dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>\n slc_minus_y (num_lines, num_pixels, complex_depth) float32 1GB dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>\n slc_qual (num_lines) float32 91kB dask.array<chunksize=(22804,), meta=np.ndarray>\nAttributes:\n description: Single look complex images for plus_y and minus_y channelsxarray.DatasetDimensions:num_lines: 22804num_pixels: 5622complex_depth: 2Coordinates: (0)Data variables: (3)slc_plus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>long_name :single look complex image for the plus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the plus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n9.99 MiB\n\n\nShape\n(22804, 5622, 2)\n(3258, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5622 22804\n\n\n\n\nslc_minus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>long_name :single look complex image for the minus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the minus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n9.99 MiB\n\n\nShape\n(22804, 5622, 2)\n(3258, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5622 22804\n\n\n\n\nslc_qual(num_lines)float32dask.array<chunksize=(22804,), meta=np.ndarray>long_name :SLC quality flagstandard_name :status_flagflag_meanings :tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 32 64 128]valid_min :0valid_max :231comment :Flag indicating conditions that may affect the quality of the SLC data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n89.08 kiB\n89.08 kiB\n\n\nShape\n(22804,)\n(22804,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 22804 1\n\n\n\n\nIndexes: (0)Attributes: (1)description :Single look complex images for plus_y and minus_y channels\n\n\n\n\nPlot SLC data\n\n# function to get interferogram from slc images\n\ndef interfere(slc):\n # convert to complex array\n slc_plus_y = slc.slc_plus_y[:,:,0] + 1j * slc.slc_plus_y[:,:,1]\n slc_minus_y = slc.slc_minus_y[:,:,0] + 1j * slc.slc_minus_y[:,:,1]\n # get interferogram quantities\n ifgram = slc_plus_y * np.conj(slc_minus_y)\n mag = np.abs(ifgram)\n phase = np.arctan2(np.imag(ifgram), np.real(ifgram))\n return ifgram, np.real(np.abs(slc_plus_y)), np.real(np.abs(slc_minus_y)), mag, phase\n\n\n# ignore the divide-by-zero warning in log10\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# make a plot of slc interferogram\nifgram, power_plus_y, power_minus_y, mag, phase = interfere(ds_SLC)\nplt.imshow(10*np.log10(np.abs(ifgram)), interpolation='none', cmap='gray', aspect='auto')\nplt.clim((0,90))\nplt.colorbar().set_label('interferogram magnitude (dB)')\nplt.imshow(phase, interpolation='none', cmap='hsv', alpha=0.5, aspect='auto')\nplt.colorbar().set_label('interferometric phase')\n\n\n\n\n\n\n\n\n\n# also plot just the power image\nplt.imshow(10*np.log10(power_plus_y), interpolation='none', cmap='gray', aspect='auto')\nplt.clim((0,45))\nplt.colorbar().set_label('interferometric power (plus_y channel)')", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#set-up-an-s3fs-session-for-direct-access", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#set-up-an-s3fs-session-for-direct-access", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Set up an s3fs session for Direct Access", + "text": "Set up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data provider.\n\nfs_s3 = Store(auth).get_s3fs_session(daac=\"PODAAC\", provider=\"POCLOUD\")", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "Access & Visualization", - "SWOT Hydrology", - "Local" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOTHR_s3Access.html#accessing-and-visualizing-swot-datasets", - "href": "notebooks/datasets/SWOTHR_s3Access.html#accessing-and-visualizing-swot-datasets", - "title": "SWOT Hydrology Dataset Exploration in the Cloud", - "section": "Accessing and Visualizing SWOT Datasets", - "text": "Accessing and Visualizing SWOT Datasets\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via earthaccess python library; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\nLearning Objectives:\n\nAccess SWOT HR data prodcuts (archived in NASA Earthdata Cloud) within the AWS cloud, without downloading to local machine\nVisualize accessed data for a quick check\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nRiver Vector Shapefile - SWOT_L2_HR_RIVERSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LAKESP_2.0\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\nSingle Look Complex Data product - SWOT_L1B_HR_SLC_2.0\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Feb 2024) || Other Contributors: Zoe Walschots (PO.DAAC Summer Intern 2023), Catalina Taglialatela (NASA PO.DAAC), Luis Lopez (NASA NSIDC DAAC)\nLast updated: 7 Feb 2024\n\n\n\nLibraries Needed\n\nimport s3fs\nimport fiona\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport earthaccess\n\npd.set_option('display.max_columns', None) #make sure all columns displayed for shapefiles\n\n\n\n\n\n\n\n\n\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nSingle File Access\n\n1. River Vector Shapefiles\nThe s3 access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to search in a map graphic user interface.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for the data of interest\n\n#Retrieves granule from the day we want, in this case by passing to `earthdata.search_data` function the data collection shortname, temporal bounds, and filter by wildcards\nriver_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_009_NA*') # here we filter by Reach files (not node), pass=009, continent code=NA\n\nGranules found: 7\n\n\n\n\nSet up an s3fs session for Direct Cloud Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(results=river_results)\n\n\n\nCreate Fiona session to work with zip and embedded shapefiles in the AWS Cloud\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don’t do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# Get the link for the first zip file\nriver_link = earthaccess.results.DataGranule.data_links(river_results[0], access='direct')[0]\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nriver_shp_url = f\"zip+{river_link}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp1 = gpd.read_file(river_shp_url) \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\nwse_c\nwse_c_u\nslope\nslope_u\nslope_r_u\nslope2\nslope2_u\nslope2_r_u\nwidth\nwidth_u\nwidth_c\nwidth_c_u\narea_total\narea_tot_u\narea_detct\narea_det_u\narea_wse\nd_x_area\nd_x_area_u\nlayovr_val\nnode_dist\nloc_offset\nxtrk_dist\ndschg_c\ndschg_c_u\ndschg_csf\ndschg_c_q\ndschg_gc\ndschg_gc_u\ndschg_gcsf\ndschg_gc_q\ndschg_m\ndschg_m_u\ndschg_msf\ndschg_m_q\ndschg_gm\ndschg_gm_u\ndschg_gmsf\ndschg_gm_q\ndschg_b\ndschg_b_u\ndschg_bsf\ndschg_b_q\ndschg_gb\ndschg_gb_u\ndschg_gbsf\ndschg_gb_q\ndschg_h\ndschg_h_u\ndschg_hsf\ndschg_h_q\ndschg_gh\ndschg_gh_u\ndschg_ghsf\ndschg_gh_q\ndschg_o\ndschg_o_u\ndschg_osf\ndschg_o_q\ndschg_go\ndschg_go_u\ndschg_gosf\ndschg_go_q\ndschg_s\ndschg_s_u\ndschg_ssf\ndschg_s_q\ndschg_gs\ndschg_gs_u\ndschg_gssf\ndschg_gs_q\ndschg_i\ndschg_i_u\ndschg_isf\ndschg_i_q\ndschg_gi\ndschg_gi_u\ndschg_gisf\ndschg_gi_q\ndschg_q_b\ndschg_gq_b\nreach_q\nreach_q_b\ndark_frac\nice_clim_f\nice_dyn_f\npartial_f\nn_good_nod\nobs_frac_n\nxovr_cal_q\ngeoid_hght\ngeoid_slop\nsolid_tide\nload_tidef\nload_tideg\npole_tide\ndry_trop_c\nwet_trop_c\niono_c\nxovr_cal_c\nn_reach_up\nn_reach_dn\nrch_id_up\nrch_id_dn\np_wse\np_wse_var\np_width\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n71224500951\n-1.000000e+12\n-1.000000e+12\nno_data\n48.517717\n-93.692086\nRainy River\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n1\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n71224700961, no_data, no_data, no_data\n71224300941, no_data, no_data, no_data\n325.899994\n0.044680\n208.0\n1480.031\n53\n244919.492\n10586.381484\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-93.76076 48.51651, -93.76035 48.5...\n\n\n1\n71224700013\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.777900\n-93.233350\nno_data\n3.364954e+02\n9.003000e-02\n2.290000e-03\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n3.272000e-01\n8.486717e+02\n2.871400e-01\n-4.807161e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389051\n8389051\n3\n4194318\n1.338000e-03\n1\n-999\n0\n18\n1.000000e+00\n0\n-3.141705e+01\n-2.674060e-05\n-2.894793e-02\n-5.371819e-03\n-5.384998e-03\n5.780308e-03\n-2.241292e+00\n-1.634102e-02\n-8.003274e-03\n5.015258e-01\n1\n1\n71224700021, no_data, no_data, no_data\n71224700276, no_data, no_data, no_data\n335.600006\n0.000000\n1288.0\n1239358.412\n18\n3719.676\n3514.736672\n-1.000000e+12\n0\n6\n1\n0\nLINESTRING (-93.21387 48.78466, -93.21403 48.7...\n\n\n2\n71224700021\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.772163\n-93.266891\nno_data\n3.365123e+02\n9.199000e-02\n1.902000e-02\n-1.000000e+12\n-1.000000e+12\n4.959662e-05\n1.018542e-05\n9.733590e-06\n2.575548e-05\n-1.000000e+12\n4.654752e-05\n6.202024e+01\n1.118013e+00\n-1.000000e+12\n-1.000000e+12\n9.836880e+04\n1.773253e+03\n9.836880e+04\n1.773300e+03\n9.836880e+04\n-1.000000e+12\n-1.000000e+12\n1.377000e-01\n1.509669e+02\n-1.470277e+01\n-5.017144e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n1\n2\n0.000000e+00\n1\n-999\n0\n6\n7.500000e-01\n0\n-3.135521e+01\n2.512828e-05\n-2.886645e-02\n-5.377388e-03\n-5.390327e-03\n5.783173e-03\n-2.241321e+00\n-1.657549e-02\n-8.003758e-03\n5.314556e-01\n2\n1\n71224700233, 71224700083, no_data, no_data\n71224700013, no_data, no_data, no_data\n335.600006\n0.000000\n30.0\n76609.119\n8\n5305.752\n1586.075688\n-1.000000e+12\n0\n6\n1\n0\nLINESTRING (-93.25587 48.77340, -93.25628 48.7...\n\n\n3\n71224700033\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.733727\n-93.116424\nno_data\n3.365715e+02\n9.068000e-02\n1.112000e-02\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1.505600e+00\n3.730449e+02\n-1.512075e+02\n-3.862870e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n3\n4194318\n1.153940e-01\n1\n-999\n0\n18\n9.000000e-01\n0\n-3.153422e+01\n-1.678670e-05\n-2.908536e-02\n-5.353698e-03\n-5.371641e-03\n5.773116e-03\n-2.241031e+00\n-1.593641e-02\n-8.007598e-03\n3.984029e-01\n1\n1\n71224700286, no_data, no_data, no_data\n71224700041, no_data, no_data, no_data\n335.600006\n0.000000\n645.0\n297730.945\n20\n306795.237\n3904.961218\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-93.09779 48.73888, -93.09820 48.7...\n\n\n4\n71224700041\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.720271\n-93.113458\nno_data\n3.364742e+02\n9.085000e-02\n1.238000e-02\n-1.000000e+12\n-1.000000e+12\n-2.431140e-05\n1.166051e-05\n1.126799e-05\n-9.248820e-05\n-1.000000e+12\n1.647480e-05\n3.930469e+01\n1.013951e+00\n-1.000000e+12\n-1.000000e+12\n4.728760e+04\n1.219887e+03\n4.728760e+04\n1.219900e+03\n4.728760e+04\n-1.000000e+12\n-1.000000e+12\n2.925000e-01\n2.328550e+02\n-4.628440e+00\n-3.776046e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n25166265\n25166265\n1\n6\n0.000000e+00\n1\n-999\n0\n5\n8.333333e-01\n0\n-3.152398e+01\n-3.509400e-06\n-2.906824e-02\n-5.351348e-03\n-5.371695e-03\n5.773071e-03\n-2.240743e+00\n-1.600031e-02\n-8.009073e-03\n3.901623e-01\n1\n1\n71224700033, no_data, no_data, no_data\n71224700053, no_data, no_data, no_data\n335.600006\n0.000000\n645.0\n0.000\n6\n302890.276\n1203.102119\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-93.12101 48.72305, -93.12060 48.7...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n926\n77125000241\n7.540756e+08\n7.540756e+08\n2023-11-23T17:26:38Z\n17.960957\n-100.025397\nno_data\n3.560650e+02\n1.501928e+02\n1.501928e+02\n-1.000000e+12\n-1.000000e+12\n1.139809e-03\n8.453720e-04\n8.453667e-04\n-1.968571e-04\n-1.000000e+12\n6.002469e+03\n6.442070e+01\n1.454903e+00\n-1.000000e+12\n-1.000000e+12\n5.130950e+04\n1.158794e+03\n4.143390e+04\n1.158800e+03\n5.130950e+04\n-1.000000e+12\n-1.000000e+12\n3.217900e+00\n6.496189e+01\n-6.441719e+03\n6.087360e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389051\n8389051\n1\n40966\n1.924710e-01\n0\n-999\n1\n4\n5.714286e-02\n0\n-8.767097e+00\n2.520024e-05\n1.047472e-01\n-2.491515e-03\n-1.416101e-03\n3.766508e-03\n-2.225335e+00\n-2.844600e-01\n-1.248337e-02\n-3.609023e-01\n1\n1\n77125000254, no_data, no_data, no_data\n77125000231, no_data, no_data, no_data\n358.600006\n65.289837\n96.0\n864.151\n70\n464330.310\n13953.442643\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-100.06409 17.97308, -100.06403 17...\n\n\n927\n77125000254\n-1.000000e+12\n-1.000000e+12\nno_data\n17.949648\n-99.995193\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000263, no_data, no_data, no_data\n77125000241, no_data, no_data, no_data\n423.700012\n50.631649\n162.0\n21491.314\n2\n464735.375\n405.065100\n-1.000000e+12\n10286\n1\n1\n0\nLINESTRING (-99.99547 17.95148, -99.99564 17.9...\n\n\n928\n77125000261\n7.540756e+08\n7.540756e+08\n2023-11-23T17:26:47Z\n18.362207\n-100.696472\nno_data\n2.316304e+02\n9.208000e-02\n1.946000e-02\n-1.000000e+12\n-1.000000e+12\n9.017132e-04\n5.351440e-06\n4.431470e-06\n8.374171e-04\n-1.000000e+12\n3.976097e-05\n3.544730e+02\n2.232573e+00\n-1.000000e+12\n-1.000000e+12\n3.936467e+06\n2.479300e+04\n3.776529e+06\n2.479300e+04\n3.936467e+06\n-1.000000e+12\n-1.000000e+12\n1.037250e+01\n1.555118e+02\n-1.003980e+00\n-1.240390e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n1\n14\n4.063000e-02\n0\n-999\n0\n56\n1.000000e+00\n0\n-1.111140e+01\n1.232563e-05\n1.055168e-01\n-1.683211e-03\n-6.265789e-04\n3.857576e-03\n-2.255829e+00\n-3.061254e-01\n-1.237202e-02\n1.378732e-01\n2\n1\n77125000021, 77125000011, no_data, no_data\n77123000251, no_data, no_data, no_data\n232.000000\n6.028838\n195.0\n3624.715\n56\n325106.825\n11105.124379\n-1.000000e+12\n0\n4\n1\n0\nLINESTRING (-100.68734 18.40208, -100.68723 18...\n\n\n929\n77125000263\n-1.000000e+12\n-1.000000e+12\nno_data\n17.956269\n-99.961388\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000273, no_data, no_data, no_data\n77125000254, no_data, no_data, no_data\n463.500000\n5.120043\n459.0\n43956.311\n49\n474450.182\n9714.807127\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-99.99398 17.94824, -99.99369 17.9...\n\n\n930\n77125000273\n-1.000000e+12\n-1.000000e+12\nno_data\n17.952683\n-99.906755\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000283, no_data, no_data, no_data\n77125000263, no_data, no_data, no_data\n463.500000\n0.000000\n819.0\n283915.163\n49\n484179.822\n9729.640027\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-99.93256 17.94746, -99.93273 17.9...\n\n\n\n\n931 rows × 127 columns\n\n\n\n\n\nQuickly plot the SWOT river data\n\n# Simple plot\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp1.plot(ax=ax, color='black')\n\n\n\n\n\n\n\n\n\n# # Another way to plot geopandas dataframes is with `explore`, which also plots a basemap\n# SWOT_HR_shp1.explore()\n\n\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for data of interest\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Prior*_009_NA*') # here we filter by files with 'Prior' in the name (This collection has three options: Obs, Unassigned, and Prior), pass #8 and continent code=NA\n\nGranules found: 3\n\n\n\n\nSet up an s3fs session for Direct Cloud Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(results=lake_results)\n\n\n\nCreate Fiona session to work with zip and embedded shapefiles in the AWS Cloud\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don’t do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# Get the link for the first zip file\nlake_link = earthaccess.results.DataGranule.data_links(lake_results[0], access='direct')[0]\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nlake_shp_url = f\"zip+{lake_link}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp2 = gpd.read_file(lake_shp_url) \n\n#view the attribute table\nSWOT_HR_shp2\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\nwse_r_u\nwse_std\narea_total\narea_tot_u\narea_detct\narea_det_u\nlayovr_val\nxtrk_dist\nds1_l\nds1_l_u\nds1_q\nds1_q_u\nds2_l\nds2_l_u\nds2_q\nds2_q_u\nquality_f\ndark_frac\nice_clim_f\nice_dyn_f\npartial_f\nxovr_cal_q\ngeoid_hght\nsolid_tide\nload_tidef\nload_tideg\npole_tide\ndry_trop_c\nwet_trop_c\niono_c\nxovr_cal_c\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n0\n7120818392\nno_data\n712238L999960\n100\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.221900e+02\n3.900000e-02\n3.100000e-02\n1.750000e-01\n1.133420e-01\n2.746000e-03\n1.123950e-01\n2.746000e-03\n2.450000e-01\n-2.700895e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n8.362160e-01\n2\n-999\n0\n0\n-2.960103e+01\n-1.076270e-01\n-1.385000e-02\n-1.446900e-02\n6.530000e-03\n-2.219912e+00\n-4.322200e-02\n-2.460000e-03\n-8.323030e-01\nno_data\n-99999999\n-93.370529\n47.725706\n-1.000000e+12\n0.067500\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.37004 47.72747, -93.36976 ...\n\n\n1\n7120818432\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n2\n-999\n-999\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\nSOUTH STURGEON LAKE\n-99999999\n-93.063382\n47.636276\n-1.000000e+12\n0.734400\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n2\n7120818512\nno_data\n712239L999974\n91\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.035210e+02\n3.800000e-02\n2.900000e-02\n3.670000e-01\n4.746580e-01\n6.040000e-03\n3.230260e-01\n6.040000e-03\n1.100000e-01\n-4.768885e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-2.928009e+01\n-1.069980e-01\n-1.387600e-02\n-1.449100e-02\n6.541000e-03\n-2.224427e+00\n-4.345700e-02\n-2.448000e-03\n-1.489370e+00\nCONNORS LAKE\n-99999999\n-93.634992\n47.777938\n-1.000000e+12\n0.419400\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.64085 47.77833, -93.64070 ...\n\n\n3\n7120818532\nno_data\n712238L999960\n100\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.214720e+02\n9.700000e-02\n5.700000e-02\n3.140000e-01\n5.936400e-02\n2.015000e-03\n5.936400e-02\n2.015000e-03\n1.100000e-02\n-2.658368e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n0.000000e+00\n2\n-999\n0\n0\n-2.961158e+01\n-1.076620e-01\n-1.385000e-02\n-1.446900e-02\n6.530000e-03\n-2.220099e+00\n-4.328800e-02\n-2.460000e-03\n-8.189060e-01\nno_data\n-99999999\n-93.367313\n47.718575\n-1.000000e+12\n0.018900\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.36683 47.72159, -93.36655 47.721...\n\n\n4\n7120818542\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n2\n-999\n-999\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\nno_data\n-99999999\n-93.042420\n47.711142\n-1.000000e+12\n0.031500\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n56491\n7131519532\nno_data\n713254R999944;713255R000006\n45;42\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n1.283300e+01\n7.500000e-02\n5.700000e-02\n1.700000e-01\n7.491100e-02\n1.923000e-03\n7.437200e-02\n1.923000e-03\n1.000000e-03\n2.384581e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.790753e+01\n-7.896700e-02\n-4.073000e-03\n-2.923000e-03\n5.666000e-03\n-2.268012e+00\n-1.023750e-01\n-2.140000e-03\n7.063360e-01\nno_data\n-99999999\n-88.000840\n56.331699\n-1.000000e+12\n0.056700\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.99912 56.33127, -87.99922 ...\n\n\n56492\n7131519632\nno_data\n713254R999943;713255R000008\n48;20\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n1.074100e+01\n1.570000e-01\n1.460000e-01\n1.420000e-01\n3.342300e-02\n1.435000e-03\n3.152200e-02\n1.435000e-03\n5.000000e-03\n2.730958e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.786691e+01\n-7.908800e-02\n-3.548000e-03\n-2.638000e-03\n5.728000e-03\n-2.268497e+00\n-1.023450e-01\n-2.141000e-03\n8.137400e-01\nno_data\n-99999999\n-87.948521\n56.320464\n-1.000000e+12\n0.025200\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.94670 56.32014, -87.94649 ...\n\n\n56493\n7131519662\nno_data\n713255R000009;713254R999940\n42;33\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n9.208000e+00\n1.030000e-01\n1.260000e-01\n1.410000e-01\n2.864300e-02\n1.112000e-03\n2.729100e-02\n1.112000e-03\n3.400000e-02\n2.882420e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.784918e+01\n-7.914000e-02\n-3.278000e-03\n-2.509000e-03\n6.730000e-03\n-2.268922e+00\n-1.023670e-01\n-2.142000e-03\n8.608050e-01\nno_data\n-99999999\n-87.925618\n56.315773\n-1.000000e+12\n0.021600\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.92352 56.31520, -87.92363 ...\n\n\n56494\n7131560212\nno_data\n713245R000001;713245R999966;713245R999958;7132...\n70;0;0;0;0;0;0;0;0;0;0\n11\n7.558789e+08\n7.558789e+08\n2023-12-14T14:21:43Z\n3.717920e+02\n1.000000e-03\n1.000000e-03\n3.720000e-01\n3.853027e+02\n3.084073e+00\n3.231617e+02\n3.084073e+00\n7.000000e-03\n4.695466e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n1\n0\n-3.585787e+01\n-9.732200e-02\n-1.303500e-02\n-1.356500e-02\n6.288000e-03\n-2.208235e+00\n-5.674900e-02\n-2.306000e-03\n1.424744e+00\nCAT RIVER (EAST CHANNEL);LAKE ST JOSEPH;ST JOS...\n-99999999\n-90.745713\n51.058944\n-1.000000e+12\n526.421232\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-91.39550 50.91117, -91.39555 ...\n\n\n56495\n7420501022\nno_data\n742233R999968;742233R000007;742233R000003\n57;8;4\n3\n7.558788e+08\n7.558788e+08\n2023-12-14T14:19:39Z\n3.105560e+02\n9.900000e-02\n7.300000e-02\n6.540000e-01\n3.935470e-01\n2.443000e-03\n1.602010e-01\n2.443000e-03\n1.100000e-02\n5.434642e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-2.887526e+01\n-1.217310e-01\n-1.435000e-02\n-1.513400e-02\n6.583000e-03\n-2.268862e+00\n-5.500000e-02\n-2.866000e-03\n1.664425e+00\nLAKE TUSTIN\n-99999999\n-93.665611\n44.206288\n-1.000000e+12\n0.546300\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.66006 44.20938, -93.66012 ...\n\n\n\n\n56496 rows × 51 columns\n\n\n\n\n\nQuickly plot the SWOT lakes data\n\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp2.plot(ax=ax, color='black')\n\n\n\n\n\n\n\n\nAccessing the remaining files is different than the shp files above. We do not need to read the shapefiles within a zip file using something like Fiona session (or to download and unzip in the cloud) because the following SWOT HR collections are stored in netCDF files in the cloud. For the rest of the products, we will open via xarray, not geopandas.\n\n\n3. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n #granule_name = '*_009_*', # pass number 9 if we want to filter further\n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 39\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(earthaccess.open([pixc_results[0]]), group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\nOpening 1 granules, approx size: 0.22 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 2357958, complex_depth: 2,\n num_pixc_lines: 3278)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(471592,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(471592,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(785986,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(785986,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(785986, 1), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3278\n interferogram_size_range: 5623\n looks_to_efflooks: 1.5509709858820855\n num_azimuth_looks: 7.0\n azimuth_offset: 7xarray.DatasetDimensions:points: 2357958complex_depth: 2num_pixc_lines: 3278Coordinates: (2)latitude(points)float64dask.array<chunksize=(471592,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(471592,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(785986, 1), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.00 MiB\n\n\nShape\n(2357958, 2)\n(785986, 1)\n\n\nDask graph\n6 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 2357958\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(471592,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(471592,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3278interferogram_size_range :5623looks_to_efflooks :1.5509709858820855num_azimuth_looks :7.0azimuth_offset :7\n\n\n\n\nSimple plot of the results\n\n# This could take a few minutes to plot\nplt.scatter(x=ds_PIXC.longitude, y=ds_PIXC.latitude, c=ds_PIXC.height)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\n\nSearch for data of interest\n\npixcvec_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXCVEC_2.0', \n #granule_name = '*_009_*', # pass number 9 if we want to filter further\n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX \n\nGranules found: 26\n\n\n\n\nOpen data using xarray\n\nds_PIXCVEC = xr.open_mfdataset(earthaccess.open([pixcvec_results[0]]), decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\nOpening 1 granules, approx size: 0.21 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 2831150, nchar_reach_id: 11,\n nchar_node_id: 14, nchar_lake_id: 10,\n nchar_obs_id: 13)\nDimensions without coordinates: points, nchar_reach_id, nchar_node_id,\n nchar_lake_id, nchar_obs_id\nData variables:\n azimuth_index (points) int32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n range_index (points) int32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n latitude_vectorproc (points) float64 dask.array<chunksize=(2831150,), meta=np.ndarray>\n longitude_vectorproc (points) float64 dask.array<chunksize=(2831150,), meta=np.ndarray>\n height_vectorproc (points) float32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n reach_id (points, nchar_reach_id) |S1 dask.array<chunksize=(2831150, 11), meta=np.ndarray>\n node_id (points, nchar_node_id) |S1 dask.array<chunksize=(2831150, 14), meta=np.ndarray>\n lake_id (points, nchar_lake_id) |S1 dask.array<chunksize=(2831150, 10), meta=np.ndarray>\n obs_id (points, nchar_obs_id) |S1 dask.array<chunksize=(2831150, 13), meta=np.ndarray>\n ice_clim_f (points) int8 dask.array<chunksize=(2831150,), meta=np.ndarray>\n ice_dyn_f (points) int8 dask.array<chunksize=(2831150,), meta=np.ndarray>\nAttributes: (12/45)\n Conventions: CF-1.7\n title: Level 2 KaRIn high rate pixel cloud vect...\n short_name: L2_HR_PIXCVec\n institution: CNES\n source: Level 1B KaRIn High Rate Single Look Com...\n history: 2023-12-03T05:59:43.712142Z: Creation\n ... ...\n xref_prior_river_db_file: \n xref_prior_lake_db_file: SWOT_LakeDatabase_Nom_106_20000101T00000...\n xref_reforbittrack_files: SWOT_RefOrbitTrackTileBoundary_Nom_20000...\n xref_param_l2_hr_laketile_file: SWOT_Param_L2_HR_LakeTile_20000101T00000...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805xarray.DatasetDimensions:points: 2831150nchar_reach_id: 11nchar_node_id: 14nchar_lake_id: 10nchar_obs_id: 13Coordinates: (0)Data variables: (11)azimuth_index(points)int32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nrange_index(points)int32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nlatitude_vectorproc(points)float64dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation latitudestandard_name :latitudeunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Height-constrained geodetic latitude of the pixel. Units are in degrees north of the equator.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n21.60 MiB\n21.60 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nlongitude_vectorproc(points)float64dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation longitudestandard_name :longitudeunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Height-constrained geodetic longitude of the pixel. Positive=degrees east of the Greenwich meridian. Negative=degrees west of the Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n21.60 MiB\n21.60 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nheight_vectorproc(points)float32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.96921e+36long_name :height above reference ellipsoidunits :mvalid_min :-1500.0valid_max :15000.0coordinates :longitude_vectorproc latitude_vectorproccomment :Height-constrained height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nreach_id(points, nchar_reach_id)|S1dask.array<chunksize=(2831150, 11), meta=np.ndarray>long_name :identifier of the associated prior river reachcoordinates :longitude_vectorproc latitude_vectorproccomment :Unique reach identifier from the prior river database. The format of the identifier is CBBBBBRRRRT, where C=continent, B=basin, R=reach, T=type.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n29.70 MiB\n29.70 MiB\n\n\nShape\n(2831150, 11)\n(2831150, 11)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 11 2831150\n\n\n\n\nnode_id(points, nchar_node_id)|S1dask.array<chunksize=(2831150, 14), meta=np.ndarray>long_name :identifier of the associated prior river nodecoordinates :longitude_vectorproc latitude_vectorproccomment :Unique node identifier from the prior river database. The format of the identifier is CBBBBBRRRRNNNT, where C=continent, B=basin, R=reach, N=node, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n37.80 MiB\n37.80 MiB\n\n\nShape\n(2831150, 14)\n(2831150, 14)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 14 2831150\n\n\n\n\nlake_id(points, nchar_lake_id)|S1dask.array<chunksize=(2831150, 10), meta=np.ndarray>long_name :identifier of the associated prior lakecoordinates :longitude_vectorproc latitude_vectorproccomment :Identifier of the lake from the lake prior database) associated to the pixel. The format of the identifier is CBBNNNNNNT, where C=continent, B=basin, N=counter within the basin, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n27.00 MiB\n27.00 MiB\n\n\nShape\n(2831150, 10)\n(2831150, 10)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 10 2831150\n\n\n\n\nobs_id(points, nchar_obs_id)|S1dask.array<chunksize=(2831150, 13), meta=np.ndarray>long_name :identifier of the observed featurecoordinates :longitude_vectorproc latitude_vectorproccomment :Tile-specific identifier of the observed feature associated to the pixel. The format of the identifier is CBBTTTSNNNNNN, where C=continent, B=basin, T=tile number, S=swath side, N=lake counter within the PIXC tile.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n35.10 MiB\n35.10 MiB\n\n\nShape\n(2831150, 13)\n(2831150, 13)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 13 2831150\n\n\n\n\nice_clim_f(points)int8dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :127long_name :climatological ice cover flagflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the surface is not ice covered, may or may not be partially or fully ice covered, and fully ice covered, respectively. A value of 127 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.70 MiB\n2.70 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nice_dyn_f(points)int8dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :127long_name :dynamical ice cover flagflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Dynamic ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the surface is not ice covered, partially ice covered, and fully ice covered, respectively. A value of 255 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.70 MiB\n2.70 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nIndexes: (0)Attributes: (45)Conventions :CF-1.7title :Level 2 KaRIn high rate pixel cloud vector attribute productshort_name :L2_HR_PIXCVecinstitution :CNESsource :Level 1B KaRIn High Rate Single Look Complex Data Producthistory :2023-12-03T05:59:43.712142Z: Creationplatform :SWOTreferences :SWOT-DD-CDM-0565-CNES_SAS_Design_L2_HR_LakeSP - Revision A - 20220531reference_document :SWOT-TN-CDM-0677-CNES_Product_Description_L2_HR_PIXCVec - Revision A - 20220531product_version :V5.3.0crid :PIC0pge_name :PGE_L2_HR_LakeSPpge_version :V4.3.0contact :SWOT-contact@cnes.frcycle_number :7pass_number :106tile_number :86swath_side :Rtile_name :106_086Rcontinent_id :NAcontinent_code :7time_granule_start :2023-11-27T04:20:24.437425Ztime_granule_end :2023-11-27T04:20:35.530690Ztime_coverage_start :2023-11-27T04:20:24Ztime_coverage_end :2023-11-27T04:20:34.966118Zgeospatial_lon_min :-107.2245094782927geospatial_lon_max :-106.32383090171766geospatial_lat_min :38.56164725058795geospatial_lat_max :39.320021843662694inner_first_longitude :-106.47881643041174inner_first_latitude :39.320021843662694inner_last_longitude :-106.32383090171766inner_last_latitude :38.69212711409543outer_first_longitude :-107.2245094782927outer_first_latitude :39.18406274086079outer_last_longitude :-107.04259075253788outer_last_latitude :38.56164725058795xref_l2_hr_pixc_file :SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.ncxref_l2_hr_pixcvecriver_file :SWOT_L2_HR_PIXCVecRiver_007_106_086R_20231127T042024_20231127T042035_PIC0_04.ncxref_prior_river_db_file :xref_prior_lake_db_file :SWOT_LakeDatabase_Nom_106_20000101T000000_20991231T235959_20231017T000000_v105.sqlitexref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_param_l2_hr_laketile_file :SWOT_Param_L2_HR_LakeTile_20000101T000000_20991231T235959_20230922T160000_v411.cfgellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805\n\n\n\n\nSimple plot\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals < 1] = np.nan\npixcvec_lonvals[pixcvec_lonvals > -1] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n5. Raster NetCDF\n\n\nSearch for data of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*100m*', # here we filter by files with '100m' in the name (This collection has two resolution options: 100m & 250m)\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 44\n\n\n\n\nOpen data with xarray\n\nds_raster = xr.open_mfdataset(earthaccess.open([raster_results[0]]), engine='h5netcdf')\nds_raster\n\nOpening 1 granules, approx size: 0.04 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1520, y: 1519)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 4.488e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 4.426e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(507, 507), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(507, 507), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(760, 760), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-12-03T08:26:57Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 04xarray.DatasetDimensions:x: 1520y: 1519Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 4.488e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 448600., 448700., 448800.])y(y)float644.274e+06 4.274e+06 ... 4.426e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 4425600., 4425700., 4425800.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 447900.0, 448000.0, 448100.0, 448200.0, 448300.0, 448400.0,\n 448500.0, 448600.0, 448700.0, 448800.0],\n dtype='float64', name='x', length=1520))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 4424900.0, 4425000.0, 4425100.0, 4425200.0, 4425300.0, 4425400.0,\n 4425500.0, 4425600.0, 4425700.0, 4425800.0],\n dtype='float64', name='y', length=1519))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-12-03T08:26:57Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-27T04:20:14.437610Ztime_granule_end :2023-11-27T04:20:35.534188Ztime_coverage_start :2023-11-27T04:20:14.980558Ztime_coverage_end :2023-11-27T04:20:34.994509Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_106_084L_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085L_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086L_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087L_20231127T042034_20231127T042045_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_084R_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085R_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087R_20231127T042034_20231127T042045_PIC0_03.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_106_084L_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085L_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_084R_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085R_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_086R_20231127T042024_20231127T042035_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_087R_20231127T042034_20231127T042045_PIC0_04.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :04\n\n\n\n\nQuick interactive plot with hvplot\n\nds_raster.wse.hvplot.image(y='y', x='x')\n\n\n\n\n\n \n\n\n\n\n\n\n6. SLC\n\n\nSearch for data collection and time of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\nslc_results = earthaccess.search_data(short_name = 'SWOT_L1B_HR_SLC_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n #granule_name = '*_009_*', # here we can additionally filter by pass number 009\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 46\n\n\n\n\nOpen data using xarray\nThe L1B_HR_SLC product file contains five NetCDF data group called the slc, xfactor, noise, tvp, and grdem groups. More info can be found in the product description document within the dataset table for each group.\n\nds_SLC = xr.open_mfdataset(earthaccess.open([slc_results[0]]), group = 'slc', engine='h5netcdf')\nds_SLC\n\nOpening 1 granules, approx size: 2.25 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (num_lines: 22956, num_pixels: 5623, complex_depth: 2)\nDimensions without coordinates: num_lines, num_pixels, complex_depth\nData variables:\n slc_plus_y (num_lines, num_pixels, complex_depth) float32 dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>\n slc_minus_y (num_lines, num_pixels, complex_depth) float32 dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>\n slc_qual (num_lines) float32 dask.array<chunksize=(22956,), meta=np.ndarray>\nAttributes:\n description: Single look complex images for plus_y and minus_y channelsxarray.DatasetDimensions:num_lines: 22956num_pixels: 5623complex_depth: 2Coordinates: (0)Data variables: (3)slc_plus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>long_name :single look complex image for the plus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the plus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n10.06 MiB\n\n\nShape\n(22956, 5623, 2)\n(3280, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5623 22956\n\n\n\n\nslc_minus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>long_name :single look complex image for the minus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the minus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n10.06 MiB\n\n\nShape\n(22956, 5623, 2)\n(3280, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5623 22956\n\n\n\n\nslc_qual(num_lines)float32dask.array<chunksize=(22956,), meta=np.ndarray>long_name :SLC quality flagstandard_name :status_flagflag_meanings :tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 32 64 128]valid_min :0valid_max :231comment :Flag indicating conditions that may affect the quality of the SLC data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n89.67 kiB\n89.67 kiB\n\n\nShape\n(22956,)\n(22956,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 22956 1\n\n\n\n\nIndexes: (0)Attributes: (1)description :Single look complex images for plus_y and minus_y channels", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#search-using-earthaccess-for-opera-dswx", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#search-using-earthaccess-for-opera-dswx", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Search Using earthaccess for OPERA DSWx", + "text": "Search Using earthaccess for OPERA DSWx\nEach dataset has it’s own unique collection ID. For the OPERA_L3_DSWX-HLS_V1 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Powell Reservoir.\nWe used bbox finder to get the exact coordinates for our area of interest.\nWe want to look at two different times for comparison: 04/11/2023 and 08/30/2023. To find these dates, let’s search for all the data granules between the two.\nFinding 08/30/23 you must search a couple days after at 09/01/23 for when the product was generated for 08/30/23.\n\n#search for the granules using the short name\nopera_results = earthaccess.search_data(short_name=\"OPERA_L3_DSWX-HLS_V1\", temporal= (\"2023-04-11\",\"2023-09-01\"), bounding_box = ('-111.144811','36.980121','-110.250799','37.915625'))\n\nGranules found: 310\n\n\n\nGet S3 Bucket links from search results\nBecause we are working within the AWS cloud, let’s get the S3 bucket links for the 8 desired files. We want to query the dataset based on a specific classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’).\nOPERA has 10 different available layers. We will look at ‘B01_WTR’ which is the Water Classification (WTR) layer of the OPERA DSWx dataset. Details on each available layer and the data product can be found here.\n\n#add the S3 bucket links to lists, here we are looking for B01_WTR layer and two dates specified earlier\napril = []\naugust = []\nfor g in opera_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if 'B01_WTR' in l: \n if '20230411' in l:\n april.append(l)\n if '20230830' in l:\n august.append(l)\n\nprint(len(april))\nprint(len(august))\n\n4\n4", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "Access & Visualization", - "SWOT Hydrology", + "OPERA", + "Visualization and Mosaicking", "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#summary", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#summary", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Summary", - "text": "Summary\n\nEl Niño-Southern Oscillation (ENSO) is a climate pattern in the Pacific Ocean that has two phases: El Niño (warm/wet phase) and La Niña (cold/dry phase). ENSO has global impacts on wildfires, weather, and ecosystems. We have been experiencing La Niña conditions for the last 2 and a half years. The last El Niño event occurred in 2015/2016 and a weak El Niño event was also experienced during the winter of 2018/2019.\nThis tutorial uses the SST anomaly variable derived from a MUR climatology dataset - MUR25-JPL-L4-GLOB-v04.2 (average between 2003 and 2014). This tutorial uses the PO.DAAC Downloader which downloads data to your local computer and uses the data to run a notebook using python. The following code produces the sea surface temperature anomalies (SSTA) over the Pacific Ocean.", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-dataset", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-dataset", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Visualizing the Dataset", + "text": "Visualizing the Dataset\nLet’s now visualize an individual layer for a single file that was downloaded using Rasterio to read the GeoTIFF image.\n\ns3_url = april[2]\n\n\ns3_file_obj1 = fs_s3.open(s3_url, mode='rb')\n\n\ndsw = rio.open(s3_file_obj1)\ndsw\n\n<open DatasetReader name='/vsipythonfilelike/5f942afb-36e7-448e-8456-360c9ae94618/5f942afb-36e7-448e-8456-360c9ae94618' mode='r'>\n\n\nOPERA is a single band image with specific classified rgb values.\nThis requires to read the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage = dsw.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw2 = color_array[image]\n\n\nfig, ax = plt.subplots(figsize=(15,10))\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nax.legend(handles=patches,\n bbox_to_anchor=(1.28, 1),\n facecolor=\"gainsboro\")\n\nplt.imshow(dsw2)\nplt.show()", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#requirements", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#requirements", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Requirements", - "text": "Requirements\n\n1. Earthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\n2. netrc File\n\nYou will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\n\n3. PO.DAAC Data Downloader\n\nTo download the data via command line, this tutorial uses PO.DAAC’s Data Downloader. The downloader can be installed using these instructions The Downloader is useful if you need to download PO.DAAC data once in a while or prefer to do it “on-demand”. The Downloader makes no assumptions about the last time run or what is new in the archive, it simply uses the provided requests and downloads all matching data.", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#mosaic-multiple-opera-layers", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#mosaic-multiple-opera-layers", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Mosaic Multiple OPERA Layers", + "text": "Mosaic Multiple OPERA Layers\nWhen creating a mosaic, make sure the temporal range is correct/matching.\nThe mosaic is being created because we have 4 results from the bounding box area provided. If you receive more than 1 result and would like to see a single raster image of all the results, mosaicking is the solution. We define the function below to merge the tiff files for each date and return the composite raster into memory.\n\ndef raster2mosaic(date):\n datasets = []\n for file in date:\n file_path = f\"{file}\"\n file_obj = fs_s3.open(file_path)\n dataset = rio.open(file_obj)\n datasets.append(dataset)\n mosaic, output = merge(datasets) #the merge function will mosaic the raster images\n \n #Saving the output of the mosaicked raster image to memory\n memfile = MemoryFile()\n with memfile.open(driver='GTiff', count = 1, width= mosaic.shape[1], height=mosaic.shape[2] , dtype=np.uint8, transform=output) as dst:\n dst.write(mosaic)\n mosaic_bytes = memfile.read()\n with MemoryFile(mosaic_bytes) as memfile:\n dataset1 = memfile.open()\n raster = dataset1.read(1)\n return raster\n\n\naprilmos = raster2mosaic(april)\naugustmos = raster2mosaic(august)", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#learning-objectives", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#learning-objectives", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nIntroduction to the PO.DAAC Data Downloader\nLearn how to plot the SSTA for the ENSO 3.4 Region and a timeseries", + "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-mosaic", + "href": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-mosaic", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Visualizing the Mosaic", + "text": "Visualizing the Mosaic\nTo visualize the mosaic, you must utilize the single layer colormap.\nThis will be the ‘dsw’ variable used earlier to visualize a single layer. Similarly reading the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw3 = color_array[aprilmos]\n\n\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw4 = color_array[augustmos]\n\n\nfig = plt.figure(figsize=(20, 15))\n\nrows = 1\ncolumns = 2\n\n# Lake Powell 04/11/2023\nfig.add_subplot(rows, columns, 1)\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\nplt.imshow(dsw3)\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\n# Lake Powell 08/30/2023\nfig.add_subplot(rows, columns, 2)\nplt.title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\nplt.imshow(dsw4)\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nplt.show()\n\n\n\n\n\n\n\n\n\nTo take a closer look at a specific area of the image, we can create an inset map of a specified area.\n\nfig, ax = plt.subplots(1, 2, figsize=(20, 15))\n\nax[0].imshow(dsw3)\nax[0].set_title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\nax_ins1 = ax[0].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins1.imshow(dsw3)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins1.set_xlim(x1, x2)\nax_ins1.set_ylim(y1, y2)\nax_ins1.set_xticklabels('')\nax_ins1.set_yticklabels('')\n\nax[0].indicate_inset_zoom(ax_ins1, edgecolor='black')\n\nax[1].imshow(dsw4)\nax[1].set_title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nax_ins2 = ax[1].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins2.imshow(dsw4)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins2.set_xlim(x1, x2)\nax_ins2.set_ylim(y1, y2)\nax_ins2.set_xticklabels('')\nax_ins2.set_yticklabels('')\n\nax[1].indicate_inset_zoom(ax_ins2, edgecolor='black')\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nChange Detection\nFurther analysis can involve change detection between the two images, if any gains or losses occurred.\nLooking at the difference by subtracting the latest date to the oldest date.\n\ndifference = np.abs(augustmos - aprilmos)\n\nUtilizing numpy where; by setting the given condition and returning the satisfied conditions. e.g. numpy.where(condition, [x, y, ])\nIn this case, any non-zero values indicate the areas of change between the two images.\nValues closest to 1 shows the greatest gains in change and values closest to zero show the least amount of change.\n\nchange_map = np.where(difference > 0, 1, 0)\n\n\nfig, ax = plt.subplots(figsize=(15,10))\n\n# Defining and zooming into an ROI\nx1, y1, x2, y2 = 1000, 1000, 4500, 4500\nroi = change_map[y1:y2, x1:x2]\n\n# Inversing the colormap\noriginal_cmap = plt.get_cmap('magma')\nreversed_cmap = original_cmap.reversed()\n\nplt.imshow(roi, cmap=reversed_cmap)\nplt.colorbar()\nplt.title('Change Detection between 4/11/23 and 8/30/23')\n\nplt.show()", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#download-data-in-the-command-line-using-the-po.daac-data-downloader", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#download-data-in-the-command-line-using-the-po.daac-data-downloader", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Download Data in the Command Line using the PO.DAAC Data Downloader", - "text": "Download Data in the Command Line using the PO.DAAC Data Downloader\nIn your terminal, go to the folder you want to download the files to – this will be important to remember. You will need to put your path name in the code below. Copy and paste each line (below) into your terminal. If you have all the prerequisites, the files will download to your folder:\npodaac-data-downloader -h\n\npodaac-data-subscriber -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2022-12-1T00:00:00Z -ed 2023-04-24T23:59:00Z -d .", + "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#summary", + "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#summary", + "title": "Access SWOT L2 Oceanography Data in AWS Cloud", + "section": "Summary", + "text": "Summary\nThis notebook will show direct access of PO.DAAC archived products in the Earthdata Cloud in AWS Simple Storage Service (S3). In this demo, we will showcase the usage of SWOT Level 2 Low Rate products:\n\nSWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product - shortname SWOT_L2_LR_SSH_2.0\nSWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0 - shortname SWOT_L2_NALT_IGDR_SSHA_2.0\n\nThis is a subcollection of the parent collection: SWOT_L2_NALT_IGDR_2.0\n\nSWOT Level 2 Radiometer Data Products - overview of all\n\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF files into a single xarray dataset.\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2 region.\nThis instance will cost approximately $0.0832 per hour. The entire demo can run in considerably less time.\n\n\nLearning Objectives:\n\nauthenticate for earthaccess Python Library using your NASA Earthdata Login\naccess DAAC data directly from the in-region S3 bucket without moving or downloading any files to your local (cloud) workspace\nplot the first time step in the data\n\nNote: no files are being downloaded off the cloud, rather, we are working with the data in the AWS cloud.\n\n\nLibraries Needed:\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Oceanography", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#import-packages", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#import-packages", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Import Packages", - "text": "Import Packages\n\n# Import packages \nimport numpy as np\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nimport xarray as xr\nimport matplotlib.ticker as mticker\nimport netCDF4 as nc\nimport numpy as np\nimport datetime as dt\nimport glob\nimport hvplot.xarray\nimport pandas as pd\n\n\n\n\n\n\n\n\n\n\nInput your folder directory where you used the Downloader to store the data\n\ndir = '/Users/your_user_name/folder_name/'", + "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", + "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", + "title": "Access SWOT L2 Oceanography Data in AWS Cloud", + "section": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product", + "text": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product\nOutlined below is a map of the different KaRIn Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nAccess Files without any Downloads to your running instance\nHere, we use the earthaccess Python library to search for and then load the data directly into xarray without downloading any files. This dataset is currently restricted to a select few people, and can only be accessed using the version of earthaccess reinstalled above. If zero granules are returned, make sure the correct version ‘0.5.4’ is installed.\n\n#retrieves granule from the day we want\nkarin_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_EXPERT_2.0', \n temporal = (\"2024-02-01 12:00:00\", \"2024-02-01 19:43:00\"))\n\nGranules found: 10\n\n\n\n\nOpen with xarray\nThe files we are looking at are about 11-13 MB each. So the 10 we’re looking to access are about ~100 MB total.\n\n#opens granules and load into xarray dataset\nds = xr.open_mfdataset(earthaccess.open(karin_results), combine='nested', concat_dim=\"num_lines\", decode_times=False, engine='h5netcdf')\nds\n\nOpening 10 granules, approx size: 0.32 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 4GB\nDimensions: (num_lines: 98660, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-02-03T22:27:17Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 76.4772191457865\n ssha_variance: 0.4263933333980923\n references: V1.2.1\n equator_longitude: -5.36xarray.DatasetDimensions:num_lines: 98660num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nData variables: (98)time(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timecalendar :gregoriantai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ntime_tai(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregoriantai_utc_difference :37.0units :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nobject numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nswh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_model(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_alt_rate(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n385.39 kiB\n38.54 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npole_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndac(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_rate(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nice_conc(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-02-03T22:27:17Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :10pass_number :210equator_time :2024-02-01T11:57:39.935000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-02-01T11:31:57.844839time_coverage_end :2024-02-01T12:23:25.880560geospatial_lon_min :270.91792399999997geospatial_lon_max :78.362457geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :270.91792399999997left_first_latitude :78.27200599999999left_last_longitude :78.343086left_last_latitude :-77.05370099999999right_first_longitude :270.93575right_first_latitude :77.053837right_last_longitude :78.36245699999999right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_010_210_20240201T113154_20240201T122329_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP010_209_20240201_104031_20240201_113158.nc, SWOT_IPN_2PfP010_210_20240201_113158_20240201_122325.nc, SWOT_IPN_2PfP010_211_20240201_122325_20240201_131452.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP010_209_20240201_104027_20240201_113202_PIC0_01.nc, SWOT_IPRAD_2PaP010_210_20240201_113154_20240201_122329_PIC0_01.nc, SWOT_IPRAD_2PaP010_211_20240201_122321_20240201_131455_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240131T233132_20240201T233223_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240202_103657_20240131_225923_20240202_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_PMA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_PMA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_WEA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_WEA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_VWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_UWA_AXVCNE20240202_030828_20240201_180000_20240201_180000, SMM_VWA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240201_174042_20240201_060000_20240201_060000, SMM_PSA_AXVCNE20240201_174042_20240201_120000_20240201_120000, SMM_PSA_AXVCNE20240202_054023_20240201_180000_20240201_180000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_T2M_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_T2M_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CWV_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CWV_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CLW_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CLW_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_SWH_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_SWH_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_gim_files :JPLQ0320.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240203_020000_19900101_000000_20240801_000000xref_dac_files :SMM_MOG_AXPCNE20240201_203002_20240201_060000_20240201_060000, SMM_MOG_AXPCNE20240201_203002_20240201_120000_20240201_120000, SMM_MOG_AXPCNE20240202_074502_20240201_180000_20240201_180000xref_precipitation_files :SMM_LSR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_CRR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grbxref_sea_ice_mask_files :SMM_ICS_AXFCNE20240202_042003_20240201_000000_20240201_235959.nc, SMM_ICN_AXFCNE20240202_041506_20240201_000000_20240201_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240202_072016_20240201_030000_20240202_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :76.4772191457865ssha_variance :0.4263933333980923references :V1.2.1equator_longitude :-5.36\n\n\n\n\nCross Over Calibration Correction\nIn order to get the corrected SSHA, we must compute a new column like the following:\n\nds['ssha_karin_corrected'] = ds.ssha_karin + ds.height_cor_xover\nds.ssha_karin_corrected\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'ssha_karin_corrected' (num_lines: 98660, num_pixels: 69)> Size: 54MB\ndask.array<add, shape=(98660, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixelsxarray.DataArray'ssha_karin_corrected'num_lines: 98660num_pixels: 69dask.array<chunksize=(9866, 69), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 43 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nCoordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nIndexes: (0)Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nds.ssha_karin_corrected.plot.pcolormesh(\n ax=ax, transform=ccrs.PlateCarree(), x=\"longitude\", y=\"latitude\", vmin = -1, vmax=1, cmap='coolwarm', add_colorbar=True\n)\nax.coastlines()", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Oceanography", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#open-and-plot-sea-surface-temperature-anomalies", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#open-and-plot-sea-surface-temperature-anomalies", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Open and Plot Sea Surface Temperature Anomalies", - "text": "Open and Plot Sea Surface Temperature Anomalies\n\n# Read the April 24 2023 NetCDF file\nds = xr.open_dataset(dir +'20230424090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc')\n\n# Extract the required variables\nlon = ds['lon']\nlat = ds['lat']\nsst_anomaly = ds['sst_anomaly']\n\n\n# Create the figure\nfig = plt.figure(figsize=(10, 10))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(-150, 10))\n\n\n# Plot the sst_anomaly data with vmin and vmax\npcm = ax.pcolormesh(ds.lon, ds.lat, ds.sst_anomaly[0], transform=ccrs.PlateCarree(), cmap='rainbow', vmin=-2, vmax=2)\n\n\n# Plot the equator line\nax.plot(np.arange(360), np.zeros((360)), transform=ccrs.PlateCarree(), color='black')\n\n\n# Define the El Niño 1 + 2 region\nenso_bounds_lon = [-90, -80, -80, -90, -90]\nenso_bounds_lat = [-10, -10, 0, 0, -10]\n# Plot the Enso region box\nax.plot(enso_bounds_lon, enso_bounds_lat, transform=ccrs.PlateCarree(), color='black', linewidth=2)\n\n\n# Define the El Niño 3 region\nenso_bounds_lon2 = [-150, -90, -90, -150, -150]\nenso_bounds_lat2 = [-5, -5, 5, 5, -5]\n# Plot great circle equations for Enso region 3 (accounts for the curve)\nfor i in range(4):\n circle_lon = np.linspace(enso_bounds_lon2[i], enso_bounds_lon2[i+1], 100)\n circle_lat = np.linspace(enso_bounds_lat2[i], enso_bounds_lat2[i+1], 100)\n ax.plot(circle_lon, circle_lat, transform=ccrs.PlateCarree(), color='brown', linestyle='--', linewidth=2)\n\n\n# Add coastlines and gridlines\nax.add_feature(cfeature.COASTLINE)\nax.add_feature(cfeature.LAND, facecolor='gray')\nax.add_feature(cfeature.LAKES)\nax.add_feature(cfeature.RIVERS)\n\n\n#Set tick locations and labels for the colorbar\ncbar = plt.colorbar(pcm, ax=ax, orientation='horizontal', pad=0.05, fraction=0.04)\ncbar.set_label('SST Anomaly', color = 'white')\ncbar.set_ticks([-2, -1, 0, 1, 2])\ncbar.set_ticklabels([-2, -1, 0, 1, 2]) \ncbar.ax.tick_params(color='white')\ncbar.ax.xaxis.set_ticklabels(cbar.ax.get_xticks(), color='white')\ncbar.ax.yaxis.set_ticklabels(cbar.ax.get_yticks(), color='white')\n\n\n# Add white text on top left and right\nfig.text(0.02, 0.95, 'APR 24 2023', color='white', fontsize=20, ha='left', va='top')\nfig.text(0.98, 0.95, 'MUR SSTA', color='white', fontsize=20, ha='right', va='top')\n\n\n# #Background set to black\nfig.set_facecolor('black')\n\n\nplt.show()", + "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", + "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", + "title": "Access SWOT L2 Oceanography Data in AWS Cloud", + "section": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0", + "text": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0\nOutlined below is a map of the different Nadir Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nAccess Files without any Downloads to your running instance\nHere, we use the earthaccess Python library to search for and then load the data directly into xarray without downloading any files.\n\n#retrieves granule from the day we want\nnadir_results = earthaccess.search_data(short_name = 'SWOT_L2_NALT_IGDR_SSHA_2.0', temporal = (\"2024-01-30 12:00:00\", \"2024-01-30 19:43:00\"))\n\nGranules found: 10\n\n\n\nfor g in nadir_results:\n print(earthaccess.results.DataGranule.data_links(g, access='direct'))\n\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc']\n\n\n\n#opens granules and load into xarray dataset, for xarray to work, make sure 'group' is specified.\nds_nadir = xr.open_mfdataset(earthaccess.open(nadir_results), combine='nested', concat_dim=\"time\", decode_times=False, engine='h5netcdf', group='data_01')\nds_nadir\n\nOpening 10 granules, approx size: 0.0 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 6MB\nDimensions: (time: 27927)\nCoordinates:\n * time (time) float64 223kB 7.599e+08 ... 7.6...\n latitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n longitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\nData variables: (12/31)\n time_tai (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n surface_classification_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_1_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_2_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n alt_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n ... ...\n pole_tide (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n internal_tide_hret (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt_mle3 (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_water_vapor (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_cloud_liquid_water (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>xarray.DatasetDimensions:time: 27927Coordinates: (3)time(time)float647.599e+08 7.599e+08 ... 7.6e+08long_name :time in UTCstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute [leap_second] is set to the UTC time at which the leap second occurstai_utc_difference :37.0leap_second :0000-00-00 00:00:00array([7.599295e+08, 7.599295e+08, 7.599295e+08, ..., 7.599603e+08,\n 7.599603e+08, 7.599603e+08])latitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :latitudestandard_name :latitudeunits :degrees_northcomment :Positive latitude is North latitude, negative latitude is South latitude. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nlongitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :longitudestandard_name :longitudeunits :degrees_eastcomment :East longitude relative to Greenwich meridian. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nData variables: (31)time_tai(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsurface_classification_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :surface classificationflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]comment :Computed from a mask built with MODIS and GlobCover data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from first radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from second radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nalt_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all altimeter flags except altimeter echo type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all radiometer flags except radiometer surface type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ngeo_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geophysical quality flagflag_meanings :good badflag_values :[0 1]comment :Check on validity of all geophysical fields : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmeteo_map_availability_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ECMWF meteorological map availabilityflag_meanings :2_maps_nominal 2_maps_degraded 1_map_closest_used no_valid_mapflag_values :[0 1 2 3]comment :Possible values are: 0 meaning ’2 maps, nominal’ (six hours apart), 1 meaning ’2 maps, degraded’ (more than six hours apart), 2 meaning ’1 map, closest map used’, 3 meaning ’no valid map’\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor_interp_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correction interpolation quality flagflag_meanings :good degraded badflag_values :[0 1 2]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :rain flagflag_meanings :no_rain rain high_rain_probability_from_altimeter high_probability_of_no_rain_from_altimeter ambiguous_situation_possibility_of_ice evaluation_not_possibleflag_values :[0 1 2 3 4 5]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from first radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from second radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ice flagflag_meanings :no_ice iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from first radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from second radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\naltitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :1 Hz altitude of satellitestandard_name :height_above_reference_ellipsoidunits :mcomment :Altitude of satellite above the reference ellipsoid. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmodel_dry_tropo_cor_zero_altitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :model dry tropospheric correction at zero altitudestandard_name :altimeter_range_correction_due_to_dry_tropospheresource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at Mean Sea Level Pressure at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. A dry tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for dry tropospheric range delays of the radar pulse. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correctionstandard_name :altimeter_range_correction_due_to_wet_tropospheresource :AMRinstitution :NASA/JPLunits :mcomment :A wet tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for wet tropospheric range delays of the radar pulse\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_sea_surface_cnescls(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS solution) above reference ellipsoidsource :MSS_CNES_CLS-2015institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_dynamic_topography(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean dynamic topography above geoidsource :MDT_CNES_CLS-2018institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndepth_or_elevation(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ocean depth/land elevationsource :ACE2institution :EAPRS Laboratoryunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninv_bar_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :inverted barometer height correctionstandard_name :sea_surface_height_correction_due_to_air_pressure_at_low_frequencysource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndac(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :dynamic atmospheric correctioninstitution :LEGOS/CLS/CNESunits :mcomment :Sum of the high frequency fluctuations correction and of the low frequency inverted barometer correction (inv_bar_cor). See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nocean_tide_fes(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric ocean tide height (FES solution)standard_name :sea_surface_height_amplitude_due_to_geocentric_ocean_tidesource :FES2014binstitution :LEGOS/NOVELTIS/CNES/CLSunits :mcomment :Includes the equilibrium long-period ocean tide height and only the short-period part of the corresponding loading tide. The permanent tide (zero frequency) is not included in this parameter because it is included in the geoid and mean sea surface (geoid, mean_sea_surface_cnescls). To get the total geocentric tide height (FES solution), do: ocean_tide_fes + ocean_tide_non_eq. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsolid_earth_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :solid earth tide heightstandard_name :sea_surface_height_amplitude_due_to_earth_tidesource :Cartwright and Edden [1973] Corrected tables of tidal harmonics - J. Geophys. J. R. Astr. Soc., 33, 253-264.units :mcomment :Calculated using Cartwright and Tayler tables and consisting of the second and third degree constituents. The permanent tide (zero frequency) is not included. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\npole_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric pole tide heightstandard_name :sea_surface_height_amplitude_due_to_pole_tidesource :Desai, S., Wahr, J. & Beckley, B. J Geod [2015] 89: 1233units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninternal_tide_hret(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :internal tide heightsource :E. D. Zaron. Baroclinic tidal sea level from exact-repeat mission altimetry. Journal of Physical Oceanography, 49(1):193-210, 2019.units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speedstandard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.06 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt_mle3(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speed (MLE3 retracking)standard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.109 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean_mle3) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_water_vapor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer water vapor contentstandard_name :atmosphere_water_vapor_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_cloud_liquid_water(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer liquid water contentstandard_name :atmosphere_cloud_liquid_water_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(Index([759929456.5671339, 759929457.6690049, 759929458.770874,\n 759929459.872746, 759929460.9746141, 759929462.0764852,\n 759929463.1783538, 759929464.2802248, 759929465.3820939,\n 759929466.4839649,\n ...\n 759960314.5902781, 759960315.6921468, 759960316.7940178,\n 759960317.8958869, 759960318.9977579, 759960320.099627,\n 759960321.201498, 759960322.3033671, 759960323.4052382,\n 759960324.5071082],\n dtype='float64', name='time', length=27927))Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nax.coastlines()\nplt.scatter(x=ds_nadir.longitude, y=ds_nadir.latitude, c=ds_nadir.depth_or_elevation, marker='.')\nplt.colorbar().set_label('Depth or Elevation (m)')", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Oceanography", + "Cloud" ] }, { - "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#plot-a-time-series-of-mur-ssta", - "href": "notebooks/datasets/enso_MUR_tutorial_final.html#plot-a-time-series-of-mur-ssta", - "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", - "section": "Plot a Time Series of MUR SSTA", - "text": "Plot a Time Series of MUR SSTA\n\n# Open data from December to April\nds2 = xr.open_mfdataset(dir + '20*.nc*', combine='by_coords')\n\n# Grab the time values\ntimes = ds2.time.values\n\n# Select the El Niño 1+2 region\nsubset_ds = ds2.sel(lat=slice(-10, 0)).sel(lon=slice(-90, -80))\n\n# Select ssta for El Niño 1+2 region\ndata = subset_ds.sst_anomaly.values\ndata_means = [np.nanmean(step) for step in data]\n\n# Select the El Niño 3 region\nsubset_ds2 = ds2.sel(lat=slice(-5, 5)).sel(lon=slice(-150, -90)) \ndata2 = subset_ds2.sst_anomaly.values\ndata_means2 = [np.nanmean(step) for step in data2]\n\n# Plot the figure with labels\nfig = plt.figure(figsize=(20,6))\nplt.title('MUR SST Anomaly in El Niño 1+2 and El Niño 3 Regions', fontsize=20)\nplt.ylabel('Anomaly in Degrees C', fontsize=16)\nplt.tick_params(labelsize=12) \nplt.grid(True)\n\nplt.plot(times, data_means, color='black', linewidth=4, label='Niño 1+2')\nplt.plot(times, data_means2[:len(times)], color='brown', linewidth=4, linestyle='--', label='Niño 3')\n\nplt.ylim(-4, 4)\n\n# Add legend with labels\nplt.legend(fontsize=16) \n\n# Increase label size\nplt.xticks(fontsize=16)\nplt.yticks(fontsize=16)\n\nplt.show()", + "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", + "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", + "title": "Access SWOT L2 Oceanography Data in AWS Cloud", + "section": "3. SWOT Level 2 Radiometer Datasets", + "text": "3. SWOT Level 2 Radiometer Datasets\nOutlined below is a map of the different Radiometer Data Products we host at PO.DAAC, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can search and visualize this dataset similar to the above datasets.", "crumbs": [ "Tutorials", "Dataset Specific", - "GHRSST", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Oceanography", + "Cloud" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#summary", - "href": "notebooks/datasets/smap_imerg_tutorial.html#summary", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Summary:", - "text": "Summary:\nThis tutorial uses the Earthdata Search (https://search.earthdata.nasa.gov/) to download the data on your local machine. You will need to create an account in order to download the data.", + "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#a-final-word", + "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#a-final-word", + "title": "Access SWOT L2 Oceanography Data in AWS Cloud", + "section": "A final word…", + "text": "A final word…\nAccessing data completely from S3 and in memory are affected by various things.\n\nThe format of the data - archive formats like NetCDF, GEOTIFF, HDF vs cloud optimized data structures (Zarr, kerchunk, COG). Cloud formats are made for accessing only the pieces of data of interest needed at the time of the request (e.g. a subset, timestep, etc).\nTools like xarray make a lot of assumptions about how to open and read a file. Sometimes the internals don’t fit the xarray ‘mould’ and we need to continue to work with data providers and software providers to make these two sides work together. Level 2 data (non-gridded), specifically, suffers from some of the assumptions made.", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Oceanography", + "Cloud" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#datasets", - "href": "notebooks/datasets/smap_imerg_tutorial.html#datasets", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Datasets:", - "text": "Datasets:\n\nJPL SMAP L3 Dataset: https://podaac.jpl.nasa.gov/dataset/SMAP_JPL_L3_SSS_CAP_8DAY-RUNNINGMEAN_V5?ids=&values=&search=Smap Level 3&provider=POCLOUD\nGPM IMERG Late Precipitation: https://disc.gsfc.nasa.gov/datasets/GPM_3IMERGDL_06/summary?keywords=gpm imerg", + "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#local-machine-download-version", + "href": "notebooks/datasets/OPERA_GIS_Notebook.html#local-machine-download-version", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Local Machine Download Version", + "text": "Local Machine Download Version\n\nAuthor: Nicholas Tarpinian, PO.DAAC", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Local" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#learning-objectives", - "href": "notebooks/datasets/smap_imerg_tutorial.html#learning-objectives", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Learning Objectives:", - "text": "Learning Objectives:\nUses python to plot the SMAP sea surface salinity anomalies over the ocean and the IMERG precipitation over the land.", + "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#summary-learning-objectives", + "href": "notebooks/datasets/OPERA_GIS_Notebook.html#summary-learning-objectives", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Summary & Learning Objectives", + "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with OPERA DSWx data on a local machine\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on users choice; either by classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’), etc.\nVisualizing the dataset based on its classified layer values.\nMosaicking multiple layers into a single GeoTIFF file.\nUtilizing Change Detection for further analysis.", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Local" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#import-needed-packages", - "href": "notebooks/datasets/smap_imerg_tutorial.html#import-needed-packages", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Import needed packages", - "text": "Import needed packages\n\nimport glob\nimport numpy as np\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom datetime import datetime\nimport os\n\n/opt/anaconda3/envs/plotting/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1\n warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"", + "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#requirements", + "href": "notebooks/datasets/OPERA_GIS_Notebook.html#requirements", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\n#from original notebook:\nimport requests\nimport json\nimport rasterio as rio\nfrom rasterio.plot import show\nfrom rasterio.merge import merge\nimport matplotlib.pyplot as plt\nfrom matplotlib.patches import Patch\nfrom mpl_toolkits.axes_grid1.inset_locator import inset_axes\nfrom mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes \nfrom mpl_toolkits.axes_grid1.inset_locator import mark_inset\nimport numpy as np\nfrom pathlib import Path\nimport os\nfrom urllib.request import urlretrieve\nfrom json import dumps\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Local" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#load-directories", - "href": "notebooks/datasets/smap_imerg_tutorial.html#load-directories", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Load directories", - "text": "Load directories\n\n#Replace with your directory \nbase_directory = \"/Users/username\" \n\n#Replace with your directory. This will be the output for plots\noutputpath = (os.path.join(base_directory, 'Desktop/plots/'))", + "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#authentication-with-earthaccess", + "href": "notebooks/datasets/OPERA_GIS_Notebook.html#authentication-with-earthaccess", + "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 11/19/2023\nUsing user provided credentials for EDL\nPersisting credentials to .netrc\n\n\n\nSearch using earthaccess for OPERA DSWx\nEach dataset has it’s own unique collection concept ID. For the OPERA_L3_DSWX-HLS_V1 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Powell Reservoir.\nWe used bbox finder to get the exact coordinates for our area of interest.\nWe want to look at two different times for comparison: 04/11/2023 and 08/30/2023. To find these dates, let’s search for all the data granules between the two.\nFinding 08/30/23 you must search a couple days after at 09/01/23 for when the product was generated for 08/30/23.\n\n#search for the granules using the short name\nresults = earthaccess.search_data(short_name=\"OPERA_L3_DSWX-HLS_V1\", temporal= (\"2023-04-11\",\"2023-09-01\"), bounding_box = ('-111.144811','36.980121','-110.250799','37.915625'))\n\nGranules found: 310\n\n\n\n\nGet desired links\nOPERA has 10 different available layers within each granule. Each granule consists of 10 files, one for each layer. We will only need one of these files since we are only looking at one layer.\nLet’s get the download links for the desired files. We want to query the dataset based on a specific classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’) as well as for the two dates (04/11/2023 and 08/30/2023).\nWe will look at ‘B01_WTR’ which is the Water Classification (WTR) layer of the OPERA DSWx dataset. Details on each available layer and the data product can be found here.\n\ntype(results[0])\n\nearthaccess.results.DataGranule\n\n\nHere, we see that the results output is in the DataGranule format, allowing us to to use the data_links call\n\n#add the necessary data to a list, here we are looking for B01_WTR layer and two dates specified earlier\ndownloads_04112023 = []\ndownloads_08302023 = []\n\nfor g in results:\n for l in earthaccess.results.DataGranule.data_links(g):\n if 'B01_WTR' in l:\n if '20230411' in l:\n downloads_04112023.append(l)\n if '20230830' in l:\n downloads_08302023.append(l)\n\nprint(len(downloads_04112023))\nprint(len(downloads_08302023))\n\n4\n4\n\n\nFor the B01_WTR layer, each date has 4 files\n\n\nDownload the Data into a folder\nSince we are looking at two seperate times, we create two folder path names, one for each date, so we can mosaic all the files within one folder based on its respective time range later.\n\n#download data into folder on local machine\nearthaccess.download(downloads_04112023, \"./data_downloads/OPERA_041123\")\nearthaccess.download(downloads_08302023, \"./data_downloads/OPERA_083023\")\n\nData should download into two folders seperated by date, each having four files.\n\n\nVisualizing the Dataset\nLet’s now visualize an individual layer for a single file that was downloaded using Rasterio to read the GeoTIFF image.\n\ndsw = rio.open('data_downloads/OPERA_041123/OPERA_L3_DSWx-HLS_T12SVG_20230411T180222Z_20230414T030945Z_L8_30_v1.0_B01_WTR.tif')\n\nOPERA is a single band image with specific classified rgb values.\nThis requires to read the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage = dsw.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw2 = color_array[image]\n\n\nfig, ax = plt.subplots(figsize=(15,10))\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nax.legend(handles=patches,\n bbox_to_anchor=(1.28, 1),\n facecolor=\"gainsboro\")\n\nplt.imshow(dsw2)\nplt.show()\n\n\n\n\n\n\n\n\n\n\nMosaic Multiple OPERA Layers\nWhen creating a mosaic, make sure the temporal range is correct/matching. We define the output directory for the mosaic GeoTIFFs below.\nThe mosaic is being created because we have 4 results from the bounding box area provided. If you receive more than 1 result and would like to see a single raster image of all the results, mosaicking is the solution.\n\nPath('data_downloads/mosaic_outputs').mkdir(parents=True, exist_ok=True)\noutput_path = 'data_downloads/mosaic_outputs'\n\nWe define a function to convert files per timestamp to mosaicked geoTIFFs.\n\ndef raster2mosaic(data_folder, output_path, output_file_name):\n raster_files = list(data_folder.iterdir())\n raster_to_mosaic_list = [] #create empty list\n for p in raster_files:\n raster = rio.open(p)\n raster_to_mosaic_list.append(raster)\n mosaic, output = merge(raster_to_mosaic_list) #the merge function will mosaic the raster images\n #Then we update the raster's metadata to match the width and height of the mosaic\n output_meta = raster.meta.copy()\n output_meta.update(\n {\"driver\": \"GTiff\",\n \"height\": mosaic.shape[1],\n \"width\": mosaic.shape[2],\n \"transform\": output\n }\n )\n #Save the output in a new mosaicked raster image\n with rio.open(os.path.join(output_path, output_file_name), 'w', **output_meta) as m:\n m.write(mosaic)\n\n\n#set data to a list for each of the two data sets\nfolder1 = Path(\"data_downloads/OPERA_041123\")\nfolder2 = Path(\"data_downloads/OPERA_083023\")\n\nraster2mosaic(folder1, output_path, 'mosaic_041123.tif')\nraster2mosaic(folder2, output_path, 'mosaic_083023.tif')\n\n\n\nVisualizing the Mosaic\nOpen the new mosaicked raster images individually with its respective paths.\n\nmos1 = rio.open(os.path.join(output_path, 'mosaic_041123.tif'))\nmos2 = rio.open(os.path.join(output_path, 'mosaic_083023.tif')) \n\nTo visualize the mosaic, you must utilize the single layer colormap.\nThis will be the ‘dsw’ variable used earlier to visualize a single layer. Similarly reading the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage1 = mos1.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw3 = color_array[image1]\n\n\nimage2 = mos2.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw4 = color_array[image2]\n\n\nfig = plt.figure(figsize=(20, 15))\n\nrows = 1\ncolumns = 2\n\n# Lake Powell 04/11/2023\nfig.add_subplot(rows, columns, 1)\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\nplt.imshow(dsw3)\n\n# Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\n# Lake Powell 08/30/2023\nfig.add_subplot(rows, columns, 2)\nplt.title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\nplt.imshow(dsw4)\n\n# Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nTo take a closer look at a specific area of the image, we can create an inset map of a specified area.\n\nfig, ax = plt.subplots(1, 2, figsize=(20, 15))\n\nax[0].imshow(dsw3)\nax[0].set_title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\nax_ins1 = ax[0].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins1.imshow(dsw3)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins1.set_xlim(x1, x2)\nax_ins1.set_ylim(y1, y2)\nax_ins1.set_xticklabels('')\nax_ins1.set_yticklabels('')\n\nax[0].indicate_inset_zoom(ax_ins1, edgecolor='black')\n\nax[1].imshow(dsw4)\nax[1].set_title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nax_ins2 = ax[1].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins2.imshow(dsw4)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins2.set_xlim(x1, x2)\nax_ins2.set_ylim(y1, y2)\nax_ins2.set_xticklabels('')\nax_ins2.set_yticklabels('')\n\nax[1].indicate_inset_zoom(ax_ins2, edgecolor='black')\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nChange Detection\nFurther analysis can involve change detection between the two images, if any gains or losses occurred.\nLooking at the difference by subtracting the latest date to the oldest date.\n\ndifference = np.abs(image2 - image1)\n\nUtilizing numpy where; by setting the given condition and returning the satisfied conditions. e.g. numpy.where(condition, [x, y, ])\nIn this case, any non-zero values indicate the areas of change between the two images.\nValues closest to 1 shows the greatest gains in change and values closest to zero show the least amount of change.\n\nchange_map = np.where(difference > 0, 1, 0)\n\n\nfig, ax = plt.subplots(figsize=(15,10))\n\n# Defining and zooming into an ROI\nx1, y1, x2, y2 = 1000, 1000, 4500, 4500\nroi = change_map[y1:y2, x1:x2]\n\n# Inversing the colormap\noriginal_cmap = plt.get_cmap('magma')\nreversed_cmap = original_cmap.reversed()\n\nplt.imshow(roi, cmap=reversed_cmap)\nplt.colorbar()\nplt.title('Change Detection between 4/11/23 and 8/30/23')\n\nplt.show()", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "OPERA", + "Visualization and Mosaicking", + "Local" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#open-subset_location-the-smap-sss-data-for-a-specified-subset", - "href": "notebooks/datasets/smap_imerg_tutorial.html#open-subset_location-the-smap-sss-data-for-a-specified-subset", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Open subset_location the SMAP SSS data for a specified subset", - "text": "Open subset_location the SMAP SSS data for a specified subset\n\n#the subset used to determine which values are plotted\nsubset_bounds = ['20221226', '20230116'] \n\n#calculates the mean over the same time period as the plotted values\nsubset_mean_bounds = subset_bounds \n\n#Replace with your directory of SMAP files\nallsubset_files = xr.open_mfdataset(os.path.join(base_directory, 'Desktop/JPL_SMAP_L3/SMAP*.nc*'))\n\n\n#grabs smap data from 12-26-2015 to 01-16-2023\nallsubset_files = allsubset_files.sel(time=(allsubset_files['time'].dt.strftime('%m%d') >= subset_mean_bounds[0][4:8]) | (allsubset_files['time'].dt.strftime('%m%d') <= subset_mean_bounds[1][4:8]))\nallsubset_files['time'].values\n\narray(['2015-12-26T12:00:00.000000000', '2015-12-27T12:00:00.000000000',\n '2015-12-28T12:00:00.000000000', '2015-12-29T12:00:00.000000000',\n '2015-12-30T12:00:00.000000000', '2015-12-31T12:00:00.000000000',\n '2016-01-01T12:00:00.000000000', '2016-01-02T12:00:00.000000000',\n '2016-01-03T12:00:00.000000000', '2016-01-04T12:00:00.000000000',\n '2016-01-05T12:00:00.000000000', '2016-01-06T12:00:00.000000000',\n '2016-01-07T12:00:00.000000000', '2016-01-08T12:00:00.000000000',\n '2016-01-09T12:00:00.000000000', '2016-01-10T12:00:00.000000000',\n '2016-01-11T12:00:00.000000000', '2016-01-12T12:00:00.000000000',\n '2016-01-13T12:00:00.000000000', '2016-01-14T12:00:00.000000000',\n '2016-01-15T12:00:00.000000000', '2016-01-16T12:00:00.000000000',\n '2016-12-26T12:00:00.000000000', '2016-12-27T12:00:00.000000000',\n '2016-12-28T12:00:00.000000000', '2016-12-29T12:00:00.000000000',\n '2016-12-30T12:00:00.000000000', '2016-12-31T12:00:00.000000000',\n '2017-01-01T12:00:00.000000000', '2017-01-02T12:00:00.000000000',\n '2017-01-03T12:00:00.000000000', '2017-01-04T12:00:00.000000000',\n '2017-01-05T12:00:00.000000000', '2017-01-06T12:00:00.000000000',\n '2017-01-07T12:00:00.000000000', '2017-01-08T12:00:00.000000000',\n '2017-01-09T12:00:00.000000000', '2017-01-10T12:00:00.000000000',\n '2017-01-11T12:00:00.000000000', '2017-01-12T12:00:00.000000000',\n '2017-01-13T12:00:00.000000000', '2017-01-14T12:00:00.000000000',\n '2017-01-15T12:00:00.000000000', '2017-01-16T12:00:00.000000000',\n '2017-12-26T12:00:00.000000000', '2017-12-27T12:00:00.000000000',\n '2017-12-28T12:00:00.000000000', '2017-12-29T12:00:00.000000000',\n '2017-12-30T12:00:00.000000000', '2017-12-31T12:00:00.000000000',\n '2018-01-01T12:00:00.000000000', '2018-01-02T12:00:00.000000000',\n '2018-01-03T12:00:00.000000000', '2018-01-04T12:00:00.000000000',\n '2018-01-05T12:00:00.000000000', '2018-01-06T12:00:00.000000000',\n '2018-01-07T12:00:00.000000000', '2018-01-08T12:00:00.000000000',\n '2018-01-09T12:00:00.000000000', '2018-01-10T12:00:00.000000000',\n '2018-01-11T12:00:00.000000000', '2018-01-12T12:00:00.000000000',\n '2018-01-13T12:00:00.000000000', '2018-01-14T12:00:00.000000000',\n '2018-01-15T12:00:00.000000000', '2018-01-16T12:00:00.000000000',\n '2018-12-26T12:00:00.000000000', '2018-12-27T12:00:00.000000000',\n '2018-12-28T12:00:00.000000000', '2018-12-29T12:00:00.000000000',\n '2018-12-30T12:00:00.000000000', '2018-12-31T12:00:00.000000000',\n '2019-01-01T12:00:00.000000000', '2019-01-02T12:00:00.000000000',\n '2019-01-03T12:00:00.000000000', '2019-01-04T12:00:00.000000000',\n '2019-01-05T12:00:00.000000000', '2019-01-06T12:00:00.000000000',\n '2019-01-07T12:00:00.000000000', '2019-01-08T12:00:00.000000000',\n '2019-01-09T12:00:00.000000000', '2019-01-10T12:00:00.000000000',\n '2019-01-11T12:00:00.000000000', '2019-01-12T12:00:00.000000000',\n '2019-01-13T12:00:00.000000000', '2019-01-14T12:00:00.000000000',\n '2019-01-15T12:00:00.000000000', '2019-01-16T12:00:00.000000000',\n '2019-12-26T12:00:00.000000000', '2019-12-27T12:00:00.000000000',\n '2019-12-28T12:00:00.000000000', '2019-12-29T12:00:00.000000000',\n '2019-12-30T12:00:00.000000000', '2019-12-31T12:00:00.000000000',\n '2020-01-01T12:00:00.000000000', '2020-01-02T12:00:00.000000000',\n '2020-01-03T12:00:00.000000000', '2020-01-04T12:00:00.000000000',\n '2020-01-05T12:00:00.000000000', '2020-01-06T12:00:00.000000000',\n '2020-01-07T12:00:00.000000000', '2020-01-08T12:00:00.000000000',\n '2020-01-09T12:00:00.000000000', '2020-01-10T12:00:00.000000000',\n '2020-01-11T12:00:00.000000000', '2020-01-12T12:00:00.000000000',\n '2020-01-13T12:00:00.000000000', '2020-01-14T12:00:00.000000000',\n '2020-01-15T12:00:00.000000000', '2020-01-16T12:00:00.000000000',\n '2020-12-26T12:00:00.000000000', '2020-12-27T12:00:00.000000000',\n '2020-12-28T12:00:00.000000000', '2020-12-29T12:00:00.000000000',\n '2020-12-30T12:00:00.000000000', '2020-12-31T12:00:00.000000000',\n '2021-01-01T12:00:00.000000000', '2021-01-02T12:00:00.000000000',\n '2021-01-03T12:00:00.000000000', '2021-01-04T12:00:00.000000000',\n '2021-01-05T12:00:00.000000000', '2021-01-06T12:00:00.000000000',\n '2021-01-07T12:00:00.000000000', '2021-01-08T12:00:00.000000000',\n '2021-01-09T12:00:00.000000000', '2021-01-10T12:00:00.000000000',\n '2021-01-11T12:00:00.000000000', '2021-01-12T12:00:00.000000000',\n '2021-01-13T12:00:00.000000000', '2021-01-14T12:00:00.000000000',\n '2021-01-15T12:00:00.000000000', '2021-01-16T12:00:00.000000000',\n '2021-12-26T12:00:00.000000000', '2021-12-27T12:00:00.000000000',\n '2021-12-28T12:00:00.000000000', '2021-12-29T12:00:00.000000000',\n '2021-12-30T12:00:00.000000000', '2021-12-31T12:00:00.000000000',\n '2022-01-01T12:00:00.000000000', '2022-01-02T12:00:00.000000000',\n '2022-01-03T12:00:00.000000000', '2022-01-04T12:00:00.000000000',\n '2022-01-05T12:00:00.000000000', '2022-01-06T12:00:00.000000000',\n '2022-01-07T12:00:00.000000000', '2022-01-08T12:00:00.000000000',\n '2022-01-09T12:00:00.000000000', '2022-01-10T12:00:00.000000000',\n '2022-01-11T12:00:00.000000000', '2022-01-12T12:00:00.000000000',\n '2022-01-13T12:00:00.000000000', '2022-01-14T12:00:00.000000000',\n '2022-01-15T12:00:00.000000000', '2022-01-16T12:00:00.000000000',\n '2022-12-26T12:00:00.000000000', '2022-12-27T12:00:00.000000000',\n '2022-12-28T12:00:00.000000000', '2022-12-29T12:00:00.000000000',\n '2022-12-30T12:00:00.000000000', '2022-12-31T12:00:00.000000000',\n '2023-01-01T12:00:00.000000000', '2023-01-02T12:00:00.000000000',\n '2023-01-03T12:00:00.000000000', '2023-01-04T12:00:00.000000000',\n '2023-01-05T12:00:00.000000000', '2023-01-06T12:00:00.000000000',\n '2023-01-07T12:00:00.000000000', '2023-01-08T12:00:00.000000000',\n '2023-01-09T12:00:00.000000000', '2023-01-10T12:00:00.000000000',\n '2023-01-11T12:00:00.000000000', '2023-01-12T12:00:00.000000000',\n '2023-01-13T12:00:00.000000000', '2023-01-14T12:00:00.000000000',\n '2023-01-15T12:00:00.000000000', '2023-01-16T12:00:00.000000000'],\n dtype='datetime64[ns]')", + "objectID": "notebooks/datasets/MUR_SST_Washington_Comparison.html", + "href": "notebooks/datasets/MUR_SST_Washington_Comparison.html", + "title": "MUR Sea Surface Temperature Analysis of Washington State", + "section": "", + "text": "From the PO.DAAC Cookbook, to access the GitHub version of the notebook, follow this link.\n\n\nMUR Sea Surface Temperature Analysis of Washington State\n\nRequirement:\n\nCompute environment\n\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\nEarthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nLearning Objectives:\n\nAccess cloud-stored MUR Global SST data within AWS cloud, without downloading it to your local machine\nVisualize and analyze data in a use case example\nUse earthaccess library to search for, access, and download the data\n\n\n\nGHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1) Dataset:\n\nMUR-JPL-L4-GLOB-v4.1\n\n\nDOI: https://doi.org/10.5067/GHGMR-4FJ04\n\nNotebook Author: Zoë Walschots, NASA PO.DAAC (Aug 2023)\n\n\nImport Packages\n\nimport h5netcdf\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeat\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n\n\n\n\n\n\n\n\n\n\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\n\n\nAccess and Visualize Data\nLet’s look at the Sea Surface Temperature of first summer we have data for (2012) using earthaccess\n\nmur_results = earthaccess.search_data(short_name = 'MUR-JPL-L4-GLOB-v4.1', temporal = ('2012-05-21', '2012-08-20'), bounding_box = ('-125.41992','45.61181','-116.64844','49.2315'))\n\nGranules found: 92\n\n\n\nds_mur = xr.open_mfdataset(earthaccess.open(mur_results), engine = 'h5netcdf')\nds_mur\n\n Opening 92 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 92, lat: 17999, lon: 36000)\nCoordinates:\n * time (time) datetime64[ns] 2012-05-21T09:00:00 ... 2012-08-2...\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.5\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 92lat: 17999lon: 36000Coordinates: (3)time(time)datetime64[ns]2012-05-21T09:00:00 ... 2012-08-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2012-05-21T09:00:00.000000000', '2012-05-22T09:00:00.000000000',\n '2012-05-23T09:00:00.000000000', '2012-05-24T09:00:00.000000000',\n '2012-05-25T09:00:00.000000000', '2012-05-26T09:00:00.000000000',\n '2012-05-27T09:00:00.000000000', '2012-05-28T09:00:00.000000000',\n '2012-05-29T09:00:00.000000000', '2012-05-30T09:00:00.000000000',\n '2012-05-31T09:00:00.000000000', '2012-06-01T09:00:00.000000000',\n '2012-06-02T09:00:00.000000000', '2012-06-03T09:00:00.000000000',\n '2012-06-04T09:00:00.000000000', '2012-06-05T09:00:00.000000000',\n '2012-06-06T09:00:00.000000000', '2012-06-07T09:00:00.000000000',\n '2012-06-08T09:00:00.000000000', '2012-06-09T09:00:00.000000000',\n '2012-06-10T09:00:00.000000000', '2012-06-11T09:00:00.000000000',\n '2012-06-12T09:00:00.000000000', '2012-06-13T09:00:00.000000000',\n '2012-06-14T09:00:00.000000000', '2012-06-15T09:00:00.000000000',\n '2012-06-16T09:00:00.000000000', '2012-06-17T09:00:00.000000000',\n '2012-06-18T09:00:00.000000000', '2012-06-19T09:00:00.000000000',\n '2012-06-20T09:00:00.000000000', '2012-06-21T09:00:00.000000000',\n '2012-06-22T09:00:00.000000000', '2012-06-23T09:00:00.000000000',\n '2012-06-24T09:00:00.000000000', '2012-06-25T09:00:00.000000000',\n '2012-06-26T09:00:00.000000000', '2012-06-27T09:00:00.000000000',\n '2012-06-28T09:00:00.000000000', '2012-06-29T09:00:00.000000000',\n '2012-06-30T09:00:00.000000000', '2012-07-01T09:00:00.000000000',\n '2012-07-02T09:00:00.000000000', '2012-07-03T09:00:00.000000000',\n '2012-07-04T09:00:00.000000000', '2012-07-05T09:00:00.000000000',\n '2012-07-06T09:00:00.000000000', '2012-07-07T09:00:00.000000000',\n '2012-07-08T09:00:00.000000000', '2012-07-09T09:00:00.000000000',\n '2012-07-10T09:00:00.000000000', '2012-07-11T09:00:00.000000000',\n '2012-07-12T09:00:00.000000000', '2012-07-13T09:00:00.000000000',\n '2012-07-14T09:00:00.000000000', '2012-07-15T09:00:00.000000000',\n '2012-07-16T09:00:00.000000000', '2012-07-17T09:00:00.000000000',\n '2012-07-18T09:00:00.000000000', '2012-07-19T09:00:00.000000000',\n '2012-07-20T09:00:00.000000000', '2012-07-21T09:00:00.000000000',\n '2012-07-22T09:00:00.000000000', '2012-07-23T09:00:00.000000000',\n '2012-07-24T09:00:00.000000000', '2012-07-25T09:00:00.000000000',\n '2012-07-26T09:00:00.000000000', '2012-07-27T09:00:00.000000000',\n '2012-07-28T09:00:00.000000000', '2012-07-29T09:00:00.000000000',\n '2012-07-30T09:00:00.000000000', '2012-07-31T09:00:00.000000000',\n '2012-08-01T09:00:00.000000000', '2012-08-02T09:00:00.000000000',\n '2012-08-03T09:00:00.000000000', '2012-08-04T09:00:00.000000000',\n '2012-08-05T09:00:00.000000000', '2012-08-06T09:00:00.000000000',\n '2012-08-07T09:00:00.000000000', '2012-08-08T09:00:00.000000000',\n '2012-08-09T09:00:00.000000000', '2012-08-10T09:00:00.000000000',\n '2012-08-11T09:00:00.000000000', '2012-08-12T09:00:00.000000000',\n '2012-08-13T09:00:00.000000000', '2012-08-14T09:00:00.000000000',\n '2012-08-15T09:00:00.000000000', '2012-08-16T09:00:00.000000000',\n '2012-08-17T09:00:00.000000000', '2012-08-18T09:00:00.000000000',\n '2012-08-19T09:00:00.000000000', '2012-08-20T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Data variables: (4)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AVHRR18_G-NAVO, AVHRR19_G-NAVO, AVHRR_METOP_A-EUMETSAT, MODIS_A-JPL, MODIS_T-JPL, WSAT-REMSS, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :none\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_values :[ 1 2 5 9 13]flag_meanings :1=open-sea, 2=land, 5=open-lake, 9=open-sea with ice in the grid, 13=open-lake with ice in the gridcomment :mask can be used to further filter the data.source :GMT \"grdlandmask\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea ice area fractionunits :fraction (between 0 and 1)valid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice data interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2012-05-21 09:00:00', '2012-05-22 09:00:00',\n '2012-05-23 09:00:00', '2012-05-24 09:00:00',\n '2012-05-25 09:00:00', '2012-05-26 09:00:00',\n '2012-05-27 09:00:00', '2012-05-28 09:00:00',\n '2012-05-29 09:00:00', '2012-05-30 09:00:00',\n '2012-05-31 09:00:00', '2012-06-01 09:00:00',\n '2012-06-02 09:00:00', '2012-06-03 09:00:00',\n '2012-06-04 09:00:00', '2012-06-05 09:00:00',\n '2012-06-06 09:00:00', '2012-06-07 09:00:00',\n '2012-06-08 09:00:00', '2012-06-09 09:00:00',\n '2012-06-10 09:00:00', '2012-06-11 09:00:00',\n '2012-06-12 09:00:00', '2012-06-13 09:00:00',\n '2012-06-14 09:00:00', '2012-06-15 09:00:00',\n '2012-06-16 09:00:00', '2012-06-17 09:00:00',\n '2012-06-18 09:00:00', '2012-06-19 09:00:00',\n '2012-06-20 09:00:00', '2012-06-21 09:00:00',\n '2012-06-22 09:00:00', '2012-06-23 09:00:00',\n '2012-06-24 09:00:00', '2012-06-25 09:00:00',\n '2012-06-26 09:00:00', '2012-06-27 09:00:00',\n '2012-06-28 09:00:00', '2012-06-29 09:00:00',\n '2012-06-30 09:00:00', '2012-07-01 09:00:00',\n '2012-07-02 09:00:00', '2012-07-03 09:00:00',\n '2012-07-04 09:00:00', '2012-07-05 09:00:00',\n '2012-07-06 09:00:00', '2012-07-07 09:00:00',\n '2012-07-08 09:00:00', '2012-07-09 09:00:00',\n '2012-07-10 09:00:00', '2012-07-11 09:00:00',\n '2012-07-12 09:00:00', '2012-07-13 09:00:00',\n '2012-07-14 09:00:00', '2012-07-15 09:00:00',\n '2012-07-16 09:00:00', '2012-07-17 09:00:00',\n '2012-07-18 09:00:00', '2012-07-19 09:00:00',\n '2012-07-20 09:00:00', '2012-07-21 09:00:00',\n '2012-07-22 09:00:00', '2012-07-23 09:00:00',\n '2012-07-24 09:00:00', '2012-07-25 09:00:00',\n '2012-07-26 09:00:00', '2012-07-27 09:00:00',\n '2012-07-28 09:00:00', '2012-07-29 09:00:00',\n '2012-07-30 09:00:00', '2012-07-31 09:00:00',\n '2012-08-01 09:00:00', '2012-08-02 09:00:00',\n '2012-08-03 09:00:00', '2012-08-04 09:00:00',\n '2012-08-05 09:00:00', '2012-08-06 09:00:00',\n '2012-08-07 09:00:00', '2012-08-08 09:00:00',\n '2012-08-09 09:00:00', '2012-08-10 09:00:00',\n '2012-08-11 09:00:00', '2012-08-12 09:00:00',\n '2012-08-13 09:00:00', '2012-08-14 09:00:00',\n '2012-08-15 09:00:00', '2012-08-16 09:00:00',\n '2012-08-17 09:00:00', '2012-08-18 09:00:00',\n '2012-08-19 09:00:00', '2012-08-20 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (47)Conventions :CF-1.5title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \"Multi-scale Ultra-high Reolution\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20150711T060041Zstart_time :20120521T090000Zstop_time :20120521T090000Ztime_coverage_start :20120520T210000Ztime_coverage_end :20120521T210000Zfile_quality_level :1source :AVHRR18_G-NAVO, AVHRR19_G-NAVO, AVHRR_METOP_A-EUMETSAT, MODIS_A-JPL, MODIS_T-JPL, WSAT-REMSS, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Aqua, DMSP, NOAA-POES, Suomi-NPP, Terrasensor :AMSR-E, AVHRR, MODIS, SSM/I, VIIRS, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01 degreesgeospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01 degreesacknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\n# we want the sea surface temperature variable for this visualization\nds = ds_mur['analysed_sst']\n\n# Subset the dataset so that the program can run the code better\nds_subset = ds.sel(time=slice('2012-05-21T09:00:00', '2012-08-20T09:00:00'))\nlat_range = slice(45.61181, 49.2315)\nlon_range = slice(-125.41992, -116.64844)\nds_subset = ds_subset.sel(lat=lat_range, lon=lon_range)\n\nTo plot the data, we will be looking at the mean temperature across the summer.\n\n# Calculate the mean across the time dimension\nmean_data = ds_subset.mean(dim='time')\n\n\n#plot the figure\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (282, 291)\n\nim = ax.imshow(mean_data.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data.lon.min(), mean_data.lon.max(), mean_data.lat.min(), mean_data.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature (Kelvin)')\nax.set_title('Mean Sea Surface Temperature Summer 2012') \nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s also look at the most recent summer we have data for (2022) in comparison.\n\nmur_results_2 = earthaccess.search_data(short_name = 'MUR-JPL-L4-GLOB-v4.1', temporal = ('2022-05-21', '2022-08-20'), bounding_box = ('-125.41992','45.61181','-116.64844','49.2315'))\n\nGranules found: 92\n\n\n\nds_mur_2 = xr.open_mfdataset(earthaccess.open(mur_results_2), engine = 'h5netcdf')\nds_mur_2\n\n Opening 92 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 92, lat: 17999, lon: 36000)\nCoordinates:\n * time (time) datetime64[ns] 2022-05-21T09:00:00 ... 2022-08-2...\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 92lat: 17999lon: 36000Coordinates: (3)time(time)datetime64[ns]2022-05-21T09:00:00 ... 2022-08-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-05-21T09:00:00.000000000', '2022-05-22T09:00:00.000000000',\n '2022-05-23T09:00:00.000000000', '2022-05-24T09:00:00.000000000',\n '2022-05-25T09:00:00.000000000', '2022-05-26T09:00:00.000000000',\n '2022-05-27T09:00:00.000000000', '2022-05-28T09:00:00.000000000',\n '2022-05-29T09:00:00.000000000', '2022-05-30T09:00:00.000000000',\n '2022-05-31T09:00:00.000000000', '2022-06-01T09:00:00.000000000',\n '2022-06-02T09:00:00.000000000', '2022-06-03T09:00:00.000000000',\n '2022-06-04T09:00:00.000000000', '2022-06-05T09:00:00.000000000',\n '2022-06-06T09:00:00.000000000', '2022-06-07T09:00:00.000000000',\n '2022-06-08T09:00:00.000000000', '2022-06-09T09:00:00.000000000',\n '2022-06-10T09:00:00.000000000', '2022-06-11T09:00:00.000000000',\n '2022-06-12T09:00:00.000000000', '2022-06-13T09:00:00.000000000',\n '2022-06-14T09:00:00.000000000', '2022-06-15T09:00:00.000000000',\n '2022-06-16T09:00:00.000000000', '2022-06-17T09:00:00.000000000',\n '2022-06-18T09:00:00.000000000', '2022-06-19T09:00:00.000000000',\n '2022-06-20T09:00:00.000000000', '2022-06-21T09:00:00.000000000',\n '2022-06-22T09:00:00.000000000', '2022-06-23T09:00:00.000000000',\n '2022-06-24T09:00:00.000000000', '2022-06-25T09:00:00.000000000',\n '2022-06-26T09:00:00.000000000', '2022-06-27T09:00:00.000000000',\n '2022-06-28T09:00:00.000000000', '2022-06-29T09:00:00.000000000',\n '2022-06-30T09:00:00.000000000', '2022-07-01T09:00:00.000000000',\n '2022-07-02T09:00:00.000000000', '2022-07-03T09:00:00.000000000',\n '2022-07-04T09:00:00.000000000', '2022-07-05T09:00:00.000000000',\n '2022-07-06T09:00:00.000000000', '2022-07-07T09:00:00.000000000',\n '2022-07-08T09:00:00.000000000', '2022-07-09T09:00:00.000000000',\n '2022-07-10T09:00:00.000000000', '2022-07-11T09:00:00.000000000',\n '2022-07-12T09:00:00.000000000', '2022-07-13T09:00:00.000000000',\n '2022-07-14T09:00:00.000000000', '2022-07-15T09:00:00.000000000',\n '2022-07-16T09:00:00.000000000', '2022-07-17T09:00:00.000000000',\n '2022-07-18T09:00:00.000000000', '2022-07-19T09:00:00.000000000',\n '2022-07-20T09:00:00.000000000', '2022-07-21T09:00:00.000000000',\n '2022-07-22T09:00:00.000000000', '2022-07-23T09:00:00.000000000',\n '2022-07-24T09:00:00.000000000', '2022-07-25T09:00:00.000000000',\n '2022-07-26T09:00:00.000000000', '2022-07-27T09:00:00.000000000',\n '2022-07-28T09:00:00.000000000', '2022-07-29T09:00:00.000000000',\n '2022-07-30T09:00:00.000000000', '2022-07-31T09:00:00.000000000',\n '2022-08-01T09:00:00.000000000', '2022-08-02T09:00:00.000000000',\n '2022-08-03T09:00:00.000000000', '2022-08-04T09:00:00.000000000',\n '2022-08-05T09:00:00.000000000', '2022-08-06T09:00:00.000000000',\n '2022-08-07T09:00:00.000000000', '2022-08-08T09:00:00.000000000',\n '2022-08-09T09:00:00.000000000', '2022-08-10T09:00:00.000000000',\n '2022-08-11T09:00:00.000000000', '2022-08-12T09:00:00.000000000',\n '2022-08-13T09:00:00.000000000', '2022-08-14T09:00:00.000000000',\n '2022-08-15T09:00:00.000000000', '2022-08-16T09:00:00.000000000',\n '2022-08-17T09:00:00.000000000', '2022-08-18T09:00:00.000000000',\n '2022-08-19T09:00:00.000000000', '2022-08-20T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \"analysed_sst\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \"grdlandmask\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \"Fill value\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n444.15 GiB\n4.83 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\ntimedelta64[ns] numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2022-05-21 09:00:00', '2022-05-22 09:00:00',\n '2022-05-23 09:00:00', '2022-05-24 09:00:00',\n '2022-05-25 09:00:00', '2022-05-26 09:00:00',\n '2022-05-27 09:00:00', '2022-05-28 09:00:00',\n '2022-05-29 09:00:00', '2022-05-30 09:00:00',\n '2022-05-31 09:00:00', '2022-06-01 09:00:00',\n '2022-06-02 09:00:00', '2022-06-03 09:00:00',\n '2022-06-04 09:00:00', '2022-06-05 09:00:00',\n '2022-06-06 09:00:00', '2022-06-07 09:00:00',\n '2022-06-08 09:00:00', '2022-06-09 09:00:00',\n '2022-06-10 09:00:00', '2022-06-11 09:00:00',\n '2022-06-12 09:00:00', '2022-06-13 09:00:00',\n '2022-06-14 09:00:00', '2022-06-15 09:00:00',\n '2022-06-16 09:00:00', '2022-06-17 09:00:00',\n '2022-06-18 09:00:00', '2022-06-19 09:00:00',\n '2022-06-20 09:00:00', '2022-06-21 09:00:00',\n '2022-06-22 09:00:00', '2022-06-23 09:00:00',\n '2022-06-24 09:00:00', '2022-06-25 09:00:00',\n '2022-06-26 09:00:00', '2022-06-27 09:00:00',\n '2022-06-28 09:00:00', '2022-06-29 09:00:00',\n '2022-06-30 09:00:00', '2022-07-01 09:00:00',\n '2022-07-02 09:00:00', '2022-07-03 09:00:00',\n '2022-07-04 09:00:00', '2022-07-05 09:00:00',\n '2022-07-06 09:00:00', '2022-07-07 09:00:00',\n '2022-07-08 09:00:00', '2022-07-09 09:00:00',\n '2022-07-10 09:00:00', '2022-07-11 09:00:00',\n '2022-07-12 09:00:00', '2022-07-13 09:00:00',\n '2022-07-14 09:00:00', '2022-07-15 09:00:00',\n '2022-07-16 09:00:00', '2022-07-17 09:00:00',\n '2022-07-18 09:00:00', '2022-07-19 09:00:00',\n '2022-07-20 09:00:00', '2022-07-21 09:00:00',\n '2022-07-22 09:00:00', '2022-07-23 09:00:00',\n '2022-07-24 09:00:00', '2022-07-25 09:00:00',\n '2022-07-26 09:00:00', '2022-07-27 09:00:00',\n '2022-07-28 09:00:00', '2022-07-29 09:00:00',\n '2022-07-30 09:00:00', '2022-07-31 09:00:00',\n '2022-08-01 09:00:00', '2022-08-02 09:00:00',\n '2022-08-03 09:00:00', '2022-08-04 09:00:00',\n '2022-08-05 09:00:00', '2022-08-06 09:00:00',\n '2022-08-07 09:00:00', '2022-08-08 09:00:00',\n '2022-08-09 09:00:00', '2022-08-10 09:00:00',\n '2022-08-11 09:00:00', '2022-08-12 09:00:00',\n '2022-08-13 09:00:00', '2022-08-14 09:00:00',\n '2022-08-15 09:00:00', '2022-08-16 09:00:00',\n '2022-08-17 09:00:00', '2022-08-18 09:00:00',\n '2022-08-19 09:00:00', '2022-08-20 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \"Multi-scale Ultra-high Resolution\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20220530T072023Zstart_time :20220521T090000Zstop_time :20220521T090000Ztime_coverage_start :20220520T210000Ztime_coverage_end :20220521T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\nds_2 = ds_mur_2['analysed_sst']\n\nds_subset_2 = ds_2.sel(time=slice('2022-05-21T09:00:00', '2022-08-20T09:00:00'))\nds_subset_2 = ds_subset_2.sel(lat=lat_range, lon=lon_range)\n\n\nmean_data_2 = ds_subset_2.mean(dim='time')\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\ncolorbar_range = (282, 291)\n\nim = ax.imshow(mean_data_2.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data_2.lon.min(), mean_data_2.lon.max(), mean_data_2.lat.min(), mean_data_2.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature (Kelvin)') \nax.set_title('Mean Sea Surface Temperature Summer 2022')\nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s plot the difference between these two summers.\n\n# Calculate the difference between the two mean datasets\ndata_diff = mean_data_2 - mean_data\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (-3, 3)\n\nim = ax.imshow(data_diff.values, cmap='coolwarm', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data.lon.min(), mean_data.lon.max(), mean_data.lat.min(), mean_data.lat.max()],\n vmin=colorbar_range[0], vmax=colorbar_range[1]) \n\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature Difference (Kelvin)')\nax.set_title('Sea Surface Temperature Difference (Avg of Summer 2022 - Avg of Summer 2012)')\n\nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s zoom in on Lake Chelan in central Washington to look at the difference between the averages of the two summers.\n\n#subset the data for Lake Chelan in 2012\nds_subset_3 = ds.sel(time=slice('2012-05-21T09:00:00', '2012-08-20T09:00:00'))\nlat_range_2 = slice(47.7926, 48.44274)\nlon_range_2 = slice(-120.99902, -119.77734)\nds_subset_3 = ds_subset_3.sel(lat=lat_range_2, lon=lon_range_2)\n\nmean_data_3 = ds_subset_3.mean(dim='time')\n\n\n#subset the data for Lake Chelan in 2022\nds_subset_4 = ds_2.sel(time=slice('2022-05-21T09:00:00', '2022-08-20T09:00:00'))\nds_subset_4 = ds_subset_4.sel(lat=lat_range_2, lon=lon_range_2)\n\nmean_data_4 = ds_subset_4.mean(dim='time')\n\n\n# Calculate the difference between the two mean datasets\ndata_diff_2 = mean_data_4 - mean_data_3\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (2, 3.5)\n\nim = ax.imshow(data_diff_2.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[data_diff_2.lon.min(), data_diff_2.lon.max(), data_diff_2.lat.min(), data_diff_2.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature Difference (Kelvin)')\nax.set_title('Lake Chelan Sea Surface Temperature Difference 2012 vs 2022')\n\nax.gridlines()\n\nplt.show()\n\nPlease note that the GHRSST dataset is optimized for ocean sea surface temperature, so caution should be exercised when visualizing inland water bodies.", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "GHRSST", + "In-Cloud Access" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#calculates-the-mean", - "href": "notebooks/datasets/smap_imerg_tutorial.html#calculates-the-mean", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "Calculates the mean", - "text": "Calculates the mean\n\n#subsets to the location of the pacific coast and California \nsubset_location = allsubset_files.where((allsubset_files.latitude>20)&(allsubset_files.latitude<50)&(allsubset_files.longitude>-140)&(allsubset_files.longitude<-100), drop=True)\n\n#calculates the mean for the 'smap_sss' variable\nsubset_mean_values = np.nanmean(subset_location['smap_sss'], axis=0)\n\n#gets rid of past mean value if you were to run this code again with different dates\nif 'backup_subset_mean_values' in globals():\n del backup_subset_mean_values\n \n#plots the figure and saves it to your output path\nfig = plt.figure(figsize= (16,10))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\ns = plt.pcolormesh(subset_location.longitude, subset_location.latitude, subset_mean_values, vmin = 33, vmax= 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ncb = plt.colorbar(s)\ncb.set_label('psu')\nax.set_title(f'SSS mean over 12/26 to 1/16 (2015-2023)', size = 24)\nax.grid()\nax.add_feature(cfeature.OCEAN)\nax.add_feature(cfeature.LAND)\nax.add_feature(cfeature.LAKES)\nax.add_feature(cfeature.RIVERS)\nax.add_feature(cfeature.STATES)\nax.coastlines()\nax.set_xlim(-130, -115)\nax.set_ylim(32, 42.5)\n\n#saves figure to output path \nplt.savefig(outputpath+datetime.now().strftime(\"%Y%m%d-%H%M%S\")+'.png',dpi=400, facecolor='w', transparent=False, bbox_inches='tight')\n\n/var/folders/f0/dgnqgvtx46513by9cdh6fnjw0000gq/T/ipykernel_66947/1610522150.py:5: RuntimeWarning: Mean of empty slice\n subset_mean_values = np.nanmean(subset_location['smap_sss'], axis=0)", + "objectID": "notebooks/datasets/SWOTHR_s3Access.html#accessing-and-visualizing-swot-datasets", + "href": "notebooks/datasets/SWOTHR_s3Access.html#accessing-and-visualizing-swot-datasets", + "title": "SWOT Hydrology Dataset Exploration in the Cloud", + "section": "Accessing and Visualizing SWOT Datasets", + "text": "Accessing and Visualizing SWOT Datasets\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via earthaccess python library; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\nLearning Objectives:\n\nAccess SWOT HR data prodcuts (archived in NASA Earthdata Cloud) within the AWS cloud, without downloading to local machine\nVisualize accessed data for a quick check\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nRiver Vector Shapefile - SWOT_L2_HR_RIVERSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LAKESP_2.0\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\nSingle Look Complex Data product - SWOT_L1B_HR_SLC_2.0\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Feb 2024) || Other Contributors: Zoe Walschots (PO.DAAC Summer Intern 2023), Catalina Taglialatela (NASA PO.DAAC), Luis Lopez (NASA NSIDC DAAC)\nLast updated: 7 Feb 2024\n\n\n\nLibraries Needed\n\nimport s3fs\nimport fiona\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport earthaccess\n\npd.set_option('display.max_columns', None) #make sure all columns displayed for shapefiles\n\n\n\n\n\n\n\n\n\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nSingle File Access\n\n1. River Vector Shapefiles\nThe s3 access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to search in a map graphic user interface.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for the data of interest\n\n#Retrieves granule from the day we want, in this case by passing to `earthdata.search_data` function the data collection shortname, temporal bounds, and filter by wildcards\nriver_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_009_NA*') # here we filter by Reach files (not node), pass=009, continent code=NA\n\nGranules found: 7\n\n\n\n\nSet up an s3fs session for Direct Cloud Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(results=river_results)\n\n\n\nCreate Fiona session to work with zip and embedded shapefiles in the AWS Cloud\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don’t do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# Get the link for the first zip file\nriver_link = earthaccess.results.DataGranule.data_links(river_results[0], access='direct')[0]\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nriver_shp_url = f\"zip+{river_link}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp1 = gpd.read_file(river_shp_url) \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\nwse_c\nwse_c_u\nslope\nslope_u\nslope_r_u\nslope2\nslope2_u\nslope2_r_u\nwidth\nwidth_u\nwidth_c\nwidth_c_u\narea_total\narea_tot_u\narea_detct\narea_det_u\narea_wse\nd_x_area\nd_x_area_u\nlayovr_val\nnode_dist\nloc_offset\nxtrk_dist\ndschg_c\ndschg_c_u\ndschg_csf\ndschg_c_q\ndschg_gc\ndschg_gc_u\ndschg_gcsf\ndschg_gc_q\ndschg_m\ndschg_m_u\ndschg_msf\ndschg_m_q\ndschg_gm\ndschg_gm_u\ndschg_gmsf\ndschg_gm_q\ndschg_b\ndschg_b_u\ndschg_bsf\ndschg_b_q\ndschg_gb\ndschg_gb_u\ndschg_gbsf\ndschg_gb_q\ndschg_h\ndschg_h_u\ndschg_hsf\ndschg_h_q\ndschg_gh\ndschg_gh_u\ndschg_ghsf\ndschg_gh_q\ndschg_o\ndschg_o_u\ndschg_osf\ndschg_o_q\ndschg_go\ndschg_go_u\ndschg_gosf\ndschg_go_q\ndschg_s\ndschg_s_u\ndschg_ssf\ndschg_s_q\ndschg_gs\ndschg_gs_u\ndschg_gssf\ndschg_gs_q\ndschg_i\ndschg_i_u\ndschg_isf\ndschg_i_q\ndschg_gi\ndschg_gi_u\ndschg_gisf\ndschg_gi_q\ndschg_q_b\ndschg_gq_b\nreach_q\nreach_q_b\ndark_frac\nice_clim_f\nice_dyn_f\npartial_f\nn_good_nod\nobs_frac_n\nxovr_cal_q\ngeoid_hght\ngeoid_slop\nsolid_tide\nload_tidef\nload_tideg\npole_tide\ndry_trop_c\nwet_trop_c\niono_c\nxovr_cal_c\nn_reach_up\nn_reach_dn\nrch_id_up\nrch_id_dn\np_wse\np_wse_var\np_width\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n71224500951\n-1.000000e+12\n-1.000000e+12\nno_data\n48.517717\n-93.692086\nRainy River\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n1\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n71224700961, no_data, no_data, no_data\n71224300941, no_data, no_data, no_data\n325.899994\n0.044680\n208.0\n1480.031\n53\n244919.492\n10586.381484\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-93.76076 48.51651, -93.76035 48.5...\n\n\n1\n71224700013\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.777900\n-93.233350\nno_data\n3.364954e+02\n9.003000e-02\n2.290000e-03\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n3.272000e-01\n8.486717e+02\n2.871400e-01\n-4.807161e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389051\n8389051\n3\n4194318\n1.338000e-03\n1\n-999\n0\n18\n1.000000e+00\n0\n-3.141705e+01\n-2.674060e-05\n-2.894793e-02\n-5.371819e-03\n-5.384998e-03\n5.780308e-03\n-2.241292e+00\n-1.634102e-02\n-8.003274e-03\n5.015258e-01\n1\n1\n71224700021, no_data, no_data, no_data\n71224700276, no_data, no_data, no_data\n335.600006\n0.000000\n1288.0\n1239358.412\n18\n3719.676\n3514.736672\n-1.000000e+12\n0\n6\n1\n0\nLINESTRING (-93.21387 48.78466, -93.21403 48.7...\n\n\n2\n71224700021\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.772163\n-93.266891\nno_data\n3.365123e+02\n9.199000e-02\n1.902000e-02\n-1.000000e+12\n-1.000000e+12\n4.959662e-05\n1.018542e-05\n9.733590e-06\n2.575548e-05\n-1.000000e+12\n4.654752e-05\n6.202024e+01\n1.118013e+00\n-1.000000e+12\n-1.000000e+12\n9.836880e+04\n1.773253e+03\n9.836880e+04\n1.773300e+03\n9.836880e+04\n-1.000000e+12\n-1.000000e+12\n1.377000e-01\n1.509669e+02\n-1.470277e+01\n-5.017144e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n1\n2\n0.000000e+00\n1\n-999\n0\n6\n7.500000e-01\n0\n-3.135521e+01\n2.512828e-05\n-2.886645e-02\n-5.377388e-03\n-5.390327e-03\n5.783173e-03\n-2.241321e+00\n-1.657549e-02\n-8.003758e-03\n5.314556e-01\n2\n1\n71224700233, 71224700083, no_data, no_data\n71224700013, no_data, no_data, no_data\n335.600006\n0.000000\n30.0\n76609.119\n8\n5305.752\n1586.075688\n-1.000000e+12\n0\n6\n1\n0\nLINESTRING (-93.25587 48.77340, -93.25628 48.7...\n\n\n3\n71224700033\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.733727\n-93.116424\nno_data\n3.365715e+02\n9.068000e-02\n1.112000e-02\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1.505600e+00\n3.730449e+02\n-1.512075e+02\n-3.862870e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n3\n4194318\n1.153940e-01\n1\n-999\n0\n18\n9.000000e-01\n0\n-3.153422e+01\n-1.678670e-05\n-2.908536e-02\n-5.353698e-03\n-5.371641e-03\n5.773116e-03\n-2.241031e+00\n-1.593641e-02\n-8.007598e-03\n3.984029e-01\n1\n1\n71224700286, no_data, no_data, no_data\n71224700041, no_data, no_data, no_data\n335.600006\n0.000000\n645.0\n297730.945\n20\n306795.237\n3904.961218\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-93.09779 48.73888, -93.09820 48.7...\n\n\n4\n71224700041\n7.540761e+08\n7.540762e+08\n2023-11-23T17:35:38Z\n48.720271\n-93.113458\nno_data\n3.364742e+02\n9.085000e-02\n1.238000e-02\n-1.000000e+12\n-1.000000e+12\n-2.431140e-05\n1.166051e-05\n1.126799e-05\n-9.248820e-05\n-1.000000e+12\n1.647480e-05\n3.930469e+01\n1.013951e+00\n-1.000000e+12\n-1.000000e+12\n4.728760e+04\n1.219887e+03\n4.728760e+04\n1.219900e+03\n4.728760e+04\n-1.000000e+12\n-1.000000e+12\n2.925000e-01\n2.328550e+02\n-4.628440e+00\n-3.776046e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n25166265\n25166265\n1\n6\n0.000000e+00\n1\n-999\n0\n5\n8.333333e-01\n0\n-3.152398e+01\n-3.509400e-06\n-2.906824e-02\n-5.351348e-03\n-5.371695e-03\n5.773071e-03\n-2.240743e+00\n-1.600031e-02\n-8.009073e-03\n3.901623e-01\n1\n1\n71224700033, no_data, no_data, no_data\n71224700053, no_data, no_data, no_data\n335.600006\n0.000000\n645.0\n0.000\n6\n302890.276\n1203.102119\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-93.12101 48.72305, -93.12060 48.7...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n926\n77125000241\n7.540756e+08\n7.540756e+08\n2023-11-23T17:26:38Z\n17.960957\n-100.025397\nno_data\n3.560650e+02\n1.501928e+02\n1.501928e+02\n-1.000000e+12\n-1.000000e+12\n1.139809e-03\n8.453720e-04\n8.453667e-04\n-1.968571e-04\n-1.000000e+12\n6.002469e+03\n6.442070e+01\n1.454903e+00\n-1.000000e+12\n-1.000000e+12\n5.130950e+04\n1.158794e+03\n4.143390e+04\n1.158800e+03\n5.130950e+04\n-1.000000e+12\n-1.000000e+12\n3.217900e+00\n6.496189e+01\n-6.441719e+03\n6.087360e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389051\n8389051\n1\n40966\n1.924710e-01\n0\n-999\n1\n4\n5.714286e-02\n0\n-8.767097e+00\n2.520024e-05\n1.047472e-01\n-2.491515e-03\n-1.416101e-03\n3.766508e-03\n-2.225335e+00\n-2.844600e-01\n-1.248337e-02\n-3.609023e-01\n1\n1\n77125000254, no_data, no_data, no_data\n77125000231, no_data, no_data, no_data\n358.600006\n65.289837\n96.0\n864.151\n70\n464330.310\n13953.442643\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-100.06409 17.97308, -100.06403 17...\n\n\n927\n77125000254\n-1.000000e+12\n-1.000000e+12\nno_data\n17.949648\n-99.995193\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000263, no_data, no_data, no_data\n77125000241, no_data, no_data, no_data\n423.700012\n50.631649\n162.0\n21491.314\n2\n464735.375\n405.065100\n-1.000000e+12\n10286\n1\n1\n0\nLINESTRING (-99.99547 17.95148, -99.99564 17.9...\n\n\n928\n77125000261\n7.540756e+08\n7.540756e+08\n2023-11-23T17:26:47Z\n18.362207\n-100.696472\nno_data\n2.316304e+02\n9.208000e-02\n1.946000e-02\n-1.000000e+12\n-1.000000e+12\n9.017132e-04\n5.351440e-06\n4.431470e-06\n8.374171e-04\n-1.000000e+12\n3.976097e-05\n3.544730e+02\n2.232573e+00\n-1.000000e+12\n-1.000000e+12\n3.936467e+06\n2.479300e+04\n3.776529e+06\n2.479300e+04\n3.936467e+06\n-1.000000e+12\n-1.000000e+12\n1.037250e+01\n1.555118e+02\n-1.003980e+00\n-1.240390e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n8389049\n8389049\n1\n14\n4.063000e-02\n0\n-999\n0\n56\n1.000000e+00\n0\n-1.111140e+01\n1.232563e-05\n1.055168e-01\n-1.683211e-03\n-6.265789e-04\n3.857576e-03\n-2.255829e+00\n-3.061254e-01\n-1.237202e-02\n1.378732e-01\n2\n1\n77125000021, 77125000011, no_data, no_data\n77123000251, no_data, no_data, no_data\n232.000000\n6.028838\n195.0\n3624.715\n56\n325106.825\n11105.124379\n-1.000000e+12\n0\n4\n1\n0\nLINESTRING (-100.68734 18.40208, -100.68723 18...\n\n\n929\n77125000263\n-1.000000e+12\n-1.000000e+12\nno_data\n17.956269\n-99.961388\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000273, no_data, no_data, no_data\n77125000254, no_data, no_data, no_data\n463.500000\n5.120043\n459.0\n43956.311\n49\n474450.182\n9714.807127\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-99.99398 17.94824, -99.99369 17.9...\n\n\n930\n77125000273\n-1.000000e+12\n-1.000000e+12\nno_data\n17.952683\n-99.906755\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n12582912\n12582912\n3\n469762048\n-1.000000e+12\n0\n-999\n1\n-999\n-1.000000e+12\n2\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n1\n1\n77125000283, no_data, no_data, no_data\n77125000263, no_data, no_data, no_data\n463.500000\n0.000000\n819.0\n283915.163\n49\n484179.822\n9729.640027\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-99.93256 17.94746, -99.93273 17.9...\n\n\n\n\n931 rows × 127 columns\n\n\n\n\n\nQuickly plot the SWOT river data\n\n# Simple plot\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp1.plot(ax=ax, color='black')\n\n\n\n\n\n\n\n\n\n# # Another way to plot geopandas dataframes is with `explore`, which also plots a basemap\n# SWOT_HR_shp1.explore()\n\n\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for data of interest\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Prior*_009_NA*') # here we filter by files with 'Prior' in the name (This collection has three options: Obs, Unassigned, and Prior), pass #8 and continent code=NA\n\nGranules found: 3\n\n\n\n\nSet up an s3fs session for Direct Cloud Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(results=lake_results)\n\n\n\nCreate Fiona session to work with zip and embedded shapefiles in the AWS Cloud\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don’t do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# Get the link for the first zip file\nlake_link = earthaccess.results.DataGranule.data_links(lake_results[0], access='direct')[0]\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nlake_shp_url = f\"zip+{lake_link}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp2 = gpd.read_file(lake_shp_url) \n\n#view the attribute table\nSWOT_HR_shp2\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\nwse_r_u\nwse_std\narea_total\narea_tot_u\narea_detct\narea_det_u\nlayovr_val\nxtrk_dist\nds1_l\nds1_l_u\nds1_q\nds1_q_u\nds2_l\nds2_l_u\nds2_q\nds2_q_u\nquality_f\ndark_frac\nice_clim_f\nice_dyn_f\npartial_f\nxovr_cal_q\ngeoid_hght\nsolid_tide\nload_tidef\nload_tideg\npole_tide\ndry_trop_c\nwet_trop_c\niono_c\nxovr_cal_c\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n0\n7120818392\nno_data\n712238L999960\n100\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.221900e+02\n3.900000e-02\n3.100000e-02\n1.750000e-01\n1.133420e-01\n2.746000e-03\n1.123950e-01\n2.746000e-03\n2.450000e-01\n-2.700895e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n8.362160e-01\n2\n-999\n0\n0\n-2.960103e+01\n-1.076270e-01\n-1.385000e-02\n-1.446900e-02\n6.530000e-03\n-2.219912e+00\n-4.322200e-02\n-2.460000e-03\n-8.323030e-01\nno_data\n-99999999\n-93.370529\n47.725706\n-1.000000e+12\n0.067500\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.37004 47.72747, -93.36976 ...\n\n\n1\n7120818432\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n2\n-999\n-999\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\nSOUTH STURGEON LAKE\n-99999999\n-93.063382\n47.636276\n-1.000000e+12\n0.734400\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n2\n7120818512\nno_data\n712239L999974\n91\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.035210e+02\n3.800000e-02\n2.900000e-02\n3.670000e-01\n4.746580e-01\n6.040000e-03\n3.230260e-01\n6.040000e-03\n1.100000e-01\n-4.768885e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-2.928009e+01\n-1.069980e-01\n-1.387600e-02\n-1.449100e-02\n6.541000e-03\n-2.224427e+00\n-4.345700e-02\n-2.448000e-03\n-1.489370e+00\nCONNORS LAKE\n-99999999\n-93.634992\n47.777938\n-1.000000e+12\n0.419400\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.64085 47.77833, -93.64070 ...\n\n\n3\n7120818532\nno_data\n712238L999960\n100\n1\n7.558788e+08\n7.558788e+08\n2023-12-14T14:20:39Z\n4.214720e+02\n9.700000e-02\n5.700000e-02\n3.140000e-01\n5.936400e-02\n2.015000e-03\n5.936400e-02\n2.015000e-03\n1.100000e-02\n-2.658368e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n0.000000e+00\n2\n-999\n0\n0\n-2.961158e+01\n-1.076620e-01\n-1.385000e-02\n-1.446900e-02\n6.530000e-03\n-2.220099e+00\n-4.328800e-02\n-2.460000e-03\n-8.189060e-01\nno_data\n-99999999\n-93.367313\n47.718575\n-1.000000e+12\n0.018900\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.36683 47.72159, -93.36655 47.721...\n\n\n4\n7120818542\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-999\n-1.000000e+12\n2\n-999\n-999\n-999\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\nno_data\n-99999999\n-93.042420\n47.711142\n-1.000000e+12\n0.031500\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n56491\n7131519532\nno_data\n713254R999944;713255R000006\n45;42\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n1.283300e+01\n7.500000e-02\n5.700000e-02\n1.700000e-01\n7.491100e-02\n1.923000e-03\n7.437200e-02\n1.923000e-03\n1.000000e-03\n2.384581e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.790753e+01\n-7.896700e-02\n-4.073000e-03\n-2.923000e-03\n5.666000e-03\n-2.268012e+00\n-1.023750e-01\n-2.140000e-03\n7.063360e-01\nno_data\n-99999999\n-88.000840\n56.331699\n-1.000000e+12\n0.056700\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.99912 56.33127, -87.99922 ...\n\n\n56492\n7131519632\nno_data\n713254R999943;713255R000008\n48;20\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n1.074100e+01\n1.570000e-01\n1.460000e-01\n1.420000e-01\n3.342300e-02\n1.435000e-03\n3.152200e-02\n1.435000e-03\n5.000000e-03\n2.730958e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.786691e+01\n-7.908800e-02\n-3.548000e-03\n-2.638000e-03\n5.728000e-03\n-2.268497e+00\n-1.023450e-01\n-2.141000e-03\n8.137400e-01\nno_data\n-99999999\n-87.948521\n56.320464\n-1.000000e+12\n0.025200\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.94670 56.32014, -87.94649 ...\n\n\n56493\n7131519662\nno_data\n713255R000009;713254R999940\n42;33\n2\n7.558790e+08\n7.558790e+08\n2023-12-14T14:23:19Z\n9.208000e+00\n1.030000e-01\n1.260000e-01\n1.410000e-01\n2.864300e-02\n1.112000e-03\n2.729100e-02\n1.112000e-03\n3.400000e-02\n2.882420e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-4.784918e+01\n-7.914000e-02\n-3.278000e-03\n-2.509000e-03\n6.730000e-03\n-2.268922e+00\n-1.023670e-01\n-2.142000e-03\n8.608050e-01\nno_data\n-99999999\n-87.925618\n56.315773\n-1.000000e+12\n0.021600\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-87.92352 56.31520, -87.92363 ...\n\n\n56494\n7131560212\nno_data\n713245R000001;713245R999966;713245R999958;7132...\n70;0;0;0;0;0;0;0;0;0;0\n11\n7.558789e+08\n7.558789e+08\n2023-12-14T14:21:43Z\n3.717920e+02\n1.000000e-03\n1.000000e-03\n3.720000e-01\n3.853027e+02\n3.084073e+00\n3.231617e+02\n3.084073e+00\n7.000000e-03\n4.695466e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n1\n0\n-3.585787e+01\n-9.732200e-02\n-1.303500e-02\n-1.356500e-02\n6.288000e-03\n-2.208235e+00\n-5.674900e-02\n-2.306000e-03\n1.424744e+00\nCAT RIVER (EAST CHANNEL);LAKE ST JOSEPH;ST JOS...\n-99999999\n-90.745713\n51.058944\n-1.000000e+12\n526.421232\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-91.39550 50.91117, -91.39555 ...\n\n\n56495\n7420501022\nno_data\n742233R999968;742233R000007;742233R000003\n57;8;4\n3\n7.558788e+08\n7.558788e+08\n2023-12-14T14:19:39Z\n3.105560e+02\n9.900000e-02\n7.300000e-02\n6.540000e-01\n3.935470e-01\n2.443000e-03\n1.602010e-01\n2.443000e-03\n1.100000e-02\n5.434642e+04\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n0\n-1.000000e+12\n2\n-999\n0\n0\n-2.887526e+01\n-1.217310e-01\n-1.435000e-02\n-1.513400e-02\n6.583000e-03\n-2.268862e+00\n-5.500000e-02\n-2.866000e-03\n1.664425e+00\nLAKE TUSTIN\n-99999999\n-93.665611\n44.206288\n-1.000000e+12\n0.546300\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-93.66006 44.20938, -93.66012 ...\n\n\n\n\n56496 rows × 51 columns\n\n\n\n\n\nQuickly plot the SWOT lakes data\n\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp2.plot(ax=ax, color='black')\n\n\n\n\n\n\n\n\nAccessing the remaining files is different than the shp files above. We do not need to read the shapefiles within a zip file using something like Fiona session (or to download and unzip in the cloud) because the following SWOT HR collections are stored in netCDF files in the cloud. For the rest of the products, we will open via xarray, not geopandas.\n\n\n3. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n #granule_name = '*_009_*', # pass number 9 if we want to filter further\n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 39\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(earthaccess.open([pixc_results[0]]), group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\nOpening 1 granules, approx size: 0.22 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 2357958, complex_depth: 2,\n num_pixc_lines: 3278)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(471592,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(471592,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(785986,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(785986,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(785986, 1), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(785986,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3278\n interferogram_size_range: 5623\n looks_to_efflooks: 1.5509709858820855\n num_azimuth_looks: 7.0\n azimuth_offset: 7xarray.DatasetDimensions:points: 2357958complex_depth: 2num_pixc_lines: 3278Coordinates: (2)latitude(points)float64dask.array<chunksize=(471592,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(471592,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(785986, 1), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.00 MiB\n\n\nShape\n(2357958, 2)\n(785986, 1)\n\n\nDask graph\n6 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 2357958\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(471592,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(471592,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n3.60 MiB\n\n\nShape\n(2357958,)\n(471592,)\n\n\nDask graph\n5 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(785986,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n3.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(2357958,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.99 MiB\n8.99 MiB\n\n\nShape\n(2357958,)\n(2357958,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(785986,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.99 MiB\n6.00 MiB\n\n\nShape\n(2357958,)\n(785986,)\n\n\nDask graph\n3 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2357958 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.61 kiB\n25.61 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.80 kiB\n12.80 kiB\n\n\nShape\n(3278,)\n(3278,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3278interferogram_size_range :5623looks_to_efflooks :1.5509709858820855num_azimuth_looks :7.0azimuth_offset :7\n\n\n\n\nSimple plot of the results\n\n# This could take a few minutes to plot\nplt.scatter(x=ds_PIXC.longitude, y=ds_PIXC.latitude, c=ds_PIXC.height)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\n\nSearch for data of interest\n\npixcvec_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXCVEC_2.0', \n #granule_name = '*_009_*', # pass number 9 if we want to filter further\n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX \n\nGranules found: 26\n\n\n\n\nOpen data using xarray\n\nds_PIXCVEC = xr.open_mfdataset(earthaccess.open([pixcvec_results[0]]), decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\nOpening 1 granules, approx size: 0.21 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 2831150, nchar_reach_id: 11,\n nchar_node_id: 14, nchar_lake_id: 10,\n nchar_obs_id: 13)\nDimensions without coordinates: points, nchar_reach_id, nchar_node_id,\n nchar_lake_id, nchar_obs_id\nData variables:\n azimuth_index (points) int32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n range_index (points) int32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n latitude_vectorproc (points) float64 dask.array<chunksize=(2831150,), meta=np.ndarray>\n longitude_vectorproc (points) float64 dask.array<chunksize=(2831150,), meta=np.ndarray>\n height_vectorproc (points) float32 dask.array<chunksize=(2831150,), meta=np.ndarray>\n reach_id (points, nchar_reach_id) |S1 dask.array<chunksize=(2831150, 11), meta=np.ndarray>\n node_id (points, nchar_node_id) |S1 dask.array<chunksize=(2831150, 14), meta=np.ndarray>\n lake_id (points, nchar_lake_id) |S1 dask.array<chunksize=(2831150, 10), meta=np.ndarray>\n obs_id (points, nchar_obs_id) |S1 dask.array<chunksize=(2831150, 13), meta=np.ndarray>\n ice_clim_f (points) int8 dask.array<chunksize=(2831150,), meta=np.ndarray>\n ice_dyn_f (points) int8 dask.array<chunksize=(2831150,), meta=np.ndarray>\nAttributes: (12/45)\n Conventions: CF-1.7\n title: Level 2 KaRIn high rate pixel cloud vect...\n short_name: L2_HR_PIXCVec\n institution: CNES\n source: Level 1B KaRIn High Rate Single Look Com...\n history: 2023-12-03T05:59:43.712142Z: Creation\n ... ...\n xref_prior_river_db_file: \n xref_prior_lake_db_file: SWOT_LakeDatabase_Nom_106_20000101T00000...\n xref_reforbittrack_files: SWOT_RefOrbitTrackTileBoundary_Nom_20000...\n xref_param_l2_hr_laketile_file: SWOT_Param_L2_HR_LakeTile_20000101T00000...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805xarray.DatasetDimensions:points: 2831150nchar_reach_id: 11nchar_node_id: 14nchar_lake_id: 10nchar_obs_id: 13Coordinates: (0)Data variables: (11)azimuth_index(points)int32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nrange_index(points)int32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nlatitude_vectorproc(points)float64dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation latitudestandard_name :latitudeunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Height-constrained geodetic latitude of the pixel. Units are in degrees north of the equator.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n21.60 MiB\n21.60 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nlongitude_vectorproc(points)float64dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation longitudestandard_name :longitudeunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Height-constrained geodetic longitude of the pixel. Positive=degrees east of the Greenwich meridian. Negative=degrees west of the Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n21.60 MiB\n21.60 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nheight_vectorproc(points)float32dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :9.96921e+36long_name :height above reference ellipsoidunits :mvalid_min :-1500.0valid_max :15000.0coordinates :longitude_vectorproc latitude_vectorproccomment :Height-constrained height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.80 MiB\n10.80 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nreach_id(points, nchar_reach_id)|S1dask.array<chunksize=(2831150, 11), meta=np.ndarray>long_name :identifier of the associated prior river reachcoordinates :longitude_vectorproc latitude_vectorproccomment :Unique reach identifier from the prior river database. The format of the identifier is CBBBBBRRRRT, where C=continent, B=basin, R=reach, T=type.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n29.70 MiB\n29.70 MiB\n\n\nShape\n(2831150, 11)\n(2831150, 11)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 11 2831150\n\n\n\n\nnode_id(points, nchar_node_id)|S1dask.array<chunksize=(2831150, 14), meta=np.ndarray>long_name :identifier of the associated prior river nodecoordinates :longitude_vectorproc latitude_vectorproccomment :Unique node identifier from the prior river database. The format of the identifier is CBBBBBRRRRNNNT, where C=continent, B=basin, R=reach, N=node, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n37.80 MiB\n37.80 MiB\n\n\nShape\n(2831150, 14)\n(2831150, 14)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 14 2831150\n\n\n\n\nlake_id(points, nchar_lake_id)|S1dask.array<chunksize=(2831150, 10), meta=np.ndarray>long_name :identifier of the associated prior lakecoordinates :longitude_vectorproc latitude_vectorproccomment :Identifier of the lake from the lake prior database) associated to the pixel. The format of the identifier is CBBNNNNNNT, where C=continent, B=basin, N=counter within the basin, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n27.00 MiB\n27.00 MiB\n\n\nShape\n(2831150, 10)\n(2831150, 10)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 10 2831150\n\n\n\n\nobs_id(points, nchar_obs_id)|S1dask.array<chunksize=(2831150, 13), meta=np.ndarray>long_name :identifier of the observed featurecoordinates :longitude_vectorproc latitude_vectorproccomment :Tile-specific identifier of the observed feature associated to the pixel. The format of the identifier is CBBTTTSNNNNNN, where C=continent, B=basin, T=tile number, S=swath side, N=lake counter within the PIXC tile.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n35.10 MiB\n35.10 MiB\n\n\nShape\n(2831150, 13)\n(2831150, 13)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 13 2831150\n\n\n\n\nice_clim_f(points)int8dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :127long_name :climatological ice cover flagflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the surface is not ice covered, may or may not be partially or fully ice covered, and fully ice covered, respectively. A value of 127 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.70 MiB\n2.70 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nice_dyn_f(points)int8dask.array<chunksize=(2831150,), meta=np.ndarray>_FillValue :127long_name :dynamical ice cover flagflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Dynamic ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the surface is not ice covered, partially ice covered, and fully ice covered, respectively. A value of 255 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.70 MiB\n2.70 MiB\n\n\nShape\n(2831150,)\n(2831150,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 2831150 1\n\n\n\n\nIndexes: (0)Attributes: (45)Conventions :CF-1.7title :Level 2 KaRIn high rate pixel cloud vector attribute productshort_name :L2_HR_PIXCVecinstitution :CNESsource :Level 1B KaRIn High Rate Single Look Complex Data Producthistory :2023-12-03T05:59:43.712142Z: Creationplatform :SWOTreferences :SWOT-DD-CDM-0565-CNES_SAS_Design_L2_HR_LakeSP - Revision A - 20220531reference_document :SWOT-TN-CDM-0677-CNES_Product_Description_L2_HR_PIXCVec - Revision A - 20220531product_version :V5.3.0crid :PIC0pge_name :PGE_L2_HR_LakeSPpge_version :V4.3.0contact :SWOT-contact@cnes.frcycle_number :7pass_number :106tile_number :86swath_side :Rtile_name :106_086Rcontinent_id :NAcontinent_code :7time_granule_start :2023-11-27T04:20:24.437425Ztime_granule_end :2023-11-27T04:20:35.530690Ztime_coverage_start :2023-11-27T04:20:24Ztime_coverage_end :2023-11-27T04:20:34.966118Zgeospatial_lon_min :-107.2245094782927geospatial_lon_max :-106.32383090171766geospatial_lat_min :38.56164725058795geospatial_lat_max :39.320021843662694inner_first_longitude :-106.47881643041174inner_first_latitude :39.320021843662694inner_last_longitude :-106.32383090171766inner_last_latitude :38.69212711409543outer_first_longitude :-107.2245094782927outer_first_latitude :39.18406274086079outer_last_longitude :-107.04259075253788outer_last_latitude :38.56164725058795xref_l2_hr_pixc_file :SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.ncxref_l2_hr_pixcvecriver_file :SWOT_L2_HR_PIXCVecRiver_007_106_086R_20231127T042024_20231127T042035_PIC0_04.ncxref_prior_river_db_file :xref_prior_lake_db_file :SWOT_LakeDatabase_Nom_106_20000101T000000_20991231T235959_20231017T000000_v105.sqlitexref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_param_l2_hr_laketile_file :SWOT_Param_L2_HR_LakeTile_20000101T000000_20991231T235959_20230922T160000_v411.cfgellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805\n\n\n\n\nSimple plot\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals < 1] = np.nan\npixcvec_lonvals[pixcvec_lonvals > -1] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n5. Raster NetCDF\n\n\nSearch for data of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*100m*', # here we filter by files with '100m' in the name (This collection has two resolution options: 100m & 250m)\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 44\n\n\n\n\nOpen data with xarray\n\nds_raster = xr.open_mfdataset(earthaccess.open([raster_results[0]]), engine='h5netcdf')\nds_raster\n\nOpening 1 granules, approx size: 0.04 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1520, y: 1519)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 4.488e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 4.426e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(507, 507), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(507, 507), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(760, 760), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(760, 760), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-12-03T08:26:57Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 04xarray.DatasetDimensions:x: 1520y: 1519Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 4.488e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 448600., 448700., 448800.])y(y)float644.274e+06 4.274e+06 ... 4.426e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 4425600., 4425700., 4425800.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(507, 507), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n1.96 MiB\n\n\nShape\n(1519, 1520)\n(507, 507)\n\n\nDask graph\n9 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n17.62 MiB\n4.41 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n8.81 MiB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(760, 760), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n8.81 MiB\n2.20 MiB\n\n\nShape\n(1519, 1520)\n(760, 760)\n\n\nDask graph\n4 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 447900.0, 448000.0, 448100.0, 448200.0, 448300.0, 448400.0,\n 448500.0, 448600.0, 448700.0, 448800.0],\n dtype='float64', name='x', length=1520))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 4424900.0, 4425000.0, 4425100.0, 4425200.0, 4425300.0, 4425400.0,\n 4425500.0, 4425600.0, 4425700.0, 4425800.0],\n dtype='float64', name='y', length=1519))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-12-03T08:26:57Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-27T04:20:14.437610Ztime_granule_end :2023-11-27T04:20:35.534188Ztime_coverage_start :2023-11-27T04:20:14.980558Ztime_coverage_end :2023-11-27T04:20:34.994509Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_106_084L_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085L_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086L_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087L_20231127T042034_20231127T042045_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_084R_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085R_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087R_20231127T042034_20231127T042045_PIC0_03.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_106_084L_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085L_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_084R_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085R_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_086R_20231127T042024_20231127T042035_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_087R_20231127T042034_20231127T042045_PIC0_04.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :04\n\n\n\n\nQuick interactive plot with hvplot\n\nds_raster.wse.hvplot.image(y='y', x='x')\n\n\n\n\n\n \n\n\n\n\n\n\n6. SLC\n\n\nSearch for data collection and time of interest\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\nslc_results = earthaccess.search_data(short_name = 'SWOT_L1B_HR_SLC_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n #granule_name = '*_009_*', # here we can additionally filter by pass number 009\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 46\n\n\n\n\nOpen data using xarray\nThe L1B_HR_SLC product file contains five NetCDF data group called the slc, xfactor, noise, tvp, and grdem groups. More info can be found in the product description document within the dataset table for each group.\n\nds_SLC = xr.open_mfdataset(earthaccess.open([slc_results[0]]), group = 'slc', engine='h5netcdf')\nds_SLC\n\nOpening 1 granules, approx size: 2.25 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (num_lines: 22956, num_pixels: 5623, complex_depth: 2)\nDimensions without coordinates: num_lines, num_pixels, complex_depth\nData variables:\n slc_plus_y (num_lines, num_pixels, complex_depth) float32 dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>\n slc_minus_y (num_lines, num_pixels, complex_depth) float32 dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>\n slc_qual (num_lines) float32 dask.array<chunksize=(22956,), meta=np.ndarray>\nAttributes:\n description: Single look complex images for plus_y and minus_y channelsxarray.DatasetDimensions:num_lines: 22956num_pixels: 5623complex_depth: 2Coordinates: (0)Data variables: (3)slc_plus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>long_name :single look complex image for the plus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the plus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n10.06 MiB\n\n\nShape\n(22956, 5623, 2)\n(3280, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5623 22956\n\n\n\n\nslc_minus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3280, 804, 1), meta=np.ndarray>long_name :single look complex image for the minus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the minus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n10.06 MiB\n\n\nShape\n(22956, 5623, 2)\n(3280, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5623 22956\n\n\n\n\nslc_qual(num_lines)float32dask.array<chunksize=(22956,), meta=np.ndarray>long_name :SLC quality flagstandard_name :status_flagflag_meanings :tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 32 64 128]valid_min :0valid_max :231comment :Flag indicating conditions that may affect the quality of the SLC data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n89.67 kiB\n89.67 kiB\n\n\nShape\n(22956,)\n(22956,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 22956 1\n\n\n\n\nIndexes: (0)Attributes: (1)description :Single look complex images for plus_y and minus_y channels", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "SWOT", + "Access & Visualization", + "SWOT Hydrology", + "Cloud" ] }, { - "objectID": "notebooks/datasets/smap_imerg_tutorial.html#plot-the-anomalies-for-subset-bounds", - "href": "notebooks/datasets/smap_imerg_tutorial.html#plot-the-anomalies-for-subset-bounds", - "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", - "section": "plot the anomalies for subset bounds", - "text": "plot the anomalies for subset bounds\n\n#Plots precip data only over land, using a colorscale\nmode_choice = 2 \n\n#currently, the line below is commented but you can uncomment this line and it will display raw SSS values (doesnt calculate anomalies) \n#calc_anomaly = 0 \n\n#calculate anomalies relative to the mean\ncalc_anomaly = 1 \n\n#Replace with your dictory for IMERG precip data\ndirectory = os.path.join(base_directory, 'Desktop/imerg_precip')\nif 'backup_subset_mean_values' not in globals():\n backup_subset_mean_values = subset_mean_values\n\n#raw sss values\nif calc_anomaly == 0:\n subset_mean_values = 0\n smin = 31\n smax = 34.5 \n smap = 'rainbow'\n\n#anomaly values\nif calc_anomaly != 0:\n subset_mean_values = backup_subset_mean_values \n smin = -1\n smax = +1 \n smap = 'seismic'\n\n#Replace with your directory \nsss_subset = sorted(glob.glob(os.path.join(base_directory, 'Desktop/jpl_smap_l3/SMAP*.nc*')))\n\n#grabs the sss file date for the subset location and plots anomalies\nfor filename in sss_subset:\n file_date = filename.split('_')[-3].replace('.nc', '')\n updated_file_date = file_date[0:4]+'-'+file_date[4:6]+'-'+file_date[6:8]\n if int(file_date) < int(subset_bounds[0]) or int(file_date) > int(subset_bounds[1]):\n continue\n print(file_date)\n sss_ds = xr.open_dataset(filename)\n try:\n sss_ds = sss_ds.where((sss_ds.latitude>20)&(sss_ds.latitude<50)&(sss_ds.longitude>-140)&(sss_ds.longitude<-100), drop=True)- subset_mean_values\n if sss_ds.smap_sss.size == 0:\n continue\n except Exception as e:\n print(e)\n continue\n plt.rcParams.update({\"font.size\": 24})\n fig = plt.figure(figsize= (16,10))\n ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n\n #grabs the precip file date for the subset location and plots \n substring = file_date\n precip_counter = 0\n for file_path in glob.glob(os.path.join(directory, f'*{substring}*')):\n precip_counter += 1\n if precip_counter >1:\n crashnow\n print(file_path)\n precip = xr.open_dataset(file_path)\n precip = precip.where((precip.lat>20)&(precip.lat<50)&(precip.lon>-140)&(precip.lon<-100),drop=True)\n val = 24*precip.HQprecipitation[0,:,:]/(0.5*precip.HQprecipitation_cnt[0,:,:])\n if mode_choice == 2: \n p = plt.pcolormesh(precip.lon,precip.lat,val.transpose(), cmap = 'viridis', vmax = 20, vmin = 0, transform = ccrs.PlateCarree())\n cb = plt.colorbar(p, fraction=0.046, pad=0.04)\n cb.set_label('mm/day')\n\n #the line below plots the raw sss values if its uncommented\n s = plt.pcolormesh(sss_ds.longitude, sss_ds.latitude, sss_ds.smap_sss, vmin = smin, vmax = smax, cmap = smap, transform = ccrs.PlateCarree())\n \n #adds the colorbar and features to the plot\n cb = plt.colorbar(s, location = 'left', fraction=0.046, pad=0.04)\n if calc_anomaly == 1:\n cb.set_label(f'psu anomalies wrt mean of 12/26 to 1/16 (2015-23)')\n ax.set_title(f'SSS Anomaly over ocean, Precipitation on land\\n{updated_file_date}', size = 24)\n if calc_anomaly != 1:\n cb.set_label('psu')\n ax.set_title(f'SSS over ocean, Precipitation on land\\n{updated_file_date}', size = 24)\n ax.grid()\n ax.add_feature(cfeature.OCEAN)\n ax.add_feature(cfeature.LAND)\n ax.add_feature(cfeature.LAKES)\n ax.add_feature(cfeature.RIVERS)\n ax.add_feature(cfeature.STATES)\n ax.coastlines()\n ax.set_xlim(-130, -115)\n ax.set_ylim(32, 42.5)\n\n #saves figure to output path \n plt.savefig(outputpath+datetime.now().strftime(\"%Y%m%d-%H%M%S\")+'.png',dpi=400, facecolor='w', transparent=False, bbox_inches='tight')\n\n/var/folders/f0/dgnqgvtx46513by9cdh6fnjw0000gq/T/ipykernel_66947/576375500.py:48: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).\n fig = plt.figure(figsize= (16,10))", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#summary", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#summary", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Summary", + "text": "Summary\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\n\nTable of Modules (Algorithms) and Discharge variables\nThe following lists the algorithms alongside their discharge variables and location in the SoS results file assuming that the SoS is an open file represented by the results variable.\nThe first six reference discharge time series for the flow law parameter estimate (FLPE) algorithms while the last six reference the Mean Optimization Integrator (MOI) results. The MOI uses a river topology to force mass conservation at confluences to produce a discharge time series for each reach-level FLPE.\n\n\n\n\n\n\n\n\nModule (Algorithm)\nDischarge Variable\nLocation in the SoS\n\n\n\n\nHiVDI\nQ\nresults[“hivdi”][“Q”]\n\n\nMetroMan\nallq\nresults[“metroman”][“allq”]\n\n\nMOMMA\nQ\nresults[“momma”][“Q”]\n\n\nneoBAM\nq1, q2, or q3\nresults[“neobam”][“q”][“q1”]\n\n\nSAD\nQa\nresults[“sad”][“Qa”]\n\n\nSIC4DVar\nQ_da\nresults[“sic4dvar”][“Q_da”]\n\n\nMOI HiVDI\nq\nresults[“moi”][“hivdi”][“q”]\n\n\nMOI MetroMan\nq\nresults[“moi”][“metroman”][“q”]\n\n\nMOI MOMMA\nq\nresults[“moi”][“momma”][“q”]\n\n\nMOI neoBAM\nq\nresults[“moi”][“qeobam”][“q”]\n\n\nMOI SAD\nq\nresults[“moi”][“sad”][“q”]\n\n\nMOI SIC4DVar\nq\nresults[“moi”][“sic4dvar”][“q”]", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP", - "Use Case Demo" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#summary", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#summary", - "title": "Download and Access L2 SWOT Oceanography Data", - "section": "Summary", - "text": "Summary\nThis notebook will show direct download of PO.DAAC archived products onto your local machine. In this demo, we will showcase the usage of SWOT Level 2 Low Rate products:\n\nSWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product - shortname SWOT_L2_LR_SSH_2.0\nSWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0 - shortname SWOT_L2_NALT_IGDR_SSHA_2.0\n\nThis is a subcollection of the parent collection: SWOT_L2_NALT_IGDR_2.0\n\nSWOT Level 2 Radiometer Data Products - overview of all\n\nWe will download the data and load a time series made of multiple netCDF files into a single xarray dataset.\n\nRequirements\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#requirements", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#requirements", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#learning-objectives", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#learning-objectives", - "title": "Download and Access L2 SWOT Oceanography Data", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#learning-objectives", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#learning-objectives", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", "section": "Learning Objectives", - "text": "Learning Objectives\n\nauthenticate for earthaccess Python Library using your NASA Earthdata Login\naccess DAAC data by downloading directly into your local machine and operating on those files.\nplot the first time step in the data\n\n\nImport Libraries\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", + "text": "Learning Objectives\n\nTo explore and begin to understand the structure of the SoS.\nTo locate and plot river discharge.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", - "title": "Download and Access L2 SWOT Oceanography Data", - "section": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product", - "text": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product\nOutlined below is a map of the different KaRIn Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nSearch and Download Data!\nIt’s time to find our data! Below we are searching using earthaccess Python library.\n\n#retrieves granule from the day we want\nkarin_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_2.0', \n temporal = (\"2024-02-01 12:00:00\", \"2024-02-01 19:43:00\"), \n granule_name = '*Expert*') # filter by files with \"Expert\" in file name. This collection has subcollections of 'Basic', 'Windwave', 'Unsmoothed' and 'Expert' granules.\n\nGranules found: 10\n\n\n\nearthaccess.download(karin_results, \"./data_downloads/SWOT_files\", provider='POCLOUD')\n\n Getting 10 granules, approx download size: 0.32 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_210_20240201T113157_20240201T122325_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_211_20240201T122324_20240201T131449_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_212_20240201T131459_20240201T140619_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_213_20240201T140618_20240201T145746_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_214_20240201T145745_20240201T154830_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_215_20240201T154954_20240201T164039_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_216_20240201T164038_20240201T173206_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_217_20240201T173205_20240201T182333_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_218_20240201T182332_20240201T191500_PIC0_01.nc\nDownloaded: data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_219_20240201T191459_20240201T200627_PIC0_01.nc\n\n\n[PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_210_20240201T113157_20240201T122325_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_211_20240201T122324_20240201T131449_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_212_20240201T131459_20240201T140619_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_213_20240201T140618_20240201T145746_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_214_20240201T145745_20240201T154830_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_215_20240201T154954_20240201T164039_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_216_20240201T164038_20240201T173206_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_217_20240201T173205_20240201T182333_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_218_20240201T182332_20240201T191500_PIC0_01.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert_010_219_20240201T191459_20240201T200627_PIC0_01.nc')]\n\n\n\n#load downloaded data into dataset to be used for plotting\nds = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert*.nc\", combine='nested', concat_dim=\"num_lines\", decode_times=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 4GB\nDimensions: (num_lines: 98660, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-02-03T22:27:17Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 76.4772191457865\n ssha_variance: 0.4263933333980923\n references: V1.2.1\n equator_longitude: -5.36xarray.DatasetDimensions:num_lines: 98660num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nData variables: (98)time(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timecalendar :gregoriantai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ntime_tai(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregoriantai_utc_difference :37.0units :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nobject numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nswh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_model(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_alt_rate(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n385.39 kiB\n38.54 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npole_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndac(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_rate(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nice_conc(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-02-03T22:27:17Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :10pass_number :210equator_time :2024-02-01T11:57:39.935000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-02-01T11:31:57.844839time_coverage_end :2024-02-01T12:23:25.880560geospatial_lon_min :270.91792399999997geospatial_lon_max :78.362457geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :270.91792399999997left_first_latitude :78.27200599999999left_last_longitude :78.343086left_last_latitude :-77.05370099999999right_first_longitude :270.93575right_first_latitude :77.053837right_last_longitude :78.36245699999999right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_010_210_20240201T113154_20240201T122329_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP010_209_20240201_104031_20240201_113158.nc, SWOT_IPN_2PfP010_210_20240201_113158_20240201_122325.nc, SWOT_IPN_2PfP010_211_20240201_122325_20240201_131452.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP010_209_20240201_104027_20240201_113202_PIC0_01.nc, SWOT_IPRAD_2PaP010_210_20240201_113154_20240201_122329_PIC0_01.nc, SWOT_IPRAD_2PaP010_211_20240201_122321_20240201_131455_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240131T233132_20240201T233223_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240202_103657_20240131_225923_20240202_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_PMA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_PMA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_WEA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_WEA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_VWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_UWA_AXVCNE20240202_030828_20240201_180000_20240201_180000, SMM_VWA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240201_174042_20240201_060000_20240201_060000, SMM_PSA_AXVCNE20240201_174042_20240201_120000_20240201_120000, SMM_PSA_AXVCNE20240202_054023_20240201_180000_20240201_180000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_T2M_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_T2M_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CWV_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CWV_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CLW_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CLW_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_SWH_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_SWH_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_gim_files :JPLQ0320.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240203_020000_19900101_000000_20240801_000000xref_dac_files :SMM_MOG_AXPCNE20240201_203002_20240201_060000_20240201_060000, SMM_MOG_AXPCNE20240201_203002_20240201_120000_20240201_120000, SMM_MOG_AXPCNE20240202_074502_20240201_180000_20240201_180000xref_precipitation_files :SMM_LSR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_CRR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grbxref_sea_ice_mask_files :SMM_ICS_AXFCNE20240202_042003_20240201_000000_20240201_235959.nc, SMM_ICN_AXFCNE20240202_041506_20240201_000000_20240201_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240202_072016_20240201_030000_20240202_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :76.4772191457865ssha_variance :0.4263933333980923references :V1.2.1equator_longitude :-5.36\n\n\n\n\nCross Over Calibration Correction\nIn order to get the corrected SSHA, we must compute a new column like the following:\n\nds['ssha_karin_corrected'] = ds.ssha_karin + ds.height_cor_xover\nds.ssha_karin_corrected\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'ssha_karin_corrected' (num_lines: 98660, num_pixels: 69)> Size: 54MB\ndask.array<add, shape=(98660, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixelsxarray.DataArray'ssha_karin_corrected'num_lines: 98660num_pixels: 69dask.array<chunksize=(9866, 69), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 43 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nCoordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nIndexes: (0)Attributes: (0)\n\n\n\n\nPlot\nNow let’s plot a variable (ssha_karin_corrected) from these 10 files in a chosen projection.\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nds.ssha_karin_corrected.plot.pcolormesh(\n ax=ax, transform=ccrs.PlateCarree(), x=\"longitude\", y=\"latitude\", vmin = -1, vmax=1, cmap='coolwarm', add_colorbar=True\n)\nax.coastlines()", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#import-packages", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#import-packages", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Import Packages", + "text": "Import Packages\n\nimport datetime\nimport pathlib\n\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\nimport earthaccess\nimport matplotlib.pyplot as plt\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", - "title": "Download and Access L2 SWOT Oceanography Data", - "section": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0", - "text": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0\nOutlined below is a map of the different Nadir Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nSearch and Download Data!\nBelow we are searching using earthaccess Python library.\n\n#retrieves granule from the day we want\nnadir_results = earthaccess.search_data(short_name = 'SWOT_L2_NALT_IGDR_SSHA_2.0', temporal = (\"2024-01-30 12:00:00\", \"2024-01-30 19:43:00\"))\n\nGranules found: 10\n\n\n\nearthaccess.download(nadir_results, \"./data_downloads/SWOT_files\")\n\n Getting 10 granules, approx download size: 0.0 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc\nDownloaded: data_downloads/SWOT_files/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc\n\n\n[PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc'),\n PosixPath('data_downloads/SWOT_files/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc')]\n\n\n\n#load downloaded data into dataset to be used for plotting\nds_nadir = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_IPR_*.nc\", combine='nested', concat_dim=\"time\", decode_times=False, engine='h5netcdf', group='data_01')\nds_nadir\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 6MB\nDimensions: (time: 27927)\nCoordinates:\n * time (time) float64 223kB 7.599e+08 ... 7.6...\n latitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n longitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\nData variables: (12/31)\n time_tai (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n surface_classification_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_1_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_2_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n alt_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n ... ...\n pole_tide (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n internal_tide_hret (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt_mle3 (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_water_vapor (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_cloud_liquid_water (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>xarray.DatasetDimensions:time: 27927Coordinates: (3)time(time)float647.599e+08 7.599e+08 ... 7.6e+08long_name :time in UTCstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute [leap_second] is set to the UTC time at which the leap second occurstai_utc_difference :37.0leap_second :0000-00-00 00:00:00array([7.599295e+08, 7.599295e+08, 7.599295e+08, ..., 7.599603e+08,\n 7.599603e+08, 7.599603e+08])latitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :latitudestandard_name :latitudeunits :degrees_northcomment :Positive latitude is North latitude, negative latitude is South latitude. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nlongitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :longitudestandard_name :longitudeunits :degrees_eastcomment :East longitude relative to Greenwich meridian. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nData variables: (31)time_tai(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsurface_classification_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :surface classificationflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]comment :Computed from a mask built with MODIS and GlobCover data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from first radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from second radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nalt_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all altimeter flags except altimeter echo type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all radiometer flags except radiometer surface type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ngeo_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geophysical quality flagflag_meanings :good badflag_values :[0 1]comment :Check on validity of all geophysical fields : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmeteo_map_availability_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ECMWF meteorological map availabilityflag_meanings :2_maps_nominal 2_maps_degraded 1_map_closest_used no_valid_mapflag_values :[0 1 2 3]comment :Possible values are: 0 meaning ’2 maps, nominal’ (six hours apart), 1 meaning ’2 maps, degraded’ (more than six hours apart), 2 meaning ’1 map, closest map used’, 3 meaning ’no valid map’\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor_interp_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correction interpolation quality flagflag_meanings :good degraded badflag_values :[0 1 2]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :rain flagflag_meanings :no_rain rain high_rain_probability_from_altimeter high_probability_of_no_rain_from_altimeter ambiguous_situation_possibility_of_ice evaluation_not_possibleflag_values :[0 1 2 3 4 5]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from first radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from second radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ice flagflag_meanings :no_ice iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from first radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from second radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\naltitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :1 Hz altitude of satellitestandard_name :height_above_reference_ellipsoidunits :mcomment :Altitude of satellite above the reference ellipsoid. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmodel_dry_tropo_cor_zero_altitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :model dry tropospheric correction at zero altitudestandard_name :altimeter_range_correction_due_to_dry_tropospheresource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at Mean Sea Level Pressure at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. A dry tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for dry tropospheric range delays of the radar pulse. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correctionstandard_name :altimeter_range_correction_due_to_wet_tropospheresource :AMRinstitution :NASA/JPLunits :mcomment :A wet tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for wet tropospheric range delays of the radar pulse\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_sea_surface_cnescls(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS solution) above reference ellipsoidsource :MSS_CNES_CLS-2015institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_dynamic_topography(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean dynamic topography above geoidsource :MDT_CNES_CLS-2018institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndepth_or_elevation(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ocean depth/land elevationsource :ACE2institution :EAPRS Laboratoryunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninv_bar_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :inverted barometer height correctionstandard_name :sea_surface_height_correction_due_to_air_pressure_at_low_frequencysource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndac(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :dynamic atmospheric correctioninstitution :LEGOS/CLS/CNESunits :mcomment :Sum of the high frequency fluctuations correction and of the low frequency inverted barometer correction (inv_bar_cor). See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nocean_tide_fes(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric ocean tide height (FES solution)standard_name :sea_surface_height_amplitude_due_to_geocentric_ocean_tidesource :FES2014binstitution :LEGOS/NOVELTIS/CNES/CLSunits :mcomment :Includes the equilibrium long-period ocean tide height and only the short-period part of the corresponding loading tide. The permanent tide (zero frequency) is not included in this parameter because it is included in the geoid and mean sea surface (geoid, mean_sea_surface_cnescls). To get the total geocentric tide height (FES solution), do: ocean_tide_fes + ocean_tide_non_eq. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsolid_earth_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :solid earth tide heightstandard_name :sea_surface_height_amplitude_due_to_earth_tidesource :Cartwright and Edden [1973] Corrected tables of tidal harmonics - J. Geophys. J. R. Astr. Soc., 33, 253-264.units :mcomment :Calculated using Cartwright and Tayler tables and consisting of the second and third degree constituents. The permanent tide (zero frequency) is not included. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\npole_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric pole tide heightstandard_name :sea_surface_height_amplitude_due_to_pole_tidesource :Desai, S., Wahr, J. & Beckley, B. J Geod [2015] 89: 1233units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninternal_tide_hret(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :internal tide heightsource :E. D. Zaron. Baroclinic tidal sea level from exact-repeat mission altimetry. Journal of Physical Oceanography, 49(1):193-210, 2019.units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speedstandard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.06 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt_mle3(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speed (MLE3 retracking)standard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.109 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean_mle3) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_water_vapor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer water vapor contentstandard_name :atmosphere_water_vapor_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_cloud_liquid_water(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer liquid water contentstandard_name :atmosphere_cloud_liquid_water_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(Index([759929456.5671339, 759929457.6690049, 759929458.770874,\n 759929459.872746, 759929460.9746141, 759929462.0764852,\n 759929463.1783538, 759929464.2802248, 759929465.3820939,\n 759929466.4839649,\n ...\n 759960314.5902781, 759960315.6921468, 759960316.7940178,\n 759960317.8958869, 759960318.9977579, 759960320.099627,\n 759960321.201498, 759960322.3033671, 759960323.4052382,\n 759960324.5071082],\n dtype='float64', name='time', length=27927))Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nax.coastlines()\nplt.scatter(x=ds_nadir.longitude, y=ds_nadir.latitude, c=ds_nadir.depth_or_elevation, marker='.')\nplt.colorbar().set_label('Depth or Elevation (m)')", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#authenticate", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#authenticate", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Authenticate", + "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x16aa132c0>", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", - "title": "Download and Access L2 SWOT Oceanography Data", - "section": "3. SWOT Level 2 Radiometer Datasets", - "text": "3. SWOT Level 2 Radiometer Datasets\nOutlined below is a map of the different Radiometer Data Products we host at PO.DAAC, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can search and visualize this dataset in a workflow similar to the above datasets.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#search-and-access-sos-data", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#search-and-access-sos-data", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Search and Access SoS data", + "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#a-final-word", - "href": "notebooks/datasets/Localmachine_SWOT_Oceanography.html#a-final-word", - "title": "Download and Access L2 SWOT Oceanography Data", - "section": "A final word…", - "text": "A final word…\nAccessing data completely in memory are affected by various things. Tools like xarray make a lot of assumptions about how to open and read a file. Sometimes the internals don’t fit the xarray ‘mould’ and we need to continue to work with data providers and software providers to make these two sides work together. Level 2 data (non-gridded), specifically, suffers from some of the assumptions made.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#explore-the-sos", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#explore-the-sos", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Explore the SoS", + "text": "Explore the SoS\nWe can now explore the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n\n# Display the priors groups\nprint(\"Priors Groups:\")\nprint(priors.groups)\n\nPriors Groups:\n{'reaches': <class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches)\n groups: , 'nodes': <class 'netCDF4._netCDF4.Group'>\ngroup /nodes:\n dimensions(sizes): \n variables(dimensions): int64 node_id(num_nodes), int64 reach_id(num_nodes), float64 x(num_nodes), float64 y(num_nodes), <class 'str'> river_name(num_nodes)\n groups: , 'model': <class 'netCDF4._netCDF4.Group'>\ngroup /model:\n dimensions(sizes): num_months(12), probability(20)\n variables(dimensions): int32 num_months(num_months), int32 probability(probability), float64 flow_duration_q(num_reaches, probability), float64 max_q(num_reaches), float64 monthly_q(num_reaches, num_months), float64 mean_q(num_reaches), float64 min_q(num_reaches), float64 two_year_return_q(num_reaches), int32 area_estimate_flag(num_reaches)\n groups: , 'gbpriors': <class 'netCDF4._netCDF4.Group'>\ngroup /gbpriors:\n dimensions(sizes): \n variables(dimensions): \n groups: reach, node, 'EAU': <class 'netCDF4._netCDF4.Group'>\ngroup /EAU:\n dimensions(sizes): num_days(16130), num_months(12), probability(20), nchars(100), num_EAU_reaches(243)\n variables(dimensions): int32 num_days(num_days), int32 CAL(num_EAU_reaches), int32 EAU_reaches(num_EAU_reaches), int64 EAU_reach_id(num_EAU_reaches), float64 EAU_flow_duration_q(num_EAU_reaches, probability), float64 EAU_max_q(num_EAU_reaches), float64 EAU_monthly_q(num_EAU_reaches, num_months), float64 EAU_mean_q(num_EAU_reaches), float64 EAU_min_q(num_EAU_reaches), float64 EAU_two_year_return_q(num_EAU_reaches), |S1 EAU_id(num_EAU_reaches, nchars), float64 EAU_q(num_EAU_reaches, num_days), float64 EAU_qt(num_EAU_reaches, num_days)\n groups: , 'DEFRA': <class 'netCDF4._netCDF4.Group'>\ngroup /DEFRA:\n dimensions(sizes): num_days(16130), num_months(12), probability(20), nchars(100), num_DEFRA_reaches(26)\n variables(dimensions): int32 num_days(num_days), int32 CAL(num_DEFRA_reaches), int32 DEFRA_reaches(num_DEFRA_reaches), int64 DEFRA_reach_id(num_DEFRA_reaches), float64 DEFRA_flow_duration_q(num_DEFRA_reaches, probability), float64 DEFRA_max_q(num_DEFRA_reaches), float64 DEFRA_monthly_q(num_DEFRA_reaches, num_months), float64 DEFRA_mean_q(num_DEFRA_reaches), float64 DEFRA_min_q(num_DEFRA_reaches), float64 DEFRA_two_year_return_q(num_DEFRA_reaches), |S1 DEFRA_id(num_DEFRA_reaches, nchars), float64 DEFRA_q(num_DEFRA_reaches, num_days), float64 DEFRA_qt(num_DEFRA_reaches, num_days)\n groups: }\n\n\n\n# Display the module groups\nprint(\"Results Groups:\")\nprint(results.groups)\n\nResults Groups:\n{'reaches': <class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches), int32 observations(num_reaches), float64 time(num_reaches)\n groups: , 'nodes': <class 'netCDF4._netCDF4.Group'>\ngroup /nodes:\n dimensions(sizes): \n variables(dimensions): int64 node_id(num_nodes), int64 reach_id(num_nodes), float64 x(num_nodes), float64 y(num_nodes), <class 'str'> river_name(num_nodes), int32 observations(num_nodes), float64 time(num_nodes)\n groups: , 'hivdi': <class 'netCDF4._netCDF4.Group'>\ngroup /hivdi:\n dimensions(sizes): \n variables(dimensions): float64 Q(num_reaches), float64 A0(num_reaches), float64 beta(num_reaches), float64 alpha(num_reaches)\n groups: , 'metroman': <class 'netCDF4._netCDF4.Group'>\ngroup /metroman:\n dimensions(sizes): \n variables(dimensions): float64 allq(num_reaches), float64 A0hat(num_reaches), float64 nahat(num_reaches), float64 x1hat(num_reaches), float64 q_u(num_reaches)\n groups: , 'moi': <class 'netCDF4._netCDF4.Group'>\ngroup /moi:\n dimensions(sizes): \n variables(dimensions): \n groups: geobam, hivdi, metroman, momma, sad, sic4dvar, 'momma': <class 'netCDF4._netCDF4.Group'>\ngroup /momma:\n dimensions(sizes): \n variables(dimensions): float64 stage(num_reaches), float64 width(num_reaches), float64 slope(num_reaches), float64 Qgage(num_reaches), float64 seg(num_reaches), float64 n(num_reaches), float64 Y(num_reaches), float64 v(num_reaches), float64 Q(num_reaches), float64 Q_constrained(num_reaches), float64 gage_constrained(num_reaches), float64 input_Qm_prior(num_reaches), float64 input_Qb_prior(num_reaches), float64 input_Yb_prior(num_reaches), float64 input_known_ezf(num_reaches), float64 input_known_bkfl_stage(num_reaches), float64 input_known_nb_seg1(num_reaches), float64 input_known_x_seg1(num_reaches), float64 Qgage_constrained_nb_seg1(num_reaches), float64 Qgage_constrained_x_seg1(num_reaches), float64 input_known_nb_seg2(num_reaches), float64 input_known_x_seg2(num_reaches), float64 Qgage_constrained_nb_seg2(num_reaches), float64 Qgage_constrained_x_seg2(num_reaches), float64 n_bkfl_Qb_prior(num_reaches), float64 n_bkfl_slope(num_reaches), float64 vel_bkfl_Qb_prior(num_reaches), float64 Froude_bkfl_diag_Smean(num_reaches), float64 width_bkfl_solved_obs(num_reaches), float64 depth_bkfl_solved_obs(num_reaches), float64 depth_bkfl_diag_Wb_Smean(num_reaches), float64 zero_flow_stage(num_reaches), float64 bankfull_stage(num_reaches), float64 Qmean_prior(num_reaches), float64 Qmean_momma(num_reaches), float64 Qmean_momma.constrained(num_reaches), float64 width_stage_corr(num_reaches)\n groups: , 'neobam': <class 'netCDF4._netCDF4.Group'>\ngroup /neobam:\n dimensions(sizes): \n variables(dimensions): \n groups: r, logn, logDb, logWb, q, 'offline': <class 'netCDF4._netCDF4.Group'>\ngroup /offline:\n dimensions(sizes): \n variables(dimensions): float64 d_x_area(num_reaches), float64 d_x_area_u(num_reaches), float64 metro_q_c(num_reaches), float64 bam_q_c(num_reaches), float64 hivdi_q_c(num_reaches), float64 momma_q_c(num_reaches), float64 sads_q_c(num_reaches), float64 consensus_q_c(num_reaches), float64 metro_q_uc(num_reaches), float64 bam_q_uc(num_reaches), float64 hivdi_q_uc(num_reaches), float64 momma_q_uc(num_reaches), float64 sads_q_uc(num_reaches), float64 consensus_q_uc(num_reaches)\n groups: , 'postdiagnostics': <class 'netCDF4._netCDF4.Group'>\ngroup /postdiagnostics:\n dimensions(sizes): nchar(10)\n variables(dimensions): \n groups: basin, reach, 'prediagnostics': <class 'netCDF4._netCDF4.Group'>\ngroup /prediagnostics:\n dimensions(sizes): \n variables(dimensions): \n groups: reach, node, 'sad': <class 'netCDF4._netCDF4.Group'>\ngroup /sad:\n dimensions(sizes): \n variables(dimensions): float64 A0(num_reaches), float64 n(num_reaches), float64 Qa(num_reaches), float64 Q_u(num_reaches)\n groups: , 'sic4dvar': <class 'netCDF4._netCDF4.Group'>\ngroup /sic4dvar:\n dimensions(sizes): \n variables(dimensions): float64 A0(num_reaches), float64 n(num_reaches), float64 Q_mm(num_reaches), float64 Q_da(num_reaches)\n groups: , 'validation': <class 'netCDF4._netCDF4.Group'>\ngroup /validation:\n dimensions(sizes): num_algos(14), nchar(16)\n variables(dimensions): |S1 algo_names(num_reaches, num_algos, nchar), int32 has_validation(num_reaches), float64 nse(num_reaches, num_algos), float64 rsq(num_reaches, num_algos), float64 kge(num_reaches, num_algos), float64 rmse(num_reaches, num_algos), float64 testn(num_reaches, num_algos), float64 nrmse(num_reaches, num_algos), float64 nbias(num_reaches, num_algos), float64 rrmse(num_reaches, num_algos)\n groups: }", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Local" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#summary", - "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#summary", - "title": "Access SWOT L2 Oceanography Data in AWS Cloud", - "section": "Summary", - "text": "Summary\nThis notebook will show direct access of PO.DAAC archived products in the Earthdata Cloud in AWS Simple Storage Service (S3). In this demo, we will showcase the usage of SWOT Level 2 Low Rate products:\n\nSWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product - shortname SWOT_L2_LR_SSH_2.0\nSWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0 - shortname SWOT_L2_NALT_IGDR_SSHA_2.0\n\nThis is a subcollection of the parent collection: SWOT_L2_NALT_IGDR_2.0\n\nSWOT Level 2 Radiometer Data Products - overview of all\n\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF files into a single xarray dataset.\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2 region.\nThis instance will cost approximately $0.0832 per hour. The entire demo can run in considerably less time.\n\n\nLearning Objectives:\n\nauthenticate for earthaccess Python Library using your NASA Earthdata Login\naccess DAAC data directly from the in-region S3 bucket without moving or downloading any files to your local (cloud) workspace\nplot the first time step in the data\n\nNote: no files are being downloaded off the cloud, rather, we are working with the data in the AWS cloud.\n\n\nLibraries Needed:\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-river-reach-locations", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-river-reach-locations", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Plot river reach locations", + "text": "Plot river reach locations\nInformation about the spatial location of river reaches is in the reaches and nodes groups including river names. This data is taken directly from SWOT River Database (SWORD).\n\nreaches = results.groups['reaches'] # Access the reaches group\n\nprint(\"Reaches Group\")\nprint(reaches, \"\\n\")\n\nprint(\"Longitude\")\nprint(reaches.variables['x'])\n\nReaches Group\n<class 'netCDF4._netCDF4.Group'>\ngroup /reaches:\n dimensions(sizes): \n variables(dimensions): int64 reach_id(num_reaches), float64 x(num_reaches), float64 y(num_reaches), <class 'str'> river_name(num_reaches), int32 observations(num_reaches), float64 time(num_reaches)\n groups: \n\nLongitude\n<class 'netCDF4._netCDF4.Variable'>\nfloat64 x(num_reaches)\n long_name: longitude\n comment: longitude of the reach center decimal ranging from 180°E to 180°W\n units: degrees_east\n valid_min: -180.0\n valid_max: 180.0\n coverage_content_type: coordinate\npath = /reaches\nunlimited dimensions: \ncurrent shape = (30768,)\nfilling on, default _FillValue of 9.969209968386869e+36 used\n\n\n\n# Unpack the spatial coordinates and river names\nreach_lon = results.groups['reaches'].variables['x']\nreach_lat = results.groups['reaches'].variables['y']\n\nriver_names = results.groups['reaches'].variables['river_name']\n\n# Filter data to only find the river of interest\nidx = np.where(river_names[:] == RIVER_NAME)\nprint(f\"Indexes for {RIVER_NAME}:\\n {idx}\")\n\nIndexes for Rhine:\n (array([12597, 12598, 12599, 12600, 12601, 12602, 12603, 12606, 12616,\n 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625,\n 12626, 12627, 12628, 12629, 12630, 12631, 12634, 12635, 12636,\n 12638, 12639, 12640, 12769, 12918, 12919, 12920, 12923, 12924,\n 12925, 12926, 12931, 12932, 12933, 12938, 12939, 12940, 12941,\n 12942, 12943, 12944, 13098, 13099, 13100, 13101, 13102, 13152,\n 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, 13161,\n 13162, 13163, 13164, 13165, 13166, 13168, 13169, 13170, 13172,\n 13173, 13174, 13175, 13176, 13177, 13178, 13179, 13180, 13181,\n 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190,\n 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 13199,\n 13200, 13201, 13202, 13204, 13205, 13206, 13207, 13208, 13316,\n 13317, 13319, 13324, 13325, 13326, 13327, 13328, 13329, 13330,\n 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13339, 13340,\n 13341, 13342, 13343, 13345, 13346, 13362, 13363, 13364, 13365,\n 13366, 13367, 13368, 13369, 13370, 13371, 13372, 13373, 13374,\n 13375, 13385]),)\n\n\n\n# Plot the location of the river\nfig = plt.figure(figsize=(10,10))\n\n# Add map elements gridlines\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.add_feature(cfeature.STATES, edgecolor='black')\n\ngl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=1, color='black', alpha=0.5, linestyle='--', draw_labels=True)\ngl.xlabels_top = False\ngl.ylabels_left = True\ngl.ylabels_right=False\ngl.xlines = True\n\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\n\n# Plot the river reach centerpoint locations\nax.scatter(reach_lon[idx], y=reach_lat[idx], color='c')\n\n# Add the title\nplt.title(f'{RIVER_NAME} Reach Centerpoint Locations')\n\nText(0.5, 1.0, 'Rhine Reach Centerpoint Locations')", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Cloud" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", - "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-karin-low-rate-sea-surface-height-data-product", - "title": "Access SWOT L2 Oceanography Data in AWS Cloud", - "section": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product", - "text": "1. SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product\nOutlined below is a map of the different KaRIn Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nAccess Files without any Downloads to your running instance\nHere, we use the earthaccess Python library to search for and then load the data directly into xarray without downloading any files. This dataset is currently restricted to a select few people, and can only be accessed using the version of earthaccess reinstalled above. If zero granules are returned, make sure the correct version ‘0.5.4’ is installed.\n\n#retrieves granule from the day we want\nkarin_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_EXPERT_2.0', \n temporal = (\"2024-02-01 12:00:00\", \"2024-02-01 19:43:00\"))\n\nGranules found: 10\n\n\n\n\nOpen with xarray\nThe files we are looking at are about 11-13 MB each. So the 10 we’re looking to access are about ~100 MB total.\n\n#opens granules and load into xarray dataset\nds = xr.open_mfdataset(earthaccess.open(karin_results), combine='nested', concat_dim=\"num_lines\", decode_times=False, engine='h5netcdf')\nds\n\nOpening 10 granules, approx size: 0.32 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 4GB\nDimensions: (num_lines: 98660, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 27MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-02-03T22:27:17Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 76.4772191457865\n ssha_variance: 0.4263933333980923\n references: V1.2.1\n equator_longitude: -5.36xarray.DatasetDimensions:num_lines: 98660num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nData variables: (98)time(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timecalendar :gregoriantai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ntime_tai(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregoriantai_utc_difference :37.0units :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nobject numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nswh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_model(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_alt_rate(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n385.39 kiB\n38.54 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float64dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.51 MiB\n154.16 kiB\n\n\nShape\n(98660, 2)\n(9866, 2)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 98660\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nload_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\npole_tide(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ndac(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nrain_rate(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nice_conc(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.97 MiB\n2.60 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-02-03T22:27:17Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :10pass_number :210equator_time :2024-02-01T11:57:39.935000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-02-01T11:31:57.844839time_coverage_end :2024-02-01T12:23:25.880560geospatial_lon_min :270.91792399999997geospatial_lon_max :78.362457geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :270.91792399999997left_first_latitude :78.27200599999999left_last_longitude :78.343086left_last_latitude :-77.05370099999999right_first_longitude :270.93575right_first_latitude :77.053837right_last_longitude :78.36245699999999right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_010_210_20240201T113154_20240201T122329_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP010_209_20240201_104031_20240201_113158.nc, SWOT_IPN_2PfP010_210_20240201_113158_20240201_122325.nc, SWOT_IPN_2PfP010_211_20240201_122325_20240201_131452.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP010_209_20240201_104027_20240201_113202_PIC0_01.nc, SWOT_IPRAD_2PaP010_210_20240201_113154_20240201_122329_PIC0_01.nc, SWOT_IPRAD_2PaP010_211_20240201_122321_20240201_131455_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240131T233132_20240201T233223_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240202_103657_20240131_225923_20240202_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_PMA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_PMA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_WEA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_WEA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_164030_20240201_060000_20240201_060000, SMM_UWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_VWA_AXVCNE20240201_171613_20240201_120000_20240201_120000, SMM_UWA_AXVCNE20240202_030828_20240201_180000_20240201_180000, SMM_VWA_AXVCNE20240202_030828_20240201_180000_20240201_180000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240201_174042_20240201_060000_20240201_060000, SMM_PSA_AXVCNE20240201_174042_20240201_120000_20240201_120000, SMM_PSA_AXVCNE20240202_054023_20240201_180000_20240201_180000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_T2M_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_T2M_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CWV_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CWV_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_CLW_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_CLW_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240201_174042_20240201_060000_20240201_060000.grb, SMM_SWH_AXPCNE20240201_174042_20240201_120000_20240201_120000.grb, SMM_SWH_AXPCNE20240202_054023_20240201_180000_20240201_180000.grbxref_gim_files :JPLQ0320.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240203_020000_19900101_000000_20240801_000000xref_dac_files :SMM_MOG_AXPCNE20240201_203002_20240201_060000_20240201_060000, SMM_MOG_AXPCNE20240201_203002_20240201_120000_20240201_120000, SMM_MOG_AXPCNE20240202_074502_20240201_180000_20240201_180000xref_precipitation_files :SMM_LSR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_CRR_AXFCNE20240201_065551_20240201_060000_20240201_060000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_120000_20240201_120000.grb, SMM_LSR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grb, SMM_CRR_AXFCNE20240201_185554_20240201_180000_20240201_180000.grbxref_sea_ice_mask_files :SMM_ICS_AXFCNE20240202_042003_20240201_000000_20240201_235959.nc, SMM_ICN_AXFCNE20240202_041506_20240201_000000_20240201_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240202_072016_20240201_030000_20240202_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :76.4772191457865ssha_variance :0.4263933333980923references :V1.2.1equator_longitude :-5.36\n\n\n\n\nCross Over Calibration Correction\nIn order to get the corrected SSHA, we must compute a new column like the following:\n\nds['ssha_karin_corrected'] = ds.ssha_karin + ds.height_cor_xover\nds.ssha_karin_corrected\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'ssha_karin_corrected' (num_lines: 98660, num_pixels: 69)> Size: 54MB\ndask.array<add, shape=(98660, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nCoordinates:\n latitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 54MB dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 789kB dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixelsxarray.DataArray'ssha_karin_corrected'num_lines: 98660num_pixels: 69dask.array<chunksize=(9866, 69), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 43 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nCoordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.94 MiB\n5.19 MiB\n\n\nShape\n(98660, 69)\n(9866, 69)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 69 98660\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n770.78 kiB\n77.08 kiB\n\n\nShape\n(98660,)\n(9866,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 98660 1\n\n\n\n\nIndexes: (0)Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nds.ssha_karin_corrected.plot.pcolormesh(\n ax=ax, transform=ccrs.PlateCarree(), x=\"longitude\", y=\"latitude\", vmin = -1, vmax=1, cmap='coolwarm', add_colorbar=True\n)\nax.coastlines()", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#navigating-reaches-and-nodes", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#navigating-reaches-and-nodes", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Navigating Reaches and Nodes", + "text": "Navigating Reaches and Nodes\nThe SoS is organized by continent following the conventions set in the SWOT River Database for the NetCDF file format. Reach identifiers can be found in the “reaches” group and node identifiers can be found in the “nodes” group. The following sections show you how to locate reaches and nodes by river name which allows you to index into the reach and/or node level data.\nHow to locate reach and node identifiers by river name\nYou can search for a river name using the same convention as used when plotting river reach locations to obtain the reach identifiers for that river. You can then use the reach identifiers to locate the nodes that belong to each reach for that river as the nodes are indexed on a different dimension (num_nodes) than reaches (num_reaches).\n\n# Locate the indexes for the specific river you are interested in\nriver_names = results['reaches']['river_name'][:]\nreach_idx = np.where(river_names[:] == RIVER_NAME)\n\n# Locate the reach identifiers for the river name\nreach_identifiers = results['reaches']['reach_id'][reach_idx]\n\n# Locate the reach identifiers of interest on the node-level\nreach_node_identifiers = results['nodes']['reach_id'][:]\nnode_idx = []\nfor reach_identifier in reach_identifiers:\n node_idx.extend(np.where(reach_node_identifiers == reach_identifier)[0])\n\n# Locate the node identifiers of interest using the reach identifiers to index\nnode_identifiers = results['nodes']['node_id'][:]\nprint(f\"Node identifiers: {node_identifiers}\")\n\nNode identifiers: [21101200010013 21101200010023 21101200010033 ... 29690900020221\n 29690900020231 29690900030746]\n\n\n\n# Unpack the spatial coordinates on the node level and index to values of interest\nnode_lon = results['nodes']['x'][node_idx]\nnode_lat = results['nodes']['y'][node_idx]\nprint(f\"Longitude #: {node_lon.shape}\")\nprint(f\"Latitude #: {node_lat.shape}\")\n\nLongitude #: (4620,)\nLatitude #: (4620,)\n\n\n\n# Plot the nodes\nfig = plt.figure(figsize=(10,10))\n\n# Add map elements gridlines\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.add_feature(cfeature.STATES, edgecolor='black')\n\ngl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=1, color='black', alpha=0.5, linestyle='--', draw_labels=True)\ngl.xlabels_top = False\ngl.ylabels_left = True\ngl.ylabels_right=False\ngl.xlines = True\n\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\n\n# Plot the river reach centerpoint locations\nax.scatter(x=node_lon, y=node_lat)\n\n# Add the title\nplt.title(f'{RIVER_NAME} Node Centerpoint Locations')\n\nText(0.5, 1.0, 'Rhine Node Centerpoint Locations')", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Cloud" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", - "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-nadir-altimeter-interim-geophysical-data-record-with-waveforms---ssha-version-2.0", - "title": "Access SWOT L2 Oceanography Data in AWS Cloud", - "section": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0", - "text": "2. SWOT Level 2 Nadir Altimeter Interim Geophysical Data Record with Waveforms - SSHA Version 2.0\nOutlined below is a map of the different Nadir Data Products we host at PO.DAAC and their sub collections, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can enter its shortname or subcollection below in the search query.\n\nAccess Files without any Downloads to your running instance\nHere, we use the earthaccess Python library to search for and then load the data directly into xarray without downloading any files.\n\n#retrieves granule from the day we want\nnadir_results = earthaccess.search_data(short_name = 'SWOT_L2_NALT_IGDR_SSHA_2.0', temporal = (\"2024-01-30 12:00:00\", \"2024-01-30 19:43:00\"))\n\nGranules found: 10\n\n\n\nfor g in nadir_results:\n print(earthaccess.results.DataGranule.data_links(g, access='direct'))\n\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_154_20240130_113056_20240130_122223.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_155_20240130_122223_20240130_131350.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_156_20240130_131350_20240130_140516.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_157_20240130_140516_20240130_145643.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_158_20240130_145643_20240130_154810.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_159_20240130_154810_20240130_163937.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_160_20240130_163937_20240130_173104.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_161_20240130_173104_20240130_182230.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_162_20240130_182230_20240130_191357.nc']\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_NALT_IGDR_2.0/SWOT_IPR_2PfP010_163_20240130_191357_20240130_200524.nc']\n\n\n\n#opens granules and load into xarray dataset, for xarray to work, make sure 'group' is specified.\nds_nadir = xr.open_mfdataset(earthaccess.open(nadir_results), combine='nested', concat_dim=\"time\", decode_times=False, engine='h5netcdf', group='data_01')\nds_nadir\n\nOpening 10 granules, approx size: 0.0 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 6MB\nDimensions: (time: 27927)\nCoordinates:\n * time (time) float64 223kB 7.599e+08 ... 7.6...\n latitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n longitude (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\nData variables: (12/31)\n time_tai (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n surface_classification_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_1_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_side_2_surface_type_flag (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n alt_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_qual (time) float32 112kB dask.array<chunksize=(2806,), meta=np.ndarray>\n ... ...\n pole_tide (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n internal_tide_hret (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n wind_speed_alt_mle3 (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_water_vapor (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>\n rad_cloud_liquid_water (time) float64 223kB dask.array<chunksize=(2806,), meta=np.ndarray>xarray.DatasetDimensions:time: 27927Coordinates: (3)time(time)float647.599e+08 7.599e+08 ... 7.6e+08long_name :time in UTCstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute [leap_second] is set to the UTC time at which the leap second occurstai_utc_difference :37.0leap_second :0000-00-00 00:00:00array([7.599295e+08, 7.599295e+08, 7.599295e+08, ..., 7.599603e+08,\n 7.599603e+08, 7.599603e+08])latitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :latitudestandard_name :latitudeunits :degrees_northcomment :Positive latitude is North latitude, negative latitude is South latitude. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nlongitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :longitudestandard_name :longitudeunits :degrees_eastcomment :East longitude relative to Greenwich meridian. See SWOT Nadir Altimeter User Handbook. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nData variables: (31)time_tai(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :time in TAIstandard_name :timecalendar :gregorianunits :seconds since 2000-01-01 00:00:00.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsurface_classification_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :surface classificationflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]comment :Computed from a mask built with MODIS and GlobCover data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from first radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_surface_type_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer surface type from second radiometerflag_meanings :open_ocean near_coast landflag_values :[0 1 2]\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nalt_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all altimeter flags except altimeter echo type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer quality flagflag_meanings :good badflag_values :[0 1]comment :Compilation of all radiometer flags except radiometer surface type : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ngeo_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geophysical quality flagflag_meanings :good badflag_values :[0 1]comment :Check on validity of all geophysical fields : Set to default in the current issue\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmeteo_map_availability_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ECMWF meteorological map availabilityflag_meanings :2_maps_nominal 2_maps_degraded 1_map_closest_used no_valid_mapflag_values :[0 1 2 3]comment :Possible values are: 0 meaning ’2 maps, nominal’ (six hours apart), 1 meaning ’2 maps, degraded’ (more than six hours apart), 2 meaning ’1 map, closest map used’, 3 meaning ’no valid map’\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor_interp_qual(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correction interpolation quality flagflag_meanings :good degraded badflag_values :[0 1 2]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :rain flagflag_meanings :no_rain rain high_rain_probability_from_altimeter high_probability_of_no_rain_from_altimeter ambiguous_situation_possibility_of_ice evaluation_not_possibleflag_values :[0 1 2 3 4 5]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from first radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_rain_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer rain flag from second radiometerflag_meanings :no_rain rainflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ice flagflag_meanings :no_ice iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_1_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from first radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_side_2_sea_ice_flag(time)float32dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer sea-ice flag from second radiometerflag_meanings :no_sea_ice sea_iceflag_values :[0 1]comment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n109.09 kiB\n10.96 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\naltitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :1 Hz altitude of satellitestandard_name :height_above_reference_ellipsoidunits :mcomment :Altitude of satellite above the reference ellipsoid. Associated quality flag is orb_state_diode_flag for the OGDR products, orb_state_rest_flag for the IGDR and GDR products\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmodel_dry_tropo_cor_zero_altitude(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :model dry tropospheric correction at zero altitudestandard_name :altimeter_range_correction_due_to_dry_tropospheresource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at Mean Sea Level Pressure at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. A dry tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for dry tropospheric range delays of the radar pulse. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_wet_tropo_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer wet tropospheric correctionstandard_name :altimeter_range_correction_due_to_wet_tropospheresource :AMRinstitution :NASA/JPLunits :mcomment :A wet tropospheric correction must be added (negative value) to the instrument range to correct this range measurement for wet tropospheric range delays of the radar pulse\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_sea_surface_cnescls(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS solution) above reference ellipsoidsource :MSS_CNES_CLS-2015institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nmean_dynamic_topography(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :mean dynamic topography above geoidsource :MDT_CNES_CLS-2018institution :CLS/CNESunits :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndepth_or_elevation(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :ocean depth/land elevationsource :ACE2institution :EAPRS Laboratoryunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninv_bar_cor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :inverted barometer height correctionstandard_name :sea_surface_height_correction_due_to_air_pressure_at_low_frequencysource :European Center for Medium Range Weather Forecastinginstitution :ECMWFunits :mcomment :Computed at the altimeter time-tag from the interpolation of 2 meteorological fields that surround the altimeter time-tag. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ndac(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :dynamic atmospheric correctioninstitution :LEGOS/CLS/CNESunits :mcomment :Sum of the high frequency fluctuations correction and of the low frequency inverted barometer correction (inv_bar_cor). See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nocean_tide_fes(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric ocean tide height (FES solution)standard_name :sea_surface_height_amplitude_due_to_geocentric_ocean_tidesource :FES2014binstitution :LEGOS/NOVELTIS/CNES/CLSunits :mcomment :Includes the equilibrium long-period ocean tide height and only the short-period part of the corresponding loading tide. The permanent tide (zero frequency) is not included in this parameter because it is included in the geoid and mean sea surface (geoid, mean_sea_surface_cnescls). To get the total geocentric tide height (FES solution), do: ocean_tide_fes + ocean_tide_non_eq. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nsolid_earth_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :solid earth tide heightstandard_name :sea_surface_height_amplitude_due_to_earth_tidesource :Cartwright and Edden [1973] Corrected tables of tidal harmonics - J. Geophys. J. R. Astr. Soc., 33, 253-264.units :mcomment :Calculated using Cartwright and Tayler tables and consisting of the second and third degree constituents. The permanent tide (zero frequency) is not included. See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\npole_tide(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :geocentric pole tide heightstandard_name :sea_surface_height_amplitude_due_to_pole_tidesource :Desai, S., Wahr, J. & Beckley, B. J Geod [2015] 89: 1233units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\ninternal_tide_hret(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :internal tide heightsource :E. D. Zaron. Baroclinic tidal sea level from exact-repeat mission altimetry. Journal of Physical Oceanography, 49(1):193-210, 2019.units :mcomment :See SWOT Nadir Altimeter User Handbook\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speedstandard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.06 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nwind_speed_alt_mle3(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :altimeter wind speed (MLE3 retracking)standard_name :wind_speedunits :m/scomment :Should not be used over land. See SWOT Nadir Altimeter User Handbook. A calibration bias of +0.109 dB has been added to the Ku band backscatter coefficient (/data_01/ku/sig0_ocean_mle3) before computing the wind speed\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_water_vapor(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer water vapor contentstandard_name :atmosphere_water_vapor_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nrad_cloud_liquid_water(time)float64dask.array<chunksize=(2806,), meta=np.ndarray>long_name :radiometer liquid water contentstandard_name :atmosphere_cloud_liquid_water_contentsource :AMRinstitution :NASA/JPLunits :kg/m^2comment :Should not be used over land\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n218.18 kiB\n21.92 kiB\n\n\nShape\n(27927,)\n(2806,)\n\n\nDask graph\n10 chunks in 21 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 27927 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(Index([759929456.5671339, 759929457.6690049, 759929458.770874,\n 759929459.872746, 759929460.9746141, 759929462.0764852,\n 759929463.1783538, 759929464.2802248, 759929465.3820939,\n 759929466.4839649,\n ...\n 759960314.5902781, 759960315.6921468, 759960316.7940178,\n 759960317.8958869, 759960318.9977579, 759960320.099627,\n 759960321.201498, 759960322.3033671, 759960323.4052382,\n 759960324.5071082],\n dtype='float64', name='time', length=27927))Attributes: (0)\n\n\n\n\nPlot\n\nplt.figure(figsize=(15, 5))\nax = plt.axes(projection=ccrs.PlateCarree())\nax.set_global()\nax.coastlines()\nplt.scatter(x=ds_nadir.longitude, y=ds_nadir.latitude, c=ds_nadir.depth_or_elevation, marker='.')\nplt.colorbar().set_label('Depth or Elevation (m)')", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Cloud" - ] - }, - { - "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", - "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#swot-level-2-radiometer-datasets", - "title": "Access SWOT L2 Oceanography Data in AWS Cloud", - "section": "3. SWOT Level 2 Radiometer Datasets", - "text": "3. SWOT Level 2 Radiometer Datasets\nOutlined below is a map of the different Radiometer Data Products we host at PO.DAAC, and why you may choose one over the other. For more information, see the SWOT Data User Handbook.\n\nOnce you’ve picked the dataset you want to look at, you can search and visualize this dataset similar to the above datasets.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-discharge-timeseries", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plot-discharge-timeseries", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Plot Discharge Timeseries", + "text": "Plot Discharge Timeseries\nThe main data of interest in the results files is the timeseries of river discharge (q) estimates produced by each module. The SoS is a global dataset organized by continents and not every reach will have an associated discharge for each module. So it is helpful to filter out missing values in order to isolate and visualize discharge for the various modules.\n\nHow to locate data amongst missing values\nYou can use the missing_value NetCDF variable attribute to locate the value used to indicate missing data. You can then filter on that value to isolate the time steps with discharge estimates. The following example uses the HiVDI algorithm results to demonstrate filtering missing values and plotting discharge.\n\n# Retrieve discharge from discharge algorithm group\ndischarge_algo_q = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][:]\n\n# Save the missing value\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\n\n# Loop through each reach and filter out places where the missing value is present\ndata_indexes = []\nfor i in range(discharge_algo_q.shape[0]):\n if discharge_algo_q[i].shape[0] > 1:\n if np.any(discharge_algo_q[i] != missing): data_indexes.append(i) # For multiple time steps with non-missing values\n if discharge_algo_q[i].shape[0] == 1 and discharge_algo_q[i] != missing: data_indexes.append(i) # For one time step with non-missing value\n\n# Display the numeric indexes where discharge data is present\nprint(f\"10 indexes for locations that have values:\\n {data_indexes[:10]}\")\n\n10 indexes for locations that have values:\n [12635, 12636, 12639, 12769, 12773, 12919, 12922, 12925, 12930, 12931]\n\n\n\nreach_identifiers = results['reaches']['reach_id'][data_indexes]\nprint(f\"10 reach identifiers for locations that have values:\\n {reach_identifiers[:10]}\")\n\n10 reach identifiers for locations that have values:\n [23261000571 23261000581 23261000631 23262000011 23262000051 23263000021\n 23263000051 23263000081 23263000131 23263000141]\n\n\nYou can now use the data indexes to retrieve location, time, and river name data about the reaches that have discharge data.\n\n# Review what river names are present in the data\nprint(\"10 River Names\")\nprint(river_names[data_indexes[:10]])\n\nriver_indexes = np.where(river_names == RIVER_NAME)\nprint(f\"\\nIndexes for the {RIVER_NAME}\")\nprint(river_indexes)\n\n# Locate overlap\noverlap_indexes = np.intersect1d(data_indexes, river_indexes)\nprint(f\"\\nOverlapping indexes for the {RIVER_NAME} with {DISCHARGE_ALGORITHM.upper()} Discharge data\")\nprint(overlap_indexes)\n\n10 River Names\n['Rhine' 'Rhine' 'Rhine' 'Rhine' 'Mosel' 'Rhine' 'Lahn; Rhine' 'Rhine'\n 'Lahn' 'Rhine']\n\nIndexes for the Rhine\n(array([12597, 12598, 12599, 12600, 12601, 12602, 12603, 12606, 12616,\n 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625,\n 12626, 12627, 12628, 12629, 12630, 12631, 12634, 12635, 12636,\n 12638, 12639, 12640, 12769, 12918, 12919, 12920, 12923, 12924,\n 12925, 12926, 12931, 12932, 12933, 12938, 12939, 12940, 12941,\n 12942, 12943, 12944, 13098, 13099, 13100, 13101, 13102, 13152,\n 13153, 13154, 13155, 13156, 13157, 13158, 13159, 13160, 13161,\n 13162, 13163, 13164, 13165, 13166, 13168, 13169, 13170, 13172,\n 13173, 13174, 13175, 13176, 13177, 13178, 13179, 13180, 13181,\n 13182, 13183, 13184, 13185, 13186, 13187, 13188, 13189, 13190,\n 13191, 13192, 13193, 13194, 13195, 13196, 13197, 13198, 13199,\n 13200, 13201, 13202, 13204, 13205, 13206, 13207, 13208, 13316,\n 13317, 13319, 13324, 13325, 13326, 13327, 13328, 13329, 13330,\n 13331, 13332, 13333, 13334, 13335, 13336, 13337, 13339, 13340,\n 13341, 13342, 13343, 13345, 13346, 13362, 13363, 13364, 13365,\n 13366, 13367, 13368, 13369, 13370, 13371, 13372, 13373, 13374,\n 13375, 13385]),)\n\nOverlapping indexes for the Rhine with HIVDI Discharge data\n[12635 12636 12639 12769 12919 12925 12931 12932 12933 12938 12939 12940\n 12941 12942 12943 13098 13099 13100 13101 13102 13152 13153 13154 13155\n 13156 13157 13158 13159 13161 13162 13163 13164 13165 13168 13169 13174\n 13178 13180 13181 13189 13190 13191 13193 13195 13197 13207]\n\n\n\n# Select the first reach from the overlapping indexes\ndata_index = overlap_indexes[0]\n\n# Locate the reach identifier\nreach_id = reaches['reach_id'][data_index]\nprint(f\"{RIVER_NAME} reach identifier to plot: {reach_id}\")\n\n# Retrieve discharge\ndischarge_algo_q = discharge_algo_q[data_index]\nprint(f\"\\nDischarge for {RIVER_NAME} reach identifier # {reach_id}\")\nprint(discharge_algo_q)\n\n# Retrieve time\ntime = results['reaches']['time'][data_index]\nprint(f\"\\nTime for {RIVER_NAME} reach identifier # {reach_id}\")\nprint(results['reaches']['time'][data_index])\n\nRhine reach identifier to plot: 23261000571\n\nDischarge for Rhine reach identifier # 23261000571\n[-1.00000000e+12 -1.00000000e+12 -1.00000000e+12 -1.00000000e+12\n -1.00000000e+12 -1.00000000e+12 -1.00000000e+12 -1.00000000e+12\n -1.00000000e+12 5.40782194e+01 4.99487494e+01 3.42913882e+01\n 3.44913537e+01]\n\nTime for Rhine reach identifier # 23261000571\n[7.34223036e+08 7.34308874e+08 7.34394712e+08 7.34909740e+08\n 7.34995578e+08 7.35081416e+08 7.35167254e+08 7.35253092e+08\n 7.35338929e+08 7.35510605e+08 7.35596443e+08 7.35682281e+08\n 7.35768119e+08]\n\n\n\n# Transform time to correct format\nswot_ts = datetime.datetime(2000,1,1,0,0,0)\nmissing_time = results['reaches']['time'].missing_value\ntime_str = []\nfor t in time:\n if t == missing_time: \n time_str.append('NO_DATA')\n else:\n time_str.append((swot_ts + datetime.timedelta(seconds=t)).strftime('%Y-%m-%dT%H:%M:%S'))\ntime_str = np.array(time_str)\nprint(f\"Formatted time: {time_str}\")\n\nFormatted time: ['2023-04-07T22:50:35' '2023-04-08T22:41:13' '2023-04-09T22:31:52'\n '2023-04-15T21:35:40' '2023-04-16T21:26:18' '2023-04-17T21:16:56'\n '2023-04-18T21:07:33' '2023-04-19T20:58:11' '2023-04-20T20:48:49'\n '2023-04-22T20:30:05' '2023-04-23T20:20:43' '2023-04-24T20:11:21'\n '2023-04-25T20:01:58']\n\n\n\n# Filter any missing values out of reach identifier discharge and time\nmissing_reach_index = np.where(discharge_algo_q != missing)\n\ndischarge_algo_q = discharge_algo_q[missing_reach_index]\nprint(f\"Discharge for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(discharge_algo_q)\n\ntime_str = time_str[missing_reach_index]\nprint(f\"\\nTime for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(time_str)\n\nDischarge for Rhine reach identfier # 23261000571\n[54.07821944 49.94874936 34.29138816 34.49135369]\n\nTime for Rhine reach identfier # 23261000571\n['2023-04-22T20:30:05' '2023-04-23T20:20:43' '2023-04-24T20:11:21'\n '2023-04-25T20:01:58']\n\n\n\n# Plot Discharge for the River Reach Identifier\n\n# Set up plot\nfig = plt.figure(figsize=(10,5))\nax1 = plt.subplot(311)\n\n# Plot data\nax1.scatter(time_str, discharge_algo_q)\nax1.plot(time_str, discharge_algo_q)\n\n# Define labels and title\nax1.set_ylabel('Discharge')\nax1.set_xlabel('Time')\nplt.xticks(rotation = 45)\n\nplt.suptitle(f\"Discharge Timeseries from HIVDI for the Ohio River reach identifier: {reach_id}.\")\n\nText(0.5, 0.98, 'Discharge Timeseries from HIVDI for the Ohio River reach identifier: 23261000571.')", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Cloud" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#a-final-word", - "href": "notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html#a-final-word", - "title": "Access SWOT L2 Oceanography Data in AWS Cloud", - "section": "A final word…", - "text": "A final word…\nAccessing data completely from S3 and in memory are affected by various things.\n\nThe format of the data - archive formats like NetCDF, GEOTIFF, HDF vs cloud optimized data structures (Zarr, kerchunk, COG). Cloud formats are made for accessing only the pieces of data of interest needed at the time of the request (e.g. a subset, timestep, etc).\nTools like xarray make a lot of assumptions about how to open and read a file. Sometimes the internals don’t fit the xarray ‘mould’ and we need to continue to work with data providers and software providers to make these two sides work together. Level 2 data (non-gridded), specifically, suffers from some of the assumptions made.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plotting-integrator-results-for-comparison", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html#plotting-integrator-results-for-comparison", + "title": "Exploring river discharge in the SWORD of Science (SoS) dataset", + "section": "Plotting integrator results for comparison", + "text": "Plotting integrator results for comparison\nThe SoS contains reach-level Flow Law Parameter (FLPE) algorithms: HiVDI, neoBAM, MetroMan, MOMMA, SAD, SIC4DVar that produce discharge estimates using SWOT observations, SoS Priors and SWORD data. It can be helpful to compare the reach-level FLPEs to the discharge values produced by the Mean Optimization Integrator (MOI). The MOI takes SWOT observation data and reach-level FLPE output and integrates the results. It uses river topology to force mass conservation and also defined uncertainty.\n\n# Locate MOI discharge results for discharge algorithm making sure to filter out missing values\nmoi_q = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"][data_index]\nmoi_q = moi_q[missing_reach_index]\n\nprint(f\"{DISCHARGE_ALGORITHM.upper()} MOI Discharge for {RIVER_NAME} reach identfier # {reach_id}\")\nprint(moi_q)\n\nHIVDI MOI Discharge for Rhine reach identfier # 23261000571\n[0.0009796 0.00062748 0.00012596 0.00014881]\n\n\n\n# Plot discharge algorithm alongside MOI discharge\n\n# Discharge algorithm Q\nplt.scatter(time_str, discharge_algo_q)\nplt.plot(time_str, discharge_algo_q, label=f\"{DISCHARGE_ALGORITHM.upper()}\")\n\n# MOI Q\nplt.scatter(time_str, moi_q)\nplt.plot(time_str, moi_q, label=\"MOI\")\n\nplt.suptitle(f\"Discharge Timeseries from HIVDI for the {RIVER_NAME} reach identifier: {reach_id}.\")\nplt.legend()\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nClose dataset and file handler references\n\npriors.close()\nresults.close()\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Access & Visualization", - "SWOT Oceanography", - "Cloud" + "SWORD of Science (SoS) Discharge", + "Exploring river discharge" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#local-machine-download-version", - "href": "notebooks/datasets/OPERA_GIS_Notebook.html#local-machine-download-version", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#local-machine-download-version", + "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#local-machine-download-version", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", "section": "Local Machine Download Version", "text": "Local Machine Download Version\n\nAuthor: Nicholas Tarpinian, PO.DAAC", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "SWOT", + "Access & Visualization", + "Raster Multifile", "Local" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#summary-learning-objectives", - "href": "notebooks/datasets/OPERA_GIS_Notebook.html#summary-learning-objectives", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#summary-learning-objectives", + "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#summary-learning-objectives", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", "section": "Summary & Learning Objectives", - "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with OPERA DSWx data on a local machine\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on users choice; either by classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’), etc.\nVisualizing the dataset based on its classified layer values.\nMosaicking multiple layers into a single GeoTIFF file.\nUtilizing Change Detection for further analysis.", + "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with multiple files from the SWOT Raster Image data product version 2.0 on a local machine\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on user’s choice; choosing between two resolutions either by ‘100m’ or ‘250m’.\nVisualizing multiple raster images on a single map.\nStacking multiple raster images and creating a time dimension to analyze over time.\nAdjusting images based on quality flag", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "SWOT", + "Access & Visualization", + "Raster Multifile", "Local" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#requirements", - "href": "notebooks/datasets/OPERA_GIS_Notebook.html#requirements", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#requirements", + "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#requirements", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\n#from original notebook:\nimport requests\nimport json\nimport rasterio as rio\nfrom rasterio.plot import show\nfrom rasterio.merge import merge\nimport matplotlib.pyplot as plt\nfrom matplotlib.patches import Patch\nfrom mpl_toolkits.axes_grid1.inset_locator import inset_axes\nfrom mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes \nfrom mpl_toolkits.axes_grid1.inset_locator import mark_inset\nimport numpy as np\nfrom pathlib import Path\nimport os\nfrom urllib.request import urlretrieve\nfrom json import dumps\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", + "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport os\nfrom os.path import isfile, basename, abspath\nimport xarray as xr\nimport numpy as np\nfrom datetime import datetime\nfrom pathlib import Path\nimport hvplot\nimport hvplot.xarray \nimport earthaccess", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "SWOT", + "Access & Visualization", + "Raster Multifile", "Local" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Notebook.html#authentication-with-earthaccess", - "href": "notebooks/datasets/OPERA_GIS_Notebook.html#authentication-with-earthaccess", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#authentication-with-earthaccess", + "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#authentication-with-earthaccess", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 11/19/2023\nUsing user provided credentials for EDL\nPersisting credentials to .netrc\n\n\n\nSearch using earthaccess for OPERA DSWx\nEach dataset has it’s own unique collection concept ID. For the OPERA_L3_DSWX-HLS_V1 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Powell Reservoir.\nWe used bbox finder to get the exact coordinates for our area of interest.\nWe want to look at two different times for comparison: 04/11/2023 and 08/30/2023. To find these dates, let’s search for all the data granules between the two.\nFinding 08/30/23 you must search a couple days after at 09/01/23 for when the product was generated for 08/30/23.\n\n#search for the granules using the short name\nresults = earthaccess.search_data(short_name=\"OPERA_L3_DSWX-HLS_V1\", temporal= (\"2023-04-11\",\"2023-09-01\"), bounding_box = ('-111.144811','36.980121','-110.250799','37.915625'))\n\nGranules found: 310\n\n\n\n\nGet desired links\nOPERA has 10 different available layers within each granule. Each granule consists of 10 files, one for each layer. We will only need one of these files since we are only looking at one layer.\nLet’s get the download links for the desired files. We want to query the dataset based on a specific classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’) as well as for the two dates (04/11/2023 and 08/30/2023).\nWe will look at ‘B01_WTR’ which is the Water Classification (WTR) layer of the OPERA DSWx dataset. Details on each available layer and the data product can be found here.\n\ntype(results[0])\n\nearthaccess.results.DataGranule\n\n\nHere, we see that the results output is in the DataGranule format, allowing us to to use the data_links call\n\n#add the necessary data to a list, here we are looking for B01_WTR layer and two dates specified earlier\ndownloads_04112023 = []\ndownloads_08302023 = []\n\nfor g in results:\n for l in earthaccess.results.DataGranule.data_links(g):\n if 'B01_WTR' in l:\n if '20230411' in l:\n downloads_04112023.append(l)\n if '20230830' in l:\n downloads_08302023.append(l)\n\nprint(len(downloads_04112023))\nprint(len(downloads_08302023))\n\n4\n4\n\n\nFor the B01_WTR layer, each date has 4 files\n\n\nDownload the Data into a folder\nSince we are looking at two seperate times, we create two folder path names, one for each date, so we can mosaic all the files within one folder based on its respective time range later.\n\n#download data into folder on local machine\nearthaccess.download(downloads_04112023, \"./data_downloads/OPERA_041123\")\nearthaccess.download(downloads_08302023, \"./data_downloads/OPERA_083023\")\n\nData should download into two folders seperated by date, each having four files.\n\n\nVisualizing the Dataset\nLet’s now visualize an individual layer for a single file that was downloaded using Rasterio to read the GeoTIFF image.\n\ndsw = rio.open('data_downloads/OPERA_041123/OPERA_L3_DSWx-HLS_T12SVG_20230411T180222Z_20230414T030945Z_L8_30_v1.0_B01_WTR.tif')\n\nOPERA is a single band image with specific classified rgb values.\nThis requires to read the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage = dsw.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw2 = color_array[image]\n\n\nfig, ax = plt.subplots(figsize=(15,10))\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nax.legend(handles=patches,\n bbox_to_anchor=(1.28, 1),\n facecolor=\"gainsboro\")\n\nplt.imshow(dsw2)\nplt.show()\n\n\n\n\n\n\n\n\n\n\nMosaic Multiple OPERA Layers\nWhen creating a mosaic, make sure the temporal range is correct/matching. We define the output directory for the mosaic GeoTIFFs below.\nThe mosaic is being created because we have 4 results from the bounding box area provided. If you receive more than 1 result and would like to see a single raster image of all the results, mosaicking is the solution.\n\nPath('data_downloads/mosaic_outputs').mkdir(parents=True, exist_ok=True)\noutput_path = 'data_downloads/mosaic_outputs'\n\nWe define a function to convert files per timestamp to mosaicked geoTIFFs.\n\ndef raster2mosaic(data_folder, output_path, output_file_name):\n raster_files = list(data_folder.iterdir())\n raster_to_mosaic_list = [] #create empty list\n for p in raster_files:\n raster = rio.open(p)\n raster_to_mosaic_list.append(raster)\n mosaic, output = merge(raster_to_mosaic_list) #the merge function will mosaic the raster images\n #Then we update the raster's metadata to match the width and height of the mosaic\n output_meta = raster.meta.copy()\n output_meta.update(\n {\"driver\": \"GTiff\",\n \"height\": mosaic.shape[1],\n \"width\": mosaic.shape[2],\n \"transform\": output\n }\n )\n #Save the output in a new mosaicked raster image\n with rio.open(os.path.join(output_path, output_file_name), 'w', **output_meta) as m:\n m.write(mosaic)\n\n\n#set data to a list for each of the two data sets\nfolder1 = Path(\"data_downloads/OPERA_041123\")\nfolder2 = Path(\"data_downloads/OPERA_083023\")\n\nraster2mosaic(folder1, output_path, 'mosaic_041123.tif')\nraster2mosaic(folder2, output_path, 'mosaic_083023.tif')\n\n\n\nVisualizing the Mosaic\nOpen the new mosaicked raster images individually with its respective paths.\n\nmos1 = rio.open(os.path.join(output_path, 'mosaic_041123.tif'))\nmos2 = rio.open(os.path.join(output_path, 'mosaic_083023.tif')) \n\nTo visualize the mosaic, you must utilize the single layer colormap.\nThis will be the ‘dsw’ variable used earlier to visualize a single layer. Similarly reading the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage1 = mos1.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw3 = color_array[image1]\n\n\nimage2 = mos2.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw4 = color_array[image2]\n\n\nfig = plt.figure(figsize=(20, 15))\n\nrows = 1\ncolumns = 2\n\n# Lake Powell 04/11/2023\nfig.add_subplot(rows, columns, 1)\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\nplt.imshow(dsw3)\n\n# Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\n# Lake Powell 08/30/2023\nfig.add_subplot(rows, columns, 2)\nplt.title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\nplt.imshow(dsw4)\n\n# Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nTo take a closer look at a specific area of the image, we can create an inset map of a specified area.\n\nfig, ax = plt.subplots(1, 2, figsize=(20, 15))\n\nax[0].imshow(dsw3)\nax[0].set_title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\nax_ins1 = ax[0].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins1.imshow(dsw3)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins1.set_xlim(x1, x2)\nax_ins1.set_ylim(y1, y2)\nax_ins1.set_xticklabels('')\nax_ins1.set_yticklabels('')\n\nax[0].indicate_inset_zoom(ax_ins1, edgecolor='black')\n\nax[1].imshow(dsw4)\nax[1].set_title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nax_ins2 = ax[1].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins2.imshow(dsw4)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins2.set_xlim(x1, x2)\nax_ins2.set_ylim(y1, y2)\nax_ins2.set_xticklabels('')\nax_ins2.set_yticklabels('')\n\nax[1].indicate_inset_zoom(ax_ins2, edgecolor='black')\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nChange Detection\nFurther analysis can involve change detection between the two images, if any gains or losses occurred.\nLooking at the difference by subtracting the latest date to the oldest date.\n\ndifference = np.abs(image2 - image1)\n\nUtilizing numpy where; by setting the given condition and returning the satisfied conditions. e.g. numpy.where(condition, [x, y, ])\nIn this case, any non-zero values indicate the areas of change between the two images.\nValues closest to 1 shows the greatest gains in change and values closest to zero show the least amount of change.\n\nchange_map = np.where(difference > 0, 1, 0)\n\n\nfig, ax = plt.subplots(figsize=(15,10))\n\n# Defining and zooming into an ROI\nx1, y1, x2, y2 = 1000, 1000, 4500, 4500\nroi = change_map[y1:y2, x1:x2]\n\n# Inversing the colormap\noriginal_cmap = plt.get_cmap('magma')\nreversed_cmap = original_cmap.reversed()\n\nplt.imshow(roi, cmap=reversed_cmap)\nplt.colorbar()\nplt.title('Change Detection between 4/11/23 and 8/30/23')\n\nplt.show()", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch for SWOT Raster products using earthaccess\nEach dataset has it’s own unique collection concept ID. For the SWOT_L2_HR_Raster_2.0 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Mead Reservoir in the United States.\nWe used bbox finder to get the exact coordinates for our area of interest.\n\nresults = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-115.112686,35.740939,-114.224167,36.937819),\n temporal =('2024-02-01 12:00:00', '2024-02-01 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 2\n\n\n\nearthaccess.download(results, \"data_downloads/SWOT_Raster_LakeMead/\")\n\n Getting 2 granules, approx download size: 0.07 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_045F_20240201T183814_20240201T183835_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_046F_20240201T183834_20240201T183855_PIC0_01.nc\n\n\n['data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_045F_20240201T183814_20240201T183835_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_046F_20240201T183834_20240201T183855_PIC0_01.nc']\n\n\n\n\nVisualizing Multiple Tiles\nLet’s now visualize multiple raster tiles in a folder and explore the data.\nUtilizing xarray.open_mfdataset which supports the opening of multiple files.\n\nfolder_path = \"data_downloads/SWOT_Raster_LakeMead/\"\n\nfile_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith('.nc')]\n\n\nds = xr.open_mfdataset(file_paths, combine='nested', concat_dim='x')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (y: 2784, x: 3074)\nCoordinates:\n * y (y) float64 3.899e+06 3.899e+06 ... 4.177e+06\n * x (x) float64 5.682e+05 5.683e+05 ... 6.928e+05\nData variables: (12/39)\n crs (x) object b'1' b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(512, 512), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(512, 512), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(2784, 1536), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(768, 768), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T08:50:33Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 568200.0\n x_max: 721700.0\n y_min: 3898600.0\n y_max: 4052100.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:y: 2784x: 3074Coordinates: (2)y(y)float643.899e+06 3.899e+06 ... 4.177e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3898600., 3898700., 3898800., ..., 4176700., 4176800., 4176900.])x(x)float645.682e+05 5.683e+05 ... 6.928e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([568200., 568300., 568400., ..., 692600., 692700., 692800.])Data variables: (39)crs(x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1', ..., b'1', b'1', b'1'], dtype=object)longitude(y, x)float64dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nIndexes: (2)yPandasIndexPandasIndex(Float64Index([3898600.0, 3898700.0, 3898800.0, 3898900.0, 3899000.0, 3899100.0,\n 3899200.0, 3899300.0, 3899400.0, 3899500.0,\n ...\n 4176000.0, 4176100.0, 4176200.0, 4176300.0, 4176400.0, 4176500.0,\n 4176600.0, 4176700.0, 4176800.0, 4176900.0],\n dtype='float64', name='y', length=2784))xPandasIndexPandasIndex(Float64Index([568200.0, 568300.0, 568400.0, 568500.0, 568600.0, 568700.0,\n 568800.0, 568900.0, 569000.0, 569100.0,\n ...\n 691900.0, 692000.0, 692100.0, 692200.0, 692300.0, 692400.0,\n 692500.0, 692600.0, 692700.0, 692800.0],\n dtype='float64', name='x', length=3074))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T08:50:33Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :218scene_number :46tile_numbers :[90 91 92 93 90 91 92 93]tile_names :218_090L, 218_091L, 218_092L, 218_093L, 218_090R, 218_091R, 218_092R, 218_093Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T18:38:34.265833Ztime_granule_end :2024-02-01T18:38:55.360807Ztime_coverage_start :2024-02-01T18:38:34.807712Ztime_coverage_end :2024-02-01T18:38:54.816495Zgeospatial_lon_min :-116.24045666354958geospatial_lon_max :-114.55674281329392geospatial_lat_min :35.225727504637376geospatial_lat_max :36.5951883116925left_first_longitude :-114.84459394683485left_first_latitude :36.5951883116925left_last_longitude :-114.55674281329392left_last_latitude :35.46460890403489right_first_longitude :-116.24045666354958right_first_latitude :36.350992807631336right_last_longitude :-115.93433361296329right_last_latitude :35.225727504637376xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_092L_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_093L_20240201T183854_20240201T183905_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091R_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_092R_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_093R_20240201T183854_20240201T183905_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_092L_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_093L_20240201T183854_20240201T183905_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091R_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_092R_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_093R_20240201T183854_20240201T183905_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :568200.0x_max :721700.0y_min :3898600.0y_max :4052100.0institution :CNESproduct_version :01\n\n\n\nraster_plot = ds.wse.hvplot.quadmesh(x='x', y='y', rasterize=True, title=f'SWOT Raster 100m: Lake Mead Reservoir')\nraster_plot.opts(width=700, height=600, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nCreating a Time Series\nSWOT Raster product does not include a time dimension, each file is a snapshot in time, but it can be inserted by extracting from the file name.\n\nExpand the time range of your earthaccess search to get an adequate range.\nExtract the datetime from the s3 file name then concatenate based on the new time dimension.\nSave the output as a new NetCDF file.\n\n\ntime_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-114.502048,36.060175,-114.390983,36.210182),\n temporal =('2024-01-25 00:00:00', '2024-03-04 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 3\n\n\n\nearthaccess.download(time_results, \"data_downloads/SWOT_Raster_LakeMead_Time/\")\n\n Getting 3 granules, approx download size: 0.12 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc\n\n\n['data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc']\n\n\n\nfolder_path = \"data_downloads/SWOT_Raster_LakeMead_Time/\"\nfile_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith('.nc')]\n\n\ndef add_time_dimension(ds):\n # Extract date/time string from filename\n file_date = os.path.basename(ds.encoding['source']).split(\"_\")[-4][:15]\n # Convert the date string to a datetime object\n time_value = datetime.strptime(file_date, \"%Y%m%dT%H%M%S\")\n # Assign the time coordinate to the dataset\n ds.coords['time'] = time_value\n return ds\n\n\ndatasets = []\nfile_names = []\n\nfor file_path in file_paths:\n dataset = xr.open_dataset(file_path)\n datasets.append(add_time_dimension(dataset))\n file_names.append(os.path.basename(file_path))\n dataset.close()\n\n\n# sorting the time dimension in correct order\ndatasets.sort(key=lambda ds: ds.time.values)\n\n\nds2 = xr.concat(datasets, dim='time')\nds2\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1549, y: 1549, time: 3)\nCoordinates:\n * x (x) float64 6.788e+05 6.789e+05 ... 8.336e+05\n * y (y) float64 3.9e+06 3.901e+06 ... 4.055e+06\n * time (time) datetime64[ns] 2024-02-01T07:50:48 ... 20...\nData variables: (12/39)\n crs (time) object b'1' b'1' b'1'\n longitude (time, y, x) float64 nan nan nan ... nan nan nan\n latitude (time, y, x) float64 nan nan nan ... nan nan nan\n wse (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual_bitwise (time, y, x) float64 nan nan nan ... nan nan nan\n ... ...\n load_tide_fes (time, y, x) float32 nan nan nan ... nan nan nan\n load_tide_got (time, y, x) float32 nan nan nan ... nan nan nan\n pole_tide (time, y, x) float32 nan nan nan ... nan nan nan\n model_dry_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n model_wet_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n iono_cor_gim_ka (time, y, x) float32 nan nan nan ... nan nan nan\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T12:55:01Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 680100.0\n x_max: 829300.0\n y_min: 3903300.0\n y_max: 4052400.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1549y: 1549time: 3Coordinates: (3)x(x)float646.788e+05 6.789e+05 ... 8.336e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([678800., 678900., 679000., ..., 833400., 833500., 833600.])y(y)float643.9e+06 3.901e+06 ... 4.055e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3900500., 3900600., 3900700., ..., 4055100., 4055200., 4055300.])time(time)datetime64[ns]2024-02-01T07:50:48 ... 2024-02-...array(['2024-02-01T07:50:48.000000000', '2024-02-11T17:00:50.000000000',\n '2024-02-22T04:35:54.000000000'], dtype='datetime64[ns]')Data variables: (39)crs(time)objectb'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1'], dtype=object)longitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])latitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])wse(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])wse_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])water_area_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])sig0_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)inc(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)cross_track(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)illumination_time(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')illumination_time_tai(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')n_wse_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_water_area_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_sig0_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_other_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])dark_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_clim_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_dyn_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)layover_impact(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_cor_atmos_model(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)height_cor_xover(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)geoid(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)solid_earth_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_fes(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_got(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)pole_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_dry_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_wet_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)iono_cor_gim_ka(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)Indexes: (3)xPandasIndexPandasIndex(Float64Index([678800.0, 678900.0, 679000.0, 679100.0, 679200.0, 679300.0,\n 679400.0, 679500.0, 679600.0, 679700.0,\n ...\n 832700.0, 832800.0, 832900.0, 833000.0, 833100.0, 833200.0,\n 833300.0, 833400.0, 833500.0, 833600.0],\n dtype='float64', name='x', length=1549))yPandasIndexPandasIndex(Float64Index([3900500.0, 3900600.0, 3900700.0, 3900800.0, 3900900.0, 3901000.0,\n 3901100.0, 3901200.0, 3901300.0, 3901400.0,\n ...\n 4054400.0, 4054500.0, 4054600.0, 4054700.0, 4054800.0, 4054900.0,\n 4055000.0, 4055100.0, 4055200.0, 4055300.0],\n dtype='float64', name='y', length=1549))timePandasIndexPandasIndex(DatetimeIndex(['2024-02-01 07:50:48', '2024-02-11 17:00:50',\n '2024-02-22 04:35:54'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T12:55:01Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :205scene_number :109tile_numbers :[216 217 218 219 216 217 218 219]tile_names :205_216L, 205_217L, 205_218L, 205_219L, 205_216R, 205_217R, 205_218R, 205_219Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T07:50:48.872250Ztime_granule_end :2024-02-01T07:51:09.965949Ztime_coverage_start :2024-02-01T07:50:49.410994Ztime_coverage_end :2024-02-01T07:51:09.428854Zgeospatial_lon_min :-115.01465895670609geospatial_lon_max :-113.33094509647773geospatial_lat_min :35.225727504637376geospatial_lat_max :36.595188311791034left_first_longitude :-115.01465895670609left_first_latitude :35.46460890403489left_last_longitude :-114.72680781313967left_last_latitude :36.595188311791034right_first_longitude :-113.63706815703668right_first_latitude :35.225727504637376right_last_longitude :-113.33094509647773right_last_latitude :36.350992807533125xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :680100.0x_max :829300.0y_min :3903300.0y_max :4052400.0institution :CNESproduct_version :01\n\n\n\ntimeplot = ds2.wse.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nLet’s plot the wse quality flag, wse_qual which ranges 0-3 where 0=good, 1=suspect, 2=degraded, 3=bad (as described when printing variable with xarray).\n\ntimeplot = ds2.wse_qual.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nMasking a variable with its quaility flag\n\nvariable_to_mask = ds2['wse']\nmask_variable = ds2['wse_qual']\n\n\n# Define the condition for masking based on the range of the quaility flag\nmask_condition = mask_variable < 2\n\nmasked_variable = variable_to_mask.where(mask_condition)\n\n\n# Update the masked variable in the dataset\nds2['wse'] = masked_variable\n\nds2['wse'].hvplot.image(y='y', x='x').opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nOur end product is a time series of the data showing only the values where the quality flag is either good (0) or suspect (1).\n\n\nWe can also save the time series with quality flags implemented to a new netcdf file.\n\noutput_folder = 'data_downloads/SWOT_Raster_Time/'\nos.makedirs(output_folder, exist_ok=True)\n\n\noutput_netcdf_path = os.path.join(output_folder, \"Output_Time.nc\")\nds2.to_netcdf(output_netcdf_path)\n\nprint(f\"Output complete: {output_netcdf_path}\")\n\nOutput complete: data_downloads/SWOT_Raster_Time/Output_Time.nc\n\n\n\n\nAppendix: Alternate Plot\n\n# # Alternate plotting with matplotlib\n# %matplotlib inline\n\n# import matplotlib.pyplot as plt\n# from matplotlib import animation\n# from matplotlib.animation import FuncAnimation, PillowWriter\n# from IPython.display import display, Image, HTML\n\n# variable_name = 'wse'\n# data = ds2[variable_name]\n\n# fig, ax = plt.subplots(figsize=(10, 8))\n# fig.set_tight_layout({'rect': [0.01, 0.01, 1.0, 1.0]})\n\n# contour = ax.contourf(data.isel(time=0), cmap='viridis')\n# cbar = plt.colorbar(contour)\n# cbar.set_label('Water Surface Elevation (meters)', fontsize=14) \n# times = ds2.time.values\n\n# # Function to update the plot for each time step\n# def update(frame):\n# ax.clear()\n# contour = ax.contourf(data.isel(time=frame), cmap='viridis',)\n# formatted_time = str(times[frame])[:-7]\n# ax.set_title(f'Date: {formatted_time}')\n# ax.set_xlabel('Longitude', fontsize=14)\n# ax.set_ylabel('Latitude', fontsize=14)\n# ax.text(0.5, 1.05, 'SWOT Raster 100M Lake Mead Reservoir', transform=ax.transAxes, ha='center', fontsize=14)\n# return contour,\n\n# # Creating a gif animation\n# ani = animation.FuncAnimation(fig, update, repeat=True, frames=len(data['time']), blit=True, interval=3000)\n\n# output = ('./time_series.gif')\n# ani.save(output, writer='pillow', fps=.5)\n\n# with open(output,'rb') as f:\n# display(Image(data=f.read(), format='gif'))\n\n# plt.close(fig)\n# ds2.close()", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "SWOT", + "Access & Visualization", + "Raster Multifile", "Local" ] }, { - "objectID": "notebooks/datasets/SWOT_quality_flag_demo.html#use-earthaccess-to-search-swot-data", - "href": "notebooks/datasets/SWOT_quality_flag_demo.html#use-earthaccess-to-search-swot-data", - "title": "SWOT Quality Flag Demonstration", - "section": "Use earthaccess to search SWOT data", - "text": "Use earthaccess to search SWOT data\nHere we use the SSH shortname, SWOT_L2_LR_SSH_Expert_2.0\n\nssh_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_Expert_2.0', \n temporal = (\"2024-03-22 00:00:00\", \"2024-03-22 23:59:59\"))#,\n #granule_name = '*_Expert_012_455*') #if you know what cycle and pass you want, you can be more specific\n\nGranules found: 29\n\n\n\nIf accessing via Local Machine\n\n# If you are on a local machine, download the first file to your local computer\nearthaccess.download(ssh_results[0], \"./data_downloads/SWOT_files\")\n\n Getting 1 granules, approx download size: 0.03 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_files\\\\SWOT_L2_LR_SSH_Expert_012_428_20240321T235733_20240322T004901_PIC0_01.nc']\n\n\n\n# Open via xarray\nds = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert*.nc\")#, mask_and_scale=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (num_lines: 9866, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) datetime64[ns] dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) datetime64[ns] dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-03-24T22:39:40Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 67.62656103685167\n ssha_variance: 0.7787372594877449\n references: V1.2.1\n equator_longitude: 52.58xarray.DatasetDimensions:num_lines: 9866num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nData variables: (98)time(num_lines)datetime64[ns]dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\ntime_tai(num_lines)datetime64[ns]dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timetai_utc_difference :37.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n157.86 kB\n157.86 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nobject\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nswh_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\norbit_alt_rate(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.46 kB\n39.46 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.46 kB\n39.46 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nload_tide_got(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\npole_tide(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndac(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrain_rate(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nice_conc(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-03-24T22:39:40Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :12pass_number :428equator_time :2024-03-22T00:23:15.167000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-03-21T23:57:33.259925time_coverage_end :2024-03-22T00:49:01.265518geospatial_lon_min :328.86312899999996geospatial_lon_max :136.307662geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :328.86312899999996left_first_latitude :78.27200599999999left_last_longitude :136.288291left_last_latitude :-77.05370099999999right_first_longitude :328.880955right_first_latitude :77.053837right_last_longitude :136.307662right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_012_428_20240321T235729_20240322T004904_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP012_427_20240321_230606_20240321_235733.nc, SWOT_IPN_2PfP012_428_20240321_235733_20240322_004900.nc, SWOT_IPN_2PfP012_429_20240322_004900_20240322_014027.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP012_427_20240321_230603_20240321_235737_PIC0_01.nc, SWOT_IPRAD_2PaP012_428_20240321_235729_20240322_004904_PIC0_01.nc, SWOT_IPRAD_2PaP012_429_20240322_004856_20240322_014031_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240321T235723_20240322T235815_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240323_105038_20240321_225923_20240323_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_PMA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_PMA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_WEA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_WEA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_UWA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_VWA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_UWA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_UWA_AXVCNE20240322_163941_20240322_060000_20240322_060000, SMM_VWA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240322_054027_20240321_180000_20240321_180000, SMM_PSA_AXVCNE20240322_054027_20240322_000000_20240322_000000, SMM_PSA_AXVCNE20240322_174027_20240322_060000_20240322_060000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_T2M_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_T2M_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_CWV_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_CWV_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_CLW_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_CLW_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_SWH_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_SWH_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_gim_files :JPLQ0810.24I, JPLQ0820.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240324_020000_19900101_000000_20240920_000000xref_dac_files :SMM_MOG_AXPCNE20240322_074502_20240321_180000_20240321_180000, SMM_MOG_AXPCNE20240322_074502_20240322_000000_20240322_000000, SMM_MOG_AXPCNE20240322_203000_20240322_060000_20240322_060000xref_precipitation_files :SMM_LSR_AXFCNE20240321_185544_20240321_180000_20240321_180000.grb, SMM_CRR_AXFCNE20240321_185544_20240321_180000_20240321_180000.grb, SMM_CRR_AXFCNE20240322_065522_20240322_000000_20240322_000000.grb, SMM_LSR_AXFCNE20240322_065522_20240322_000000_20240322_000000.grb, SMM_CRR_AXFCNE20240322_065522_20240322_060000_20240322_060000.grb, SMM_LSR_AXFCNE20240322_065522_20240322_060000_20240322_060000.grbxref_sea_ice_mask_files :SMM_ICN_AXFCNE20240322_095633_20240321_000000_20240321_235959.nc, SMM_ICS_AXFCNE20240322_095633_20240321_000000_20240321_235959.nc, SMM_ICN_AXFCNE20240323_041507_20240322_000000_20240322_235959.nc, SMM_ICS_AXFCNE20240323_042002_20240322_000000_20240322_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240322_072016_20240321_030000_20240322_000000.grb, SMM_WMA_AXPCNE20240323_072017_20240322_030000_20240323_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :67.62656103685167ssha_variance :0.7787372594877449references :V1.2.1equator_longitude :52.58\n\n\n\n\nIf accessing via AWS Cloud\n\n#If you are on the cloud, skip the download step above and access the file via xarray directly\nds = xr.open_mfdataset(earthaccess.open([ssh_results[0]]))#, mask_and_scale=False)\nds\n\n\n\nList all L2 LR SSH quality flag variables in a new python dictionary:\n\nquality_variables = {}\n\nfor name, variable in ds.variables.items():\n if name.endswith(\"qual\"):\n quality_variables[name] = None\n\nsorted(list(quality_variables))\n\n['height_cor_xover_qual',\n 'orbit_qual',\n 'sig0_karin_2_qual',\n 'sig0_karin_qual',\n 'ssh_karin_2_qual',\n 'ssh_karin_qual',\n 'ssha_karin_2_qual',\n 'ssha_karin_qual',\n 'swh_karin_qual',\n 'wind_speed_karin_2_qual',\n 'wind_speed_karin_qual']\n\n\nDepending on the data product, the quality flag may not end with qual, you may need to alter the above code for your particular dataset. See the summary chart in the introduction.\n\nFor this example, we will use the ssha_karin_2 variable from the L2_LR_SSH dataset.\n\nvariable_name = \"ssha_karin_2\"\n\nquality_variable_name = f\"{variable_name}_qual\"\n\nprint(variable_name, quality_variable_name)\n\nssha_karin_2 ssha_karin_2_qual\n\n\nSelect the ssha_karin_2_qual variable and print its header information:\n\nqual = ds.variables[quality_variable_name].copy() \n\nprint(qual)\n\n<xarray.Variable (num_lines: 9866, num_pixels: 69)>\ndask.array<copy, shape=(9866, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nAttributes:\n long_name: sea surface height anomaly quality flag\n standard_name: status_flag\n flag_meanings: suspect_large_ssh_delta suspect_large_ssh_std suspect_lar...\n flag_masks: [ 1 2 4 8 16 ...\n valid_min: 0\n valid_max: 3876569055\n comment: Quality flag for the SSHA from KaRIn in the ssha_karin_2 ...\n\n\nThe flag_meanings and flag_masks attributes define the quality fields/values assigned to each bit (and/or sequence of bits) comprising the integers in the quality variable array. (Refer to the CF Conventions documentation and SWOT PDDs for additional info about standard attributes stored in each netcdf file from SWOT.) The flag meanings/masks attributes are typically space-delimited strings.\n\n\nMake a simple lookup table for the ssha_karin_2_qual variable:\n\natts = dict(qual.attrs.copy())\n\nflags = pd.DataFrame({'flag_meanings': atts.get(\"flag_meanings\").split(\" \"), \n 'flag_masks': atts.get(\"flag_masks\"), }) \\\n .set_index(\"flag_meanings\")\n\ndisplay(flags)\n\n\n\n\n\n\n\n\nflag_masks\n\n\nflag_meanings\n\n\n\n\n\nsuspect_large_ssh_delta\n1\n\n\nsuspect_large_ssh_std\n2\n\n\nsuspect_large_ssh_window_std\n4\n\n\nsuspect_beam_used\n8\n\n\nsuspect_less_than_nine_beams\n16\n\n\nsuspect_ssb_out_of_range\n64\n\n\nsuspect_pixel_used\n128\n\n\nsuspect_num_pt_avg\n256\n\n\nsuspect_karin_telem\n512\n\n\nsuspect_orbit_control\n1024\n\n\nsuspect_sc_event_flag\n2048\n\n\nsuspect_tvp_qual\n4096\n\n\nsuspect_volumetric_corr\n8192\n\n\ndegraded_ssb_not_computable\n32768\n\n\ndegraded_media_delays_missing\n65536\n\n\ndegraded_beam_used\n131072\n\n\ndegraded_large_attitude\n262144\n\n\ndegraded_karin_ifft_overflow\n524288\n\n\nbad_karin_telem\n16777216\n\n\nbad_very_large_attitude\n33554432\n\n\nbad_tide_corrections_missing\n67108864\n\n\nbad_outside_of_range\n536870912\n\n\ndegraded\n1073741824\n\n\nbad_not_usable\n2147483648\n\n\n\n\n\n\n\nNow print the list of unique integer values in the ssha_karin_2_qual variable array. Each value is a sum of an assortment of the numbers above we made in our lookup table. We will decode the quality bits for each one in a new column of our lookup table.\n\nunq_ints_qual = sorted(list(set(qual.load().data.astype(np.int64).flatten().tolist())))\n\nprint(f\"\\n# Counted {len(unq_ints_qual)} unique integers in '{quality_variable_name}' variable array:\\n\\n{unq_ints_qual}\\n\")\n\n\n# Counted 385 unique integers in 'ssha_karin_2_qual' variable array:\n\n[0, 1, 4, 5, 128, 129, 130, 132, 133, 134, 135, 144, 145, 146, 148, 149, 150, 256, 257, 258, 261, 384, 385, 386, 388, 389, 390, 391, 400, 401, 402, 404, 405, 406, 407, 2184, 2185, 2186, 2188, 2189, 2190, 2191, 2200, 2201, 2204, 2205, 2206, 2207, 2440, 2441, 2442, 2444, 2445, 2446, 2447, 2456, 2457, 2458, 2460, 2461, 2462, 2463, 8328, 8329, 8332, 8333, 8344, 8345, 8346, 8348, 8349, 8350, 8584, 8585, 8586, 8588, 8589, 8590, 8591, 8600, 8601, 8602, 8604, 8605, 8606, 8607, 10376, 10380, 10381, 10392, 10393, 10396, 10397, 10398, 10632, 10633, 10634, 10636, 10637, 10638, 10639, 10648, 10649, 10650, 10652, 10653, 10654, 10655, 1073774592, 1073774593, 1073774594, 1073774596, 1073774597, 1073774608, 1073774609, 1073774613, 1073774720, 1073774721, 1073774724, 1073774725, 1073774736, 1073774737, 1073774741, 1073774848, 1073774849, 1073774850, 1073774852, 1073774853, 1073774854, 1073774855, 1073774864, 1073774865, 1073774866, 1073774868, 1073774869, 1073774870, 1073774976, 1073774977, 1073774978, 1073774980, 1073774981, 1073774992, 1073774993, 1073774994, 1073774996, 1073774997, 1073774998, 1073782792, 1073782793, 1073782920, 1073782921, 1073782936, 1073782937, 1073782941, 1073783053, 1073783064, 1073783176, 1073783177, 1073783178, 1073783192, 1073783193, 1073783194, 1073783196, 1073783197, 1073783198, 1073783199, 1074397184, 1074397185, 1074397188, 1074397189, 1074397200, 1074397201, 1074397204, 1074397205, 1074397312, 1074397313, 1074397316, 1074397317, 1074397328, 1074397329, 1074397332, 1074397333, 1074397440, 1074397441, 1074397442, 1074397444, 1074397445, 1074397446, 1074397447, 1074397456, 1074397457, 1074397458, 1074397460, 1074397461, 1074397462, 1074397463, 1074397568, 1074397569, 1074397570, 1074397572, 1074397573, 1074397574, 1074397575, 1074397584, 1074397585, 1074397586, 1074397588, 1074397589, 1074397590, 1074397591, 1074399232, 1074399233, 1074399236, 1074399237, 1074399240, 1074399241, 1074399244, 1074399245, 1074399248, 1074399249, 1074399252, 1074399253, 1074399256, 1074399257, 1074399260, 1074399261, 1074399369, 1074399372, 1074399373, 1074399385, 1074399388, 1074399389, 1074399488, 1074399489, 1074399492, 1074399493, 1074399494, 1074399496, 1074399497, 1074399500, 1074399501, 1074399502, 1074399503, 1074399504, 1074399505, 1074399506, 1074399508, 1074399509, 1074399510, 1074399512, 1074399513, 1074399514, 1074399516, 1074399517, 1074399518, 1074399519, 1074399624, 1074399625, 1074399626, 1074399628, 1074399629, 1074399630, 1074399631, 1074399640, 1074399641, 1074399642, 1074399644, 1074399645, 1074399646, 1074399647, 1074405376, 1074405377, 1074405381, 1074405384, 1074405385, 1074405392, 1074405393, 1074405396, 1074405397, 1074405400, 1074405401, 1074405405, 1074405521, 1074405525, 1074405528, 1074405529, 1074405532, 1074405533, 1074405632, 1074405633, 1074405637, 1074405640, 1074405641, 1074405648, 1074405649, 1074405650, 1074405652, 1074405653, 1074405656, 1074405657, 1074405658, 1074405660, 1074405661, 1074405662, 1074405769, 1074405773, 1074405776, 1074405777, 1074405780, 1074405781, 1074405784, 1074405785, 1074405786, 1074405788, 1074405789, 1074405790, 1074407436, 1074407437, 1074407440, 1074407441, 1074407444, 1074407445, 1074407448, 1074407449, 1074407452, 1074407453, 1074407564, 1074407576, 1074407577, 1074407581, 1074407688, 1074407692, 1074407693, 1074407696, 1074407697, 1074407700, 1074407701, 1074407704, 1074407705, 1074407708, 1074407709, 1074407816, 1074407817, 1074407818, 1074407820, 1074407821, 1074407832, 1074407833, 1074407834, 1074407836, 1074407837, 1074407838, 1074407839, 1074429952, 1074429953, 1074429957, 1074429968, 1074429969, 1074429972, 1074430097, 1074430208, 1074430210, 1074430212, 1074430213, 1074430224, 1074430225, 1074430228, 1074430352, 1074430353, 1074430356, 1074438145, 1074438148, 1074438161, 1074438164, 1074438420, 1074438421, 1074438548, 1074438549, 1074438552, 1074438553, 1074438556, 1074438557, 2684354816, 2684354820, 2751463684]\n\n\n\n\n\nCreate a bitwise True/False mapping for each unique integer in the ssha_karin_2_qual array.\nIt’s often advantageous to construct a data mask based on the pixels/cells that you’d like to include in your analysis (rather than exclude from it; masking in vs. masking out).\n\ndef qual_bits_iter(n):\n while n:\n b = n & (~n+1)\n yield b\n n ^= b\n\ndecomposed_qual = {}\nfor i in sorted(unq_ints_qual):\n if i not in decomposed_qual:\n decomposed_qual[i] = qual_bits_iter(i)\n\ntype(decomposed_qual), len(decomposed_qual)\n\n(dict, 385)\n\n\nAdd one new column for each unique integer in the ssha_karin_qual variable. Highlight table cells that contain True, which indicates the quality criteria on the left/index applies to the pixels/cells in ssha_karin wherever the ssha_karin_qual array contains one of the corresponding integers.\n\nnew_columns_qual = {}\nfor i, j in enumerate(list(set(decomposed_qual))):\n new_columns_qual[j] = flags['flag_masks'] \\\n .apply(lambda x: x in [b for b in qual_bits_iter(j)])\n\nlookup = flags.join(pd.DataFrame(new_columns_qual).sort_index(axis=1)).copy()\n\ndisplay(lookup.style.apply(lambda x: ['background-color:yellow' if all([i,type(i)==bool]) else '' for i in x]))\n\n\n\n\n\n\n \nflag_masks\n0\n1\n4\n5\n128\n129\n130\n132\n133\n134\n135\n144\n145\n146\n148\n149\n150\n256\n257\n258\n261\n384\n385\n386\n388\n389\n390\n391\n400\n401\n402\n404\n405\n406\n407\n2184\n2185\n2186\n2188\n2189\n2190\n2191\n2200\n2201\n2204\n2205\n2206\n2207\n2440\n2441\n2442\n2444\n2445\n2446\n2447\n2456\n2457\n2458\n2460\n2461\n2462\n2463\n8328\n8329\n8332\n8333\n8344\n8345\n8346\n8348\n8349\n8350\n8584\n8585\n8586\n8588\n8589\n8590\n8591\n8600\n8601\n8602\n8604\n8605\n8606\n8607\n10376\n10380\n10381\n10392\n10393\n10396\n10397\n10398\n10632\n10633\n10634\n10636\n10637\n10638\n10639\n10648\n10649\n10650\n10652\n10653\n10654\n10655\n1073774592\n1073774593\n1073774594\n1073774596\n1073774597\n1073774608\n1073774609\n1073774613\n1073774720\n1073774721\n1073774724\n1073774725\n1073774736\n1073774737\n1073774741\n1073774848\n1073774849\n1073774850\n1073774852\n1073774853\n1073774854\n1073774855\n1073774864\n1073774865\n1073774866\n1073774868\n1073774869\n1073774870\n1073774976\n1073774977\n1073774978\n1073774980\n1073774981\n1073774992\n1073774993\n1073774994\n1073774996\n1073774997\n1073774998\n1073782792\n1073782793\n1073782920\n1073782921\n1073782936\n1073782937\n1073782941\n1073783053\n1073783064\n1073783176\n1073783177\n1073783178\n1073783192\n1073783193\n1073783194\n1073783196\n1073783197\n1073783198\n1073783199\n1074397184\n1074397185\n1074397188\n1074397189\n1074397200\n1074397201\n1074397204\n1074397205\n1074397312\n1074397313\n1074397316\n1074397317\n1074397328\n1074397329\n1074397332\n1074397333\n1074397440\n1074397441\n1074397442\n1074397444\n1074397445\n1074397446\n1074397447\n1074397456\n1074397457\n1074397458\n1074397460\n1074397461\n1074397462\n1074397463\n1074397568\n1074397569\n1074397570\n1074397572\n1074397573\n1074397574\n1074397575\n1074397584\n1074397585\n1074397586\n1074397588\n1074397589\n1074397590\n1074397591\n1074399232\n1074399233\n1074399236\n1074399237\n1074399240\n1074399241\n1074399244\n1074399245\n1074399248\n1074399249\n1074399252\n1074399253\n1074399256\n1074399257\n1074399260\n1074399261\n1074399369\n1074399372\n1074399373\n1074399385\n1074399388\n1074399389\n1074399488\n1074399489\n1074399492\n1074399493\n1074399494\n1074399496\n1074399497\n1074399500\n1074399501\n1074399502\n1074399503\n1074399504\n1074399505\n1074399506\n1074399508\n1074399509\n1074399510\n1074399512\n1074399513\n1074399514\n1074399516\n1074399517\n1074399518\n1074399519\n1074399624\n1074399625\n1074399626\n1074399628\n1074399629\n1074399630\n1074399631\n1074399640\n1074399641\n1074399642\n1074399644\n1074399645\n1074399646\n1074399647\n1074405376\n1074405377\n1074405381\n1074405384\n1074405385\n1074405392\n1074405393\n1074405396\n1074405397\n1074405400\n1074405401\n1074405405\n1074405521\n1074405525\n1074405528\n1074405529\n1074405532\n1074405533\n1074405632\n1074405633\n1074405637\n1074405640\n1074405641\n1074405648\n1074405649\n1074405650\n1074405652\n1074405653\n1074405656\n1074405657\n1074405658\n1074405660\n1074405661\n1074405662\n1074405769\n1074405773\n1074405776\n1074405777\n1074405780\n1074405781\n1074405784\n1074405785\n1074405786\n1074405788\n1074405789\n1074405790\n1074407436\n1074407437\n1074407440\n1074407441\n1074407444\n1074407445\n1074407448\n1074407449\n1074407452\n1074407453\n1074407564\n1074407576\n1074407577\n1074407581\n1074407688\n1074407692\n1074407693\n1074407696\n1074407697\n1074407700\n1074407701\n1074407704\n1074407705\n1074407708\n1074407709\n1074407816\n1074407817\n1074407818\n1074407820\n1074407821\n1074407832\n1074407833\n1074407834\n1074407836\n1074407837\n1074407838\n1074407839\n1074429952\n1074429953\n1074429957\n1074429968\n1074429969\n1074429972\n1074430097\n1074430208\n1074430210\n1074430212\n1074430213\n1074430224\n1074430225\n1074430228\n1074430352\n1074430353\n1074430356\n1074438145\n1074438148\n1074438161\n1074438164\n1074438420\n1074438421\n1074438548\n1074438549\n1074438552\n1074438553\n1074438556\n1074438557\n2684354816\n2684354820\n2751463684\n\n\nflag_meanings\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nsuspect_large_ssh_delta\n1\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_large_ssh_std\n2\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_large_ssh_window_std\n4\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\n\n\nsuspect_beam_used\n8\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_less_than_nine_beams\n16\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_ssb_out_of_range\n64\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_pixel_used\n128\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_num_pt_avg\n256\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\n\n\nsuspect_karin_telem\n512\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_orbit_control\n1024\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_sc_event_flag\n2048\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_tvp_qual\n4096\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_volumetric_corr\n8192\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_ssb_not_computable\n32768\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_media_delays_missing\n65536\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\ndegraded_beam_used\n131072\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_large_attitude\n262144\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\ndegraded_karin_ifft_overflow\n524288\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nbad_karin_telem\n16777216\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nbad_very_large_attitude\n33554432\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nbad_tide_corrections_missing\n67108864\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\n\n\nbad_outside_of_range\n536870912\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\n\n\ndegraded\n1073741824\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nbad_not_usable\n2147483648\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\n\n\n\n\n\nNote the distribution of the highlighted cells in the table above. (And see my earlier point about integer size and the number significant bits.)\n\n\nFinally, create a mask based on some criteria selected from the table above.\nFor a simple example, let’s create a mask that excludes pixels that have quality flags prefixed with “bad” or “degraded”, which includes all the flag meanings in this list:\n\nflags_to_mask = sorted([i for i in lookup.index if i.startswith(('bad', 'degraded', 'suspect', ))])\n\ndisplay(flags_to_mask)\n\n['bad_karin_telem',\n 'bad_not_usable',\n 'bad_outside_of_range',\n 'bad_tide_corrections_missing',\n 'bad_very_large_attitude',\n 'degraded',\n 'degraded_beam_used',\n 'degraded_karin_ifft_overflow',\n 'degraded_large_attitude',\n 'degraded_media_delays_missing',\n 'degraded_ssb_not_computable',\n 'suspect_beam_used',\n 'suspect_karin_telem',\n 'suspect_large_ssh_delta',\n 'suspect_large_ssh_std',\n 'suspect_large_ssh_window_std',\n 'suspect_less_than_nine_beams',\n 'suspect_num_pt_avg',\n 'suspect_orbit_control',\n 'suspect_pixel_used',\n 'suspect_sc_event_flag',\n 'suspect_ssb_out_of_range',\n 'suspect_tvp_qual',\n 'suspect_volumetric_corr']\n\n\n\nNow select the columns that contain True in any of the rows indexed by the list of flags_to_mask:\n\ntmp = lookup.copy() # Make a copy of the table.\n\ndel tmp['flag_masks'] # Remove the 'flag_masks' column.\n\nindices = tmp.loc[flags_to_mask].apply(lambda x: x.any()).copy() # Get a boolean array of integers that comprise the mask.\n\nintegers = sorted(tmp.columns[indices].astype(np.int64).tolist()) # Get the columns/integers with one or more flag set to True.\n\nprint(len(integers))\n\n384\n\n\n\n\nNow get the 2d boolean index where ssha_karin_2_qual array contains any of the integers in the list.\n\nssha_karin_2_mask = np.isin(qual.load().data, integers)\n\nprint(f\"Masked: {ssha_karin_2_mask.sum()} / {ssha_karin_2_mask.size}\\n\")\n\ndisplay(ssha_karin_2_mask)\n\nMasked: 428494 / 680754\n\n\n\narray([[ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n ...,\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True]])\n\n\n\n\nConvert the boolean mask array to the equivalent 0,1 integer array and add it to the xarray Dataset as a new variable:\n\nout = ds.copy()\n\nout['mask'] = out[variable_name].copy()\nout['mask'].data = np.where(out.ancillary_surface_classification_flag==0, ssha_karin_2_mask.astype(np.int64), 0)\nout['mask'].attrs = {}\n\n#correct for cross over calibration for the ssha variable so it plots correctly\nout['ssha_karin_2_corrected'] = out.ssha_karin_2 + out.height_cor_xover\n\n\n\n\n\nPlot\n\n#Plot\nSLICE = slice(5000, 5500)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 6), sharey=True) #sharex=True, \n\nLVLS = sorted(set(list(qual.load().isel(num_lines=SLICE).data.flatten())))\n\nout.ssha_karin_2_qual.isel(num_lines=SLICE).astype(int) \\\n .plot(ax=axes[0], levels=LVLS, add_colorbar=True, cbar_kwargs={'orientation': 'horizontal', 'spacing': 'uniform', 'ticks': LVLS})\n\nout.mask.isel(num_lines=SLICE) \\\n .plot(ax=axes[1], colors=['black'], add_colorbar=True, cbar_kwargs={'orientation': 'horizontal', 'ticks': [1], }, levels=[0, 1] )\n\nssha_karin_2_masked = out.ssha_karin_2_corrected \\\n .where(out.mask==0, np.nan).copy()\n\nssha_karin_2_masked.isel(num_lines=SLICE) \\\n .plot(ax=axes[2], add_colorbar=True, cbar_kwargs={'orientation': 'horizontal'}, )\n\n\n\n\n\n\n\n\nWe’ve applied the quality mask to the ssha_karin_2 variable and visualized the result!", + "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html", + "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html", + "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", + "section": "", + "text": "Author: Jinbo Wang Jinbo.Wang@jpl.nasa.gov, Jack McNelis jack.mcnelis@jpl.nasa.gov\nThis is a demonstration of accessing the ECCO-BASED PRE-SWOT NUMERICAL SIMULATION. The dataset can be found following https://search.earthdata.nasa.gov/search?q=pocloud%20pre-swot.\nimport s3fs\nimport requests\nimport xarray as xr\nimport pylab as plt\nfrom netrc import netrc\nfrom urllib import request\nfrom platform import system\nfrom getpass import getpass\nfrom http.cookiejar import CookieJar\nfrom os.path import expanduser, join\n\nShortName = \"MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_v1.0\"\ntarget_file = \"LLC4320_pre-SWOT_ACC_SMST_20111221.nc\"\nEarthdata Login\nAuthenticate with your Earthdata Login/URS credentials by configuring a .netrc file in your home directory.\nRun the next cell to authenticate. (You might be prompted for your Earthdata Login username and password.)\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n \nsetup_earthdata_login_auth()\n\nPlease provide your Earthdata Login credentials for access.\nYour info will only be passed to urs.earthdata.nasa.gov and will not be exposed in Jupyter.\n\n\nUsername: marscreature\nPassword: ·············\nYou should now be able to download the file at the following link:\nhttps_access = f\"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/{ShortName}/{target_file}\"\n\nprint(https_access)\n\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_v1.0/LLC4320_pre-SWOT_ACC_SMST_2011122?.nc\nOpen the dataset\nRun the next cell to access/open the netCDF file with xarray:\ndef begin_s3_direct_access():\n \"\"\"Returns s3fs object for accessing datasets stored in S3.\"\"\"\n response = requests.get(\"https://archive.podaac.earthdata.nasa.gov/s3credentials\").json()\n return s3fs.S3FileSystem(key=response['accessKeyId'],\n secret=response['secretAccessKey'],\n token=response['sessionToken'], \n client_kwargs={'region_name':'us-west-2'})\n\ntry:\n fs = begin_s3_direct_access()\n # Load netCDF with 's3fs' and 'xarray' upon successful connection to S3:\n dd = xr.open_dataset(fs.open(f\"podaac-ops-cumulus-protected/{ShortName}/{target_file}\"))\nexcept:\n print(\"Failed to establish AWS in-region access. Downloading to local disk instead.\")\n request.urlretrieve(https_access, target_file)\n # Load netCDF with 'xarray' after download completes:\n \n dd = xr.open_dataset(target_file)\n\nprint(dd)\n\nFailed to establish AWS in-region access. Downloading to local disk instead.\n<xarray.Dataset>\nDimensions: (i: 192, i_g: 192, j: 349, j_g: 349, k: 84, k_l: 84, k_p1: 85, k_u: 84, nb: 2, time: 24)\nCoordinates:\n * j_g (j_g) float32 0.0 1.0 2.0 3.0 4.0 ... 345.0 346.0 347.0 348.0\n * i (i) float32 0.0 1.0 2.0 3.0 4.0 ... 187.0 188.0 189.0 190.0 191.0\n * i_g (i_g) float32 0.0 1.0 2.0 3.0 4.0 ... 188.0 189.0 190.0 191.0\n * j (j) float32 0.0 1.0 2.0 3.0 4.0 ... 344.0 345.0 346.0 347.0 348.0\n * k (k) int32 0 1 2 3 4 5 6 7 8 9 10 ... 74 75 76 77 78 79 80 81 82 83\n * k_u (k_u) int32 0 1 2 3 4 5 6 7 8 9 ... 74 75 76 77 78 79 80 81 82 83\n * k_l (k_l) int32 0 1 2 3 4 5 6 7 8 9 ... 74 75 76 77 78 79 80 81 82 83\n * k_p1 (k_p1) int32 0 1 2 3 4 5 6 7 8 9 ... 75 76 77 78 79 80 81 82 83 84\n * nb (nb) int32 0 1\n * time (time) datetime64[ns] 2011-12-21 ... 2011-12-21T23:00:00\nData variables:\n XC (j, i) float32 ...\n YC (j, i) float32 ...\n DXV (j, i) float32 ...\n DYU (j, i) float32 ...\n Depth (j, i) float32 ...\n AngleSN (j, i) float32 ...\n AngleCS (j, i) float32 ...\n DXC (j, i_g) float32 ...\n DYG (j, i_g) float32 ...\n DYC (j_g, i) float32 ...\n DXG (j_g, i) float32 ...\n XG (j_g, i_g) float32 ...\n YG (j_g, i_g) float32 ...\n RAZ (j_g, i_g) float32 ...\n XC_bnds (j, i, nb) float64 ...\n YC_bnds (j, i, nb) float64 ...\n Z (k) float32 ...\n Zp1 (k_p1) float32 ...\n Zu (k_u) float32 ...\n Zl (k_l) float32 ...\n Z_bnds (k, nb) float32 ...\n Eta (time, j, i) float64 ...\n KPPhbl (time, j, i) float64 ...\n PhiBot (time, j, i) float64 ...\n oceFWflx (time, j, i) float64 ...\n oceQnet (time, j, i) float64 ...\n oceQsw (time, j, i) float64 ...\n oceSflux (time, j, i) float64 ...\n oceTAUX (time, j, i_g) float64 ...\n oceTAUY (time, j_g, i) float64 ...\n Theta (time, k, j, i) float64 ...\n Salt (time, k, j, i) float64 ...\n U (time, k, j, i_g) float32 ...\n V (time, k, j_g, i) float64 ...\n W (time, k_l, j, i) float64 ...\nAttributes:\n acknowledgement: This research was carried out by the Jet...\n author: Dimitris Menemenlis et al.\n contributor: Chris Hill, Christopher E. Henze, Jinbo ...\n contributor_role: MITgcm developer, AMES supercomputer sup...\n cdm_data_type: Grid\n Conventions: CF-1.7, ACDD-1.3\n creator_email: menemenlis@jpl.nasa.gov\n creator_institution: NASA Jet Propulsion Laboratory (JPL)\n creator_name: Dimitris Menemelis et al.\n creator_type: group\n creator_url: https://science.jpl.nasa.gov/people/Mene...\n date_created: 2021-01-20T00:00:00\n date_issued: 2021-01-20T00:00:00\n date_metadata_modified: 2021-01-20T00:00:00\n geospatial_lat_max: -53.00567\n geospatial_lat_min: -56.989952\n geospatial_lat_units: degrees_north\n geospatial_lon_max: 154.28125\n geospatial_lon_min: 150.30208\n geospatial_lon_units: degrees_east\n geospatial_bounds_crs: EPSG:4326\n geospatial_vertical_max: 0\n geospatial_vertical_min: -6134.5\n geospatial_vertical_positive: up\n geospatial_vertical_resolution: variable\n geospatial_vertical_units: meter\n history: Inaugural release of LLC4320 regions to ...\n id: MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_...\n institution: NASA Jet Propulsion Laboratory (JPL)\n instrument_vocabulary: GCMD instrument keywords\n keywords: EARTH SCIENCE SERVICES > MODELS > EARTH ...\n keywords_vocabulary: NASA Global Change Master Directory (GCM...\n license: Public Domain\n metadata_link: http://podaac.jpl.nasa.gov/ws/metadata/d...\n naming_authority: gov.nasa.jpl\n platform_vocabulary: GCMD platform keywords\n processing_level: L4\n product_time_coverage_end: 2012-11-15T00:00:00\n product_time_coverage_start: 2011-09-13T00:00:00\n product_version: 1.0\n program: NASA Physical Oceanography\n project: Surface Water and Ocean Topography (SWOT...\n publisher_email: podaac@podaac.jpl.nasa.gov\n publisher_institution: PO.DAAC\n publisher_name: Physical Oceanography Distributed Active...\n publisher_type: institution\n publisher_url: https://podaac.jpl.nasa.gov\n source: MITgcm simulation\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadat...\n summary: This is a subset of a global ocean simul...\n time_coverage_end: 2011-12-21 23:00:00\n time_coverage_start: 2011-12-21 00:00:00\n title: LLC4320 regional Southern Ocean\n geospatial_lon_resolution: variable\n geospatial_lat_resolution: variable\n platform: MITgcm" + }, + { + "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-eight-2d-fields.", + "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-eight-2d-fields.", + "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", + "section": "Plot eight 2D fields.", + "text": "Plot eight 2D fields.\n\nfig,ax=plt.subplots(3,3,figsize=(16,16))\n\nvarn=['Eta','KPPhbl','PhiBot','oceFWflx','oceQnet','oceQsw','oceSflux','oceTAUY','oceTAUX']\n\nfor i in range(3):\n for j in range(3):\n dd[varn[i*3+j]][0,...].plot(ax=ax[j,i])\n ax[j,i].set_title(varn[i*3+j])\nplt.tight_layout()" + }, + { + "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-a-3d-field-based-temperature", + "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-a-3d-field-based-temperature", + "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", + "section": "Plot a 3D field based (temperature)", + "text": "Plot a 3D field based (temperature)\n\nfig,ax=plt.subplots(1,2,figsize=(20,10))\ntheta=dd['Theta'][:]\ntheta.coords['k']=dd['Z'].data\n\ntheta[0,0,...].plot(ax=ax[0])\nax[0].vlines(100,0,400,colors='w')\ntheta[0,:,:,100].plot(ax=ax[1])" + }, + { + "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#before-you-start", + "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#before-you-start", + "title": "\nTable of Contents\n", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an Earthdata account https://urs.earthdata.nasa.gov.\nAccounts are free to create and take just a moment to set up.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "Access & Visualization", - "Quality Flags" + "Sentinel-6 Michael Freilich", + "Access by Cycle/Pass" ] }, { - "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#use-case-co-locate-satellite-and-in-situ-data-for-cross-validation", - "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#use-case-co-locate-satellite-and-in-situ-data-for-cross-validation", - "title": "PO.DAAC Cookbook", - "section": "Use Case: Co-locate satellite and in-situ data for cross-validation", - "text": "Use Case: Co-locate satellite and in-situ data for cross-validation\n\nUser Story\nAs a coastal applications researcher, I would like to co-locate in-situ measurements and satellite data near the European coast for cross-validation of data or model validation, during the winter of 2019. (*Note: this user stroes was developed to demo at the 2nd Annual SWOT Applications Early Adopter Hackweek, 8 March 2021.)\n\n\nLearning Objectives\n\nCo-locate remote sensing data from the Earthdata Cloud archive with in-situ measurements from another provider, programmatically using the Earthdata CMR amd Harmony APIs.\nWorkflow can be conducted either locally or in the cloud (i.e. it is compute environment agnostic).\nWhile capabilities demoed here are shown through an oceanography example, these use cases and examples can be applied as building blocks for developing other user workflows with PO.DAAC and Earthdata datasets, across a range of science and applications disciplines, including for example terrestrial hydrology, coastal, or cryosphere.\nNote: Searching for NASA Earthdata data given point-based observation locations can also be done via the NASA Earthdata Search user interface https://search.earthdata.nasa.gov/search, in addition to programmatically (as shown here).\n\n\n\nDatasets used\n\nArgo floats https://argo.ucsd.edu/\nMODIS-Aqua L2 SST https://podaac.jpl.nasa.gov/dataset/AMSRE-REMSS-L2P-v7a\nMUR L4 SST https://registry.opendata.aws/mur/\n\n\n\nMain Steps in Workflow\n\nDefine study region and period of time of interest: Atlantic Ocean west of Portugal and Morocco, January 2019\nGet in-situ Argo floats using the Argo API and prepapre the Argo data (select Argo SST for one float during its journey in Jan 2019 at the top pressure level i.e. nearest the ocean surface)\nGet coincident SST observed by the MODIS satellite, from the NASA Earthdata Cloud (in AWS)\n\nSearch Earthdata Cloud satellite data for collection of interest (MODIS-Aqua L2) (using the CMR API)\nExtract satellite data at the in-situ location for direct comparison (using the Harmony API)\nDownload locally (from the cloud archive), or download to your cloud storage or compute space if working within the AWS cloud\nQuality control the MODIS data with daytime and quality flag filters\n\n\nPlot time series comparing the in-situ and satellite data at in-situ location(s)\nValidate with a third dataset, MUR L4 SST (once version stored in the AWS Registry of Open Data - public data access)\n\nNote: in order to currently access PO.DAAC Cloud Pathfinder datasets such as MODIS SST L2 from the Earthdata Cloud, your Earthdata login username needs to be added to an restrcited early access list (during the transition period of migrating PO.DAAC data to the Earthdata Cloud). Please contact podaac@podaac.jpl.nasa.gov to make that request.\n\n\n\n\nRequirements\nImport modules: The Python ecosystem is organized into modules. A module must be imported before the contents of that modules can be used. It is good practice to import modules in the first code cell of a notebook or at the top of your script. Not only does this make it clear which modules are being used, but it also ensures that the code fails at the beginning because one of the modules is not installed rather half way through after crunching a load of data.\nFor some modules, it is common practice to shorten the module names according to accepted conventions. For example, the plotting module matplotlib.pyplot is shortened to plt. It is best to stick to these conventions rather than making up your own short names so that people reading your code see immediately what you are doing.\n\nfrom netrc import netrc\nfrom urllib import request\nfrom platform import system\nfrom getpass import getpass\nfrom datetime import datetime\nfrom http.cookiejar import CookieJar\nfrom os.path import join, isfile, basename, abspath, expanduser\nfrom folium.plugins import MarkerCluster\nimport folium\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport cartopy.crs as ccrs\nimport xarray as xr\nimport pandas as pd\nimport numpy as np\nimport requests\nimport json\nimport time\n\nmatplotlib.rc('font', **{'family' : 'sans-serif', 'weight': 'normal', 'size': 16})\n\n!mkdir -p resources/\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nThe setup_earthdata_login_auth function will allow Python scripts to log into any Earthdata Login application programmatically. To avoid being prompted for credentials every time you run and also allow clients such as curl to log in, you can add the following to a .netrc (_netrc on Windows) file in your home directory:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nMake sure that this file is only readable by the current user or you will receive an error stating “netrc access too permissive.”\n$ chmod 0600 ~/.netrc\n\nTOKEN_DATA = (\"<token>\"\n \"<username>%s</username>\"\n \"<password>%s</password>\"\n \"<client_id>PODAAC CMR Client</client_id>\"\n \"<user_ip_address>%s</user_ip_address>\"\n \"</token>\")\n\n\ndef setup_cmr_token_auth(endpoint: str='cmr.earthdata.nasa.gov'):\n ip = requests.get(\"https://ipinfo.io/ip\").text.strip()\n return requests.post(\n url=\"https://%s/legacy-services/rest/tokens\" % endpoint,\n data=TOKEN_DATA % (input(\"Username: \"), getpass(\"Password: \"), ip),\n headers={'Content-Type': 'application/xml', 'Accept': 'application/json'}\n ).json()['token']['id']\n\n\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n\n\n# Get your authentication token for searching restricted records in the CMR:\n_token = setup_cmr_token_auth(endpoint=\"cmr.earthdata.nasa.gov\")\n\n# Start authenticated session with URS to allow restricted data downloads:\nsetup_earthdata_login_auth(endpoint=\"urs.earthdata.nasa.gov\")\n\n\n\nStudy region and period\nSet some “master” inputs to define the time and place contexts for our case studies in the ipynb.\n\n# The timeframe of interest (Argovis API limit == 3 months):\nstart_date = \"2019-01-01\"\nend_date = \"2019-01-31\"\n\n# The area/region of interest by latitude/longitude:\naoi_minlon = -26.0\naoi_minlat = 30.0\naoi_maxlon = -12.0\naoi_maxlat = 40.0\n\nPlot the spatial extent of our study area with a blue polygon:\n\nax = plt.subplot(projection=ccrs.PlateCarree())\n\nax.figure.set_figheight(9)\nax.figure.set_figwidth(9)\n\nax.add_patch(mpatches.Rectangle(xy=[aoi_minlon, aoi_minlat], \n width=aoi_maxlon-aoi_minlon, \n height=aoi_maxlat-aoi_minlat,\n facecolor='white',\n alpha=0.5,\n transform=ccrs.Geodetic())\n )\nax.set_extent((aoi_minlon-20., \n aoi_maxlon+20.,\n aoi_minlat-20.,\n aoi_maxlat+20.), crs=ccrs.PlateCarree())\nax.stock_img()\nax.coastlines()\nax.gridlines(color=\"white\", alpha=0.5)\nplt.show()", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#import-libraries", + "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#import-libraries", + "title": "\nTable of Contents\n", + "section": "Import Libraries", + "text": "Import Libraries\n\nimport requests\nfrom os import makedirs\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", "crumbs": [ "Tutorials", - "Science Data Stories", - "SST Cross Validation" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access by Cycle/Pass" ] }, { - "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-temperature-profiles-from-argovis-api", - "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-temperature-profiles-from-argovis-api", - "title": "PO.DAAC Cookbook", - "section": "Access temperature profiles from ArgoVis API", - "text": "Access temperature profiles from ArgoVis API\nArgoVis is an API and visualization service that provides access to Argo float profiles. The endpoint for requesting profile data is given in the cell below:\n\nargo_api_endpoint = 'https://argovis.colorado.edu/selection/profiles/?'\n\nprint(argo_api_endpoint)\n\nhttps://argovis.colorado.edu/selection/profiles/?\n\n\nCreate the AOI polygon in required XY format, make it a string, and collect the dictionary of API parameters:\n\nargo_api_aoi = [[[aoi_minlon, aoi_minlat], \n [aoi_minlon, aoi_maxlat], \n [aoi_maxlon, aoi_maxlat],\n [aoi_maxlon, aoi_minlat],\n [aoi_minlon, aoi_minlat]]]\n\nargo_api_params = {\n 'startDate': start_date.replace(\"-0\",\"-\"), # 1.\n 'endDate': end_date.replace(\"-0\",\"-\"), # 1. No leading zeros in start/end dates\n 'shape': str(argo_api_aoi).replace(\" \",\"\"), # 2. Array of XY vertices for AOI polygon\n #'presRange': \"[0,30]\" # 3. We wont limit by pressure range\n}\n\nargo_api_params\n\n{'startDate': '2019-1-1',\n 'endDate': '2019-1-31',\n 'shape': '[[[-26.0,30.0],[-26.0,40.0],[-12.0,40.0],[-12.0,30.0],[-26.0,30.0]]]'}\n\n\nSubmit the request parameters to the Argovis API. You should receive a JSON response back. Print the number of profiles inside our AOI:\n\nargo_api_response = requests.get(url=argo_api_endpoint, params=argo_api_params)\n\n# Load the response from JSON if the response status is 200:\nif argo_api_response.status_code == 200:\n argo_profiles = argo_api_response.json()\n print(len(argo_profiles))\nelse:\n # Otherwise dump the text for more clues:\n print(argo_api_response.text)\n\n41\n\n\n\nPrepare profile data for further analysis\nConcatenate the list of metadata dictionaries returned for the argos into a table and update a few of its columns with Pythonic types:\n\nargo_df = pd.DataFrame(argo_profiles).sort_values(\"date\")\n\n# Add a column with pandas datetime objects for easier indexing\nargo_df['datetime'] = pd.to_datetime(argo_df['date'])\n# And then replace the original date column with Python dates\nargo_df['date'] = argo_df.datetime.apply(lambda x: x.date).tolist()\n\n# Add two columns of sanitized lats/lons to the data frame\nargo_df['lat'] = argo_df['roundLat'].astype(float).tolist()\nargo_df['lon'] = argo_df['roundLon'].astype(float).tolist()\n\nargo_df.info()\n\n<class 'pandas.core.frame.DataFrame'>\nInt64Index: 41 entries, 40 to 0\nData columns (total 36 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 _id 41 non-null object \n 1 POSITIONING_SYSTEM 41 non-null object \n 2 DATA_CENTRE 41 non-null object \n 3 PI_NAME 41 non-null object \n 4 WMO_INST_TYPE 41 non-null object \n 5 VERTICAL_SAMPLING_SCHEME 41 non-null object \n 6 DATA_MODE 41 non-null object \n 7 PLATFORM_TYPE 41 non-null object \n 8 measurements 41 non-null object \n 9 station_parameters 41 non-null object \n 10 pres_max_for_TEMP 41 non-null float64 \n 11 pres_min_for_TEMP 41 non-null float64 \n 12 pres_max_for_PSAL 41 non-null float64 \n 13 pres_min_for_PSAL 41 non-null float64 \n 14 max_pres 41 non-null float64 \n 15 date 41 non-null object \n 16 date_added 41 non-null object \n 17 date_qc 41 non-null int64 \n 18 lat 41 non-null float64 \n 19 lon 41 non-null float64 \n 20 geoLocation 41 non-null object \n 21 position_qc 41 non-null int64 \n 22 cycle_number 41 non-null int64 \n 23 dac 41 non-null object \n 24 platform_number 41 non-null int64 \n 25 station_parameters_in_nc 41 non-null object \n 26 nc_url 41 non-null object \n 27 DIRECTION 41 non-null object \n 28 BASIN 41 non-null int64 \n 29 core_data_mode 41 non-null object \n 30 roundLat 41 non-null object \n 31 roundLon 41 non-null object \n 32 strLat 41 non-null object \n 33 strLon 41 non-null object \n 34 formatted_station_parameters 41 non-null object \n 35 datetime 41 non-null datetime64[ns, UTC]\ndtypes: datetime64[ns, UTC](1), float64(7), int64(5), object(23)\nmemory usage: 11.9+ KB\n\n\nYou can download profiles in netCDF format from the FTP link stored in the nc_url fields of the response. Here’s the URL for the first of the profiles:\n\nprint(argo_df.iloc[0].nc_url)\n\nftp://ftp.ifremer.fr/ifremer/argo/dac/coriolis/6902663/profiles/R6902663_124.nc\n\n\nDisplay a table summarizing the space/time characteristics of eaach profile:\n\nargo_df[['platform_number', 'cycle_number', 'datetime', 'lon', 'lat']] #, 'measurements']]\n\n\n\n\n\n\n\n\nplatform_number\ncycle_number\ndatetime\nlon\nlat\n\n\n\n\n40\n6902663\n124\n2019-01-01 20:14:00+00:00\n-17.383\n35.601\n\n\n39\n6901260\n49\n2019-01-02 05:43:00+00:00\n-12.812\n37.707\n\n\n38\n6901143\n228\n2019-01-02 09:22:20+00:00\n-21.083\n32.254\n\n\n37\n6902664\n124\n2019-01-02 20:28:00+00:00\n-18.411\n34.985\n\n\n36\n3901643\n43\n2019-01-04 06:13:00+00:00\n-22.429\n37.556\n\n\n35\n3901942\n48\n2019-01-05 20:23:30+00:00\n-15.286\n35.316\n\n\n34\n6901262\n22\n2019-01-06 05:42:59.999000+00:00\n-17.967\n34.228\n\n\n33\n3901932\n22\n2019-01-06 05:49:00+00:00\n-19.904\n33.428\n\n\n32\n1901688\n288\n2019-01-07 03:11:53+00:00\n-23.134\n34.258\n\n\n31\n6901260\n50\n2019-01-07 05:26:00+00:00\n-12.887\n37.905\n\n\n30\n1901688\n289\n2019-01-08 03:15:16+00:00\n-23.137\n34.248\n\n\n29\n6902552\n167\n2019-01-08 12:50:00+00:00\n-23.798\n33.144\n\n\n28\n1901688\n290\n2019-01-09 03:19:48+00:00\n-23.148\n34.233\n\n\n27\n1901688\n291\n2019-01-10 03:27:35+00:00\n-23.158\n34.218\n\n\n26\n6901273\n11\n2019-01-10 05:25:00+00:00\n-12.473\n32.219\n\n\n25\n6902663\n125\n2019-01-11 20:15:00+00:00\n-17.071\n35.830\n\n\n24\n6901260\n51\n2019-01-12 05:18:00+00:00\n-12.982\n38.047\n\n\n23\n6901143\n229\n2019-01-12 07:05:12+00:00\n-21.206\n32.474\n\n\n22\n6902664\n125\n2019-01-12 20:16:00+00:00\n-18.198\n35.057\n\n\n21\n3901643\n44\n2019-01-14 05:58:00+00:00\n-22.706\n37.542\n\n\n20\n3901942\n49\n2019-01-15 20:37:30+00:00\n-15.739\n34.976\n\n\n19\n6901262\n23\n2019-01-16 05:39:00+00:00\n-17.725\n34.223\n\n\n18\n6902785\n54\n2019-01-16 05:56:00+00:00\n-25.507\n38.293\n\n\n17\n3901932\n23\n2019-01-16 06:04:00+00:00\n-19.081\n34.101\n\n\n16\n6901260\n52\n2019-01-17 05:28:00+00:00\n-13.092\n38.266\n\n\n15\n6902552\n168\n2019-01-18 13:02:00+00:00\n-23.575\n33.225\n\n\n14\n1901688\n292\n2019-01-19 20:13:54.002000+00:00\n-23.272\n34.136\n\n\n13\n6901273\n12\n2019-01-20 05:31:00+00:00\n-12.447\n32.181\n\n\n12\n6902663\n126\n2019-01-21 20:21:00+00:00\n-16.892\n35.982\n\n\n11\n6901260\n53\n2019-01-22 05:33:00+00:00\n-13.146\n38.378\n\n\n10\n6901143\n230\n2019-01-22 09:01:03+00:00\n-21.136\n32.880\n\n\n9\n6902664\n126\n2019-01-22 20:23:00+00:00\n-18.099\n35.114\n\n\n8\n3901643\n45\n2019-01-24 06:11:00+00:00\n-23.115\n37.358\n\n\n7\n3901942\n50\n2019-01-25 20:21:30+00:00\n-14.963\n35.402\n\n\n6\n6901262\n24\n2019-01-26 05:47:59.999000+00:00\n-17.474\n34.302\n\n\n5\n3901932\n24\n2019-01-26 06:00:00+00:00\n-18.151\n34.375\n\n\n4\n6902785\n55\n2019-01-26 06:10:00+00:00\n-25.212\n38.213\n\n\n3\n6901260\n54\n2019-01-27 05:38:00+00:00\n-13.265\n38.484\n\n\n2\n6902552\n169\n2019-01-28 12:45:00+00:00\n-23.267\n33.294\n\n\n1\n1901688\n293\n2019-01-29 13:03:27.001000+00:00\n-23.403\n34.206\n\n\n0\n6901273\n13\n2019-01-30 05:27:00+00:00\n-12.737\n32.602\n\n\n\n\n\n\n\nNow plot argo profile locations on an interactive map.\nThis plot uses folium/leaflet. Hover/click the clusters (which correspond to specific Argo float platforms) to zoom to the groups of individual profiles and display metadata about them:\n\ndef _get_tooltip(profile: dict):\n return \"\"\"<b>Date</b>: {date}<br>\n <b>Profile ID</b>: {_id}<br>\n <b>Platform ID</b>: {platform_number}<br>\n <b>Latitude</b>: {lat}<br>\n <b>Longitude</b>: {lon}<br>\"\"\".format(**profile)\n\n\nm = folium.Map(location=[argo_df['lat'].mean(), argo_df['lon'].mean()], \n tiles=\"Stamen Terrain\",\n zoom_start=5, )\n\n# Loop over list of unique platform_numbers (floats)\nunique_argo_platform_numbers = argo_df.platform_number.unique().tolist()\n\nfor i, platform in enumerate(unique_argo_platform_numbers):\n # Get row(s) for the current platform\n p = argo_df[argo_df['platform_number']==platform]\n # Make an empty marker cluster to add to the map widget\n cluster = MarkerCluster(name=p['platform_number'])\n # Make markers in a loop and add to the cluster:\n for c in p['cycle_number'].tolist():\n # Select the row for the current profile ('cycle')\n profile = p[p['cycle_number']==c].iloc[0]\n # Create a new marker and add it to the cluster\n cluster.add_child(folium.Marker(\n location=[profile['lat'], profile['lon']],\n tooltip=_get_tooltip(profile.to_dict())))\n m.add_child(cluster)\n\ndisplay(m)\n\nMake this Notebook Trusted to load map: File -> Trust Notebook\n\n\n\nReformat profile data into data frames\nThe in situ measurements temperature, pressure, and salinity readings collected during each profile are returned inside the JSON response.\nThe format of the measurements field is perfect for conversion to pandas data frames. Apply pandas.DataFrame over the entire measurements column to make a pandas.Series of data frames, and replace the existing content in the measurements column:\n\nargo_df['measurements'] = argo_df['measurements'].apply(pd.DataFrame).tolist()\n\n# Print statistical summary of the table content:\nargo_df.iloc[0].measurements.describe()\n\n\n\n\n\n\n\n\ntemp\npres\npsal\n\n\n\n\ncount\n105.000000\n105.000000\n105.000000\n\n\nmean\n11.579429\n794.390476\n35.832990\n\n\nstd\n4.726514\n655.512828\n0.433002\n\n\nmin\n4.053000\n6.000000\n35.073000\n\n\n25%\n8.096000\n146.000000\n35.597000\n\n\n50%\n10.885000\n713.000000\n35.765000\n\n\n75%\n15.750000\n1363.000000\n36.128000\n\n\nmax\n18.418000\n2010.000000\n36.504000\n\n\n\n\n\n\n\nPlot temperature at the minimum pressure for each profile\nThis cell applies a lambda over the measurements column to slice the row corresponding to the minimum pressure bin for each profile and returns the corresponding temperature measurement:\n\ndef _get_prof_temp_at_pres_min(x):\n return x[x['pres']==x['pres'].min()]['temp'].item()\n\n# Apply the fuunction over the column of measurements tables\nargo_df['temp_at_pres_min'] = argo_df['measurements'].apply(_get_prof_temp_at_pres_min).tolist()\n\n# Plot temperature measured nearest to the sea surface for each profile \nargo_df.plot.scatter(x=\"datetime\", y=\"temp_at_pres_min\", figsize=(16, 4))\nplt.title(\"~Daily temperature at minimum pressure across ~40 argo profiles\")\nplt.xlabel(None)\nplt.ylabel(\"Temperature (degrees C)\")\nplt.ylim(15.5, 20.5)\nplt.grid(alpha=0.25)\n\n\n\n\n\n\n\n\n\n\nSelect an Argo of Interest and its platform_number\nSee which floats had the most profiles within our timeframe/area of interest:\n\nargo_df.groupby(\"platform_number\").count()['cycle_number']\n\nplatform_number\n1901688 6\n3901643 3\n3901932 3\n3901942 3\n6901143 3\n6901260 6\n6901262 3\n6901273 3\n6902552 3\n6902663 3\n6902664 3\n6902785 2\nName: cycle_number, dtype: int64\n\n\nChoose a float with six profiles to study further during the remainder of the notebook.\n\ntarget_argo = 6901260\n\n# Select rows (profiles) for the desired platform:\nargo_skinny = argo_df[argo_df.platform_number==target_argo].copy()\n\nargo_skinny.describe()\n\n\n\n\n\n\n\n\npres_max_for_TEMP\npres_min_for_TEMP\npres_max_for_PSAL\npres_min_for_PSAL\nmax_pres\ndate_qc\nlat\nlon\nposition_qc\ncycle_number\nplatform_number\nBASIN\ntemp_at_pres_min\n\n\n\n\ncount\n6.000000\n6.0\n6.000000\n6.0\n6.000000\n6.0\n6.000000\n6.000000\n6.0\n6.000000\n6.0\n6.0\n6.000000\n\n\nmean\n1992.666667\n6.0\n1992.666667\n6.0\n1992.666667\n1.0\n38.131167\n-13.030667\n1.0\n51.500000\n6901260.0\n1.0\n16.921000\n\n\nstd\n21.500388\n0.0\n21.500388\n0.0\n21.500388\n0.0\n0.297238\n0.168997\n0.0\n1.870829\n0.0\n0.0\n0.495337\n\n\nmin\n1961.000000\n6.0\n1961.000000\n6.0\n1961.000000\n1.0\n37.707000\n-13.265000\n1.0\n49.000000\n6901260.0\n1.0\n16.153000\n\n\n25%\n1980.500000\n6.0\n1980.500000\n6.0\n1980.500000\n1.0\n37.940500\n-13.132500\n1.0\n50.250000\n6901260.0\n1.0\n16.643250\n\n\n50%\n1994.500000\n6.0\n1994.500000\n6.0\n1994.500000\n1.0\n38.156500\n-13.037000\n1.0\n51.500000\n6901260.0\n1.0\n17.014000\n\n\n75%\n2010.750000\n6.0\n2010.750000\n6.0\n2010.750000\n1.0\n38.350000\n-12.910750\n1.0\n52.750000\n6901260.0\n1.0\n17.263250\n\n\nmax\n2014.000000\n6.0\n2014.000000\n6.0\n2014.000000\n1.0\n38.484000\n-12.812000\n1.0\n54.000000\n6901260.0\n1.0\n17.479000", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#authentication-with-earthaccess", + "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#authentication-with-earthaccess", + "title": "\nTable of Contents\n", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", "crumbs": [ "Tutorials", - "Science Data Stories", - "SST Cross Validation" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access by Cycle/Pass" ] }, { - "objectID": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-sea-surface-temperature-from-modis", - "href": "notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html#access-sea-surface-temperature-from-modis", - "title": "PO.DAAC Cookbook", - "section": "Access sea surface temperature from MODIS", - "text": "Access sea surface temperature from MODIS\nThe user guide for MODIS Level 2 Sea Surface Temperature (SST) from GHRSST is available on the PO.DAAC Drive: https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf\nWe will access L2 SST data for our AOI and time period of interest by submitting two subset requests to the Harmony API.\nRedefine the AOI to the minimum XY bounds of selected profiles\nSimply replace the aoi_* Python variables with min/max of the lat and lon columns in the new argo_skinny data frame:\n\naoi_minlon = argo_skinny.lon.min()\naoi_maxlon = argo_skinny.lon.max()\naoi_minlat = argo_skinny.lat.min()\naoi_maxlat = argo_skinny.lat.max()\n\naoi_minlon, aoi_minlat, aoi_maxlon, aoi_maxlat\n\n(-13.265, 37.707, -12.812, 38.484)\n\n\nSearch the Common Metadata Repository (CMR) for its unique concept-id\nThe API requires a dataset identifier that we must obtain from CMR. In the next cell, submit a request to the CMR API to grab the metadata for to the dataset/collection.\n\nmodis_results = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': \"MODIS_A-JPL-L2P-v2019.0\",\n 'token': _token}\n).json()\n\n# Select the first/only record in the JSON response:\nmodis_coll = modis_results['items'][0]\n\n# Select the 'concept-id' from the 'meta' dictionary:\nmodis_ccid = modis_coll['meta']['concept-id']\n\nmodis_ccid\n\n'C1940473819-POCLOUD'\n\n\n\nRequest subsets from the Harmony API\nWe will submit two requests to the Harmony API. The API is under active development, and it’s therefore recommended that you test your input parameters in the Swagger API interface.\nThe next cell joins the base url for the API to the concept-id obtained above. Run the cell and print the complete url to confirm:\n\nharmony_url = \"https://harmony.earthdata.nasa.gov\"\nharmony_url_modis = f\"{harmony_url}/{modis_ccid}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?\"\n\nprint(harmony_url_modis)\n\nhttps://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?\n\n\nMake a dictionary of subset parameters and format the values to meet requirements of the Harmony API. (See the Swagger UI linked above for more information about those requirements.)\nNote how I’ve commented out the time parameter for the second half of January. I requested the first 15 days and then the second 15 days in two requests to get the whole month.\nHere we print the parameters for the first request:\n\nharmony_params_modis1 = {\n 'time': f'(\"{start_date}T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")',\n 'lat': f'({aoi_minlat}:{aoi_maxlat})',\n 'lon': f'({aoi_minlon}:{aoi_maxlon})',\n}\n\nharmony_params_modis2 = {\n 'time': f'(\"2019-01-16T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")',\n 'lat': f'({aoi_minlat}:{aoi_maxlat})',\n 'lon': f'({aoi_minlon}:{aoi_maxlon})',\n}\n\nharmony_params_modis1\n\n{'time': '(\"2019-01-01T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")',\n 'lat': '(37.707:38.484)',\n 'lon': '(-13.265:-12.812)'}\n\n\nComplete the url by formatting the query portion using the parameters dictionary:\n\nrequest_url_modis1 = harmony_url_modis+\"subset=time{time}&subset=lat{lat}&subset=lon{lon}\".format(**harmony_params_modis1)\nrequest_url_modis2 = harmony_url_modis+\"subset=time{time}&subset=lat{lat}&subset=lon{lon}\".format(**harmony_params_modis2)\n\nprint(request_url_modis1)\n\nhttps://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?subset=time(\"2019-01-01T00:00:00.000Z\":\"2019-01-15T23:59:59.999Z\")&subset=lat(37.707:38.484)&subset=lon(-13.265:-12.812)\n\n\n\n\nSubmit the request parameters to the Harmony API endpoint\nI’ve already submitted the two requests required to obtain full coverage for our region and timeframe of interest (the two urls in the job_status list below). To submit a new request, or to submit these two MODIS requests again, comment out the two items in the list like this:\njob_status = [\n #'https://...'\n #'https://...\n]\nIt should trigger new requests in the subsequent cells.\n\njob_status = [ \n# \"https://harmony.earthdata.nasa.gov/jobs/512ca343-3bfe-48c5-a480-9281b7348761\", # First time slice\n# \"https://harmony.earthdata.nasa.gov/jobs/5b29414d-3856-4e94-9568-01b32b02a951\", # Second time slice\n]\n\nThe next cell should download a JSON for your new request or from the first request that I submitted while I developed this notebook.\nPrint the message field of the JSON response:\n\nrequest_urls_for_modis = [request_url_modis1, request_url_modis2]\n\nif len(job_status)==0:\n # Loop over the list of request urls:\n for r in request_urls_for_modis:\n # Submit the request and decode the response from json string to dict:\n response_modis = requests.get(r)\n # If the response came back with something other than '2xx', raise an error:\n if not response_modis.status_code // 100 == 2: \n raise Exception(response_modis.text)\n else:\n response_data = response_modis.json()\n # Append the status endpoint to the list of 'job_status' urls:\n job_status.append(response_data['links'][0]['href'])\nelse:\n response_data = requests.get(job_status[0]).json()\n\nresponse_data['message']\n\n'The job is being processed'\n\n\nSuccessful requests to the API will respond with a JSON that starts like this:\n{\n \"username\": \"jmcnelis\",\n \"status\": \"running\",\n \"message\": \"The job is being processed\",\n \"progress\": 0,\n \"createdAt\": \"2021-02-25T02:09:35.972Z\",\n \"updatedAt\": \"2021-02-25T02:09:35.972Z\",\n ...\nThe example above is truncated to the first several lines for the sake of space.\nMonitor the status of an in-progress job\nSelect the status URL(s) from the list(s) of links:\n\nif len(job_status)==0:\n try:\n job_status = [l['href'] for l in response_data['links'] if l['title']==\"Job Status\"]\n except (KeyError, IndexError) as e:\n raise e\n\nprint(job_status)\n\n['https://harmony.earthdata.nasa.gov/jobs/558426d1-3df4-4cc2-80dc-943d03ac5810', 'https://harmony.earthdata.nasa.gov/jobs/dafd8c06-89b5-4dd6-af1d-cacb12512101']\n\n\nRun the next cell to monitor the status of as many requests as you need.\nIt will loop over the job_status list and wait for all the requests to finish processing. (It terminates when the status field of the JSON response does not contain the string \"running\".)\n\nwait = 10 # The number of seconds to wait between each status check\ncompleted = {} # A dict of JSON responses for completed jobs\n\n# Loop repeatedly to check job status. Wait before retrying.\nwhile True:\n for j in job_status: # Iterate over list of job urls\n if j in completed: # Skip if completed.\n continue\n # Get the current job's status as a JSON object.\n job_data = requests.get(j).json()\n if job_data['status']!='running':\n completed[j] = job_data # Add to 'completed' if finished\n # Break loop if 'completed' dictionary contains all jobs.\n if len(completed)==2:\n break\n # If still processing, print a status update and wait ten seconds.\n print(f\"# Job(s) in progress ({len(completed)+1}/{len(job_status)})\")\n time.sleep(wait)\n \nprint(f\"\\n{'&'*40}\\n%\\t\\tDONE!\\n{'&'*40}\\n\")\n\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (1/2)\n# Job(s) in progress (2/2)\n\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n% DONE!\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n\n\n\nThe final response(s) are massive whenever your subset results in a large number of output granules. Print everything but the links here:\n\nprint(json.dumps({k:v for k, v in job_data.items() if k!=\"links\"}, indent=2))\n\n{\n \"username\": \"jmcnelis\",\n \"status\": \"successful\",\n \"message\": \"The job has completed successfully\",\n \"progress\": 100,\n \"createdAt\": \"2021-03-15T21:08:45.844Z\",\n \"updatedAt\": \"2021-03-15T21:10:51.310Z\",\n \"request\": \"https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?subset=time(%222019-01-16T00%3A00%3A00.000Z%22%3A%222019-01-31T23%3A59%3A59.999Z%22)&subset=lat(37.707%3A38.484)&subset=lon(-13.265%3A-12.812)\",\n \"numInputGranules\": 55,\n \"jobID\": \"dafd8c06-89b5-4dd6-af1d-cacb12512101\"\n}\n\n\nNow look at the first url that points to a subset file (skip the first two because they point to other stuff about the order):\n\nprint(json.dumps(job_data['links'][2], indent=2))\n\n{\n \"href\": \"https://harmony.earthdata.nasa.gov/service-results/harmony-prod-staging/public/podaac/l2-subsetter/80c8503e-c958-4825-b072-ccdee3f7863b/20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4\",\n \"title\": \"20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4\",\n \"type\": \"application/x-netcdf4\",\n \"rel\": \"data\",\n \"bbox\": [\n -13.3,\n 37.7,\n -12.8,\n 38.5\n ],\n \"temporal\": {\n \"start\": \"2019-01-16T02:30:01.000Z\",\n \"end\": \"2019-01-16T02:34:59.000Z\"\n }\n}\n\n\nThis cell collects all the output links (Python dicts) from our requests in a list and prints the total number of outputs:\n\njob_links = []\n\nfor j in list(completed.values()):\n for l in j['links']:\n if l['href'].endswith(\"subsetted.nc4\"):\n job_links.append(l)\n\nprint(len(job_links))\n\n74\n\n\n\nPrepare subset data for further analysis\nGet the subset metadata as pandas.DataFrame. We can use apply logic to calculate stats over the time series in subsequent steps. Print the number of rows to confirm. (Should match above)\n\nsubsets_df = pd.DataFrame(data=[{**l, **l['temporal']} for l in job_links])\n\nprint(subsets_df.index.size)\n\n74\n\n\nSelect day/drop night observations\nAdd a day/night flag column to the table. Apply a function over the href column to check the source filename for a string indicating day/night for the swath:\n\nsubsets_df['daytime'] = subsets_df['href'].apply(lambda x: 'MODIS_A-N' not in x)\n\nsubsets_df.info()\n\n<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 74 entries, 0 to 73\nData columns (total 9 columns):\n # Column Non-Null Count Dtype \n--- ------ -------------- ----- \n 0 href 74 non-null object\n 1 title 74 non-null object\n 2 type 74 non-null object\n 3 rel 74 non-null object\n 4 bbox 74 non-null object\n 5 temporal 74 non-null object\n 6 start 74 non-null object\n 7 end 74 non-null object\n 8 daytime 74 non-null bool \ndtypes: bool(1), object(8)\nmemory usage: 4.8+ KB\n\n\nAnd finally, reformat the start timestamps as a new column containing pandas datetime objects instead of strings. Then, add one more column containing a date object (rather than the full datetime timestamp) which we’ll use to aggregate the data before plotting.\n\n# Add new 'datetime' column so that we aren't working with strings:\nsubsets_df['datetime'] = pd.to_datetime(subsets_df['start'])\n\n# Add new 'date' column for aggregation during the final steps of the workflow:\nsubsets_df['date'] = subsets_df.datetime.apply(lambda x: x.date()).tolist()\n\nsubsets_df.date.iloc[0]\n\ndatetime.date(2019, 1, 1)\n\n\n\n\n\nAccessing outputs from your subset request\nNow we will download all the netCDF subsets to the local workspace. (I’m inside AWS as I develop this ipynb.) Set a target directory and create it if needed:\n\ntarget_dir = f\"resources/data/\"\n\n!mkdir -p $target_dir\n\nThis function should handle downloads reliably–test by downloading the first netCDF subset from our table (subsets_df):\n\ndef download_target_file(url: str, force: bool=False):\n # Determine the target path for the download\n target_file = join(target_dir, basename(url))\n if isfile(target_file) and force is False:\n print(f\"# File already exists. Skipping...\\n({basename(url)})\\n\")\n return\n print(f\"# File downloading...\\n({basename(url)})\\n\")\n # Open a remote connection for download stream/write to disk:\n with requests.get(url) as r:\n # Raise exception if response has status other than '2xx':\n if not r.status_code // 100 == 2: \n raise Exception(r.text)\n else:\n # Otherwise write the file to disk:\n with open(target_file, 'wb') as f:\n for chunk in r.iter_content(chunk_size=1024):\n if chunk:\n f.write(chunk)\n \n\n# Test the download function by passing the URL for the first subset in the `subsets` table:\ndownload_target_file(url=subsets_df['href'].iloc[0])\n\n# Join the string path to the target file that should have just downloaded.\ntest_nc4 = join(target_dir, basename(subsets_df['href'].iloc[0]))\n\nprint(\"The first file downloaded successfully:\", isfile(test_nc4))\n\n# File already exists. Skipping...\n(20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\nThe first file downloaded successfully: True\n\n\nMake sure you can dump the header of that file with ncdump. (The output below is truncated.)\n\n!ncdump -h $test_nc4 | head -20\n\nnetcdf \\20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted {\ndimensions:\n nj = 92 ;\n ni = 42 ;\n time = 1 ;\nvariables:\n float lat(nj, ni) ;\n lat:_FillValue = -999.f ;\n lat:long_name = \"latitude\" ;\n lat:standard_name = \"latitude\" ;\n lat:units = \"degrees_north\" ;\n lat:valid_min = -90.f ;\n lat:valid_max = 90.f ;\n lat:comment = \"geographical coordinates, WGS84 projection\" ;\n lat:coverage_content_type = \"coordinate\" ;\n float lon(nj, ni) ;\n lon:_FillValue = -999.f ;\n lon:long_name = \"longitude\" ;\n lon:standard_name = \"longitude\" ;\n lon:units = \"degrees_east\" ;\n\n\nNetCDF file format errors indicate that the download was not successful. cat the file for more clues. Read and plot the sea_surface_temperature variable:\n\nwith xr.open_dataset(test_nc4) as ds:\n ds.sea_surface_temperature[0].plot()\n\n\n\n\n\n\n\n\n\nDownload all the netCDF subsets\nGet the links in the href column in a loop:\n\nfor u in subsets_df['href'].tolist():\n download_target_file(u)\n\n# File already exists. Skipping...\n(20190101031001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190101141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190102021501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190102132001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190103030000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190103140501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104020501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104034001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104034501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104131001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190104144501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190105025001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190105135000-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190106033000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190106143501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190107023501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190107134001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190108032000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190108142000-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190109022501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190109132501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190110030501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190110141001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111021000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111131500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190111145500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190112025501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190112140001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113020001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113033501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113130500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190113144001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190114024000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190114134500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190115032501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190115143001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190116023001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190116133500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190117031000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190117141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190118021501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190118132001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190119030001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190119140500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120020501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120034000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120034501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120131001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190120144501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190121025001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190121135001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190122033000-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190122143500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190123023501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190123134001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190124032001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190124142001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190125022500-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190125132500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190126030501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190126141001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127021001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127131500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190127145500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190128025500-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190128140001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129020001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129033501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129130501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190129144001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190130024001-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190130134500-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190131032501-JPL-L2P_GHRSST-SSTskin-MODIS_A-N-v02.0-fv01.0_subsetted.nc4)\n\n# File already exists. Skipping...\n(20190131143001-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4)\n\n\n\nThe next cell adds a column of absolute paths to the netCDF files to the data frame subsets_df:\n\nsubsets_df['path'] = subsets_df['href'].apply(lambda x: abspath(join(target_dir, basename(x))))\n\nisfile(subsets_df['path'].iloc[0])\n\nTrue\n\n\n\n\nLimit to daytime MODIS observations\nSelect just the daytime observations into a new data frame. (Remember we added a daytime column during a previous step.)\n\nsubsets_day = subsets_df[subsets_df.daytime==True].copy()\n\nprint(subsets_day.index.size, \"of\", subsets_df.index.size, \"MODIS acquisitions were collected during daytime\")\n\n37 of 74 MODIS acquisitions were collected during daytime\n\n\n\n\nData quality\nThe quality_level variable describes the observation quality for each pixel in the L2 swaths. Values are assigned between 1 and 6 corresponding to these quality levels:\n\nno_data\nbad_data\nworst_quality\nlow_quality\nacceptable_quality\nbest_quality\n\nThe next cell plots the masked SST grid for the first daytime observations:\n\nwith xr.open_dataset(subsets_day.iloc[0].path) as ds:\n\n # Create a mask for pixels that are \n quality_mask = ds.quality_level[0]==5\n\n # Fill pixels where ###### with np.nan:\n masked_ds = ds.where(quality_mask)\n\n # Plot the resulting array of sea surface temperature:\n masked_ds.sea_surface_temperature[0].plot()\n\n\n\n\n\n\n\n\n\n\n\nPlot time series from multiple data sources\nRoll the logic above into a few map-able functions that group the SST data by day to produce (up to) one daily mean.\n\nApply filter and mean in two functions\nget_user_stat reads the input netCDF and applies some user-specified function to the dataset to render the desired output, then closes the file.\nThe second function _masked_mean filters and calculates the XY mean of the sea_surface_temperature variable. (You could replace this function with your own to do something different.)\n\nTest the combined routine against the first file in the daytime MODIS table:\n\nsubsets_day['path'].iloc[0]\n\n'/Users/jmcnelis/tmp/appscitmp/tutorials/notebooks/SWOT-EA-2021/resources/data/20190101141501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0_subsetted.nc4'\n\n\n\nimport warnings\n\ndef get_user_stat(netcdf, function):\n with xr.open_dataset(netcdf) as ds: \n output = function(ds)\n return output\n\n\ndef _masked_mean(ds):\n '''Produce any output stat/object you want in this function'''\n # Create a mask for pixels that are \n quality_mask = ds.quality_level[0]>=5\n # Fill pixels with np.nan where quality_level is less than 4:\n masked_ds = ds.where(quality_mask)\n # Ignore warnings about calculating mean over an empty array:\n with warnings.catch_warnings():\n warnings.simplefilter(\"ignore\", category=RuntimeWarning)\n # Calculate mean over the XY dimensions (nj, ni in this case)\n value = masked_ds['sea_surface_temperature'].mean(['nj', 'ni']).data.item()\n #value = np.nanmean(masked_sst)\n return value\n\nval = get_user_stat(subsets_day['path'].iloc[0], function=_masked_mean)\n\nval-273.15 # subtract 273.15 to convert Kelvin to Celsius\n\n16.743005371093773\n\n\nThat should give a reasonable value in degrees Celsius.\n\nGet means for the filtered MODIS SST time series in a new column\nApply the _masked_mean function over the column of subsets (i.e. netCDF4 files) to get the time series in a new column sst_mean:\n\nsubsets_day['sst_mean'] = subsets_day['path'].apply(get_user_stat, args=(_masked_mean,))-273.15\n\nsubsets_day['sst_mean'].describe()\n\ncount 15.000000\nmean 16.404915\nstd 0.566561\nmin 15.284357\n25% 15.921838\n50% 16.546533\n75% 16.833688\nmax 17.222162\nName: sst_mean, dtype: float64\n\n\nWe may need to group by the date:\n\nsubsets_day_means = subsets_day.groupby(\"date\", as_index=False).mean()\n\nsubsets_day_means.describe()\n\n\n\n\n\n\n\n\nsst_mean\n\n\n\n\ncount\n15.000000\n\n\nmean\n16.404915\n\n\nstd\n0.566561\n\n\nmin\n15.284357\n\n\n25%\n15.921838\n\n\n50%\n16.546533\n\n\n75%\n16.833688\n\n\nmax\n17.222162\n\n\n\n\n\n\n\nNow plot the two time series along the same date axis for visual comparison:\n\nfig, ax = plt.subplots(figsize=(16, 4))\n\n# Plot mean sea surface temperature from MODIS SST from GHRSST\nsubsets_day_means.plot.scatter(\n x=\"date\",\n y=\"sst_mean\", \n label=\"SST observed by MODIS\",\n s=100,\n ax=ax\n)\n\n# Plot mean sea surface temperature from the Argo floats\nargo_skinny.plot.scatter(\n x=\"date\",\n y=\"temp_at_pres_min\",\n s=100,\n color=\"orange\",\n marker=\"v\",\n label=\"SST measured by Argo floats\",\n ax=ax\n)\n\n# Matplotlib aesthetic treatments starting from here -->\nax.set_ylabel(\"Temperature (deg C)\")\nax.set_ylim(15.0, 18.0)\nax.grid(alpha=0.25)\n\n\n\n\n\n\n\n\n\n\n\nMUR Level 4 SST from AWS Open Registry\nTry plotting the summarized time series for the two datasets against MUR L4 SST from AWS Open Registry: https://registry.opendata.aws/mur/\n\nimport fsspec\nimport xarray as xr\nfrom dask.distributed import Client\n\n# Reference the MUR L4 SST data on the AWS Open Registry\nurl = 's3://mur-sst/zarr'\n\n# Open the remote dataset from its S3 endpoint (pre-consolidated)\nds = xr.open_zarr(fsspec.get_mapper(url, anon=True), consolidated=True)\n\n# Slice the dataset along its X, Y, and T dimensions:\nmur_L4_subset = ds['analysed_sst'].sel(\n time=slice('2019-01-01','2019-01-31'),\n lat=slice(aoi_minlat, aoi_maxlat), \n lon=slice(aoi_minlon, aoi_maxlon),\n).persist()\n\n# Aggregate the spatial dimensions to compute the one-dimensional time series of means:\nmur_L4_subset_means = mur_L4_subset.groupby(\"time\").mean([\"lon\", \"lat\"])-273.15\n\nprint(mur_L4_subset_means)\n\n<xarray.DataArray 'analysed_sst' (time: 31)>\ndask.array<sub, shape=(31,), dtype=float32, chunksize=(1,), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-31T09:00:00\n\n\nAdd the MUR time series to the subsets table so that they share the same time axis with the L2 time series:\n\nsubsets_day_means['L4_MUR_SST'] = mur_L4_subset_means.compute().data\n\nPlot the result alongside our data processed throughout the notebook:\n\nfig, ax = plt.subplots(figsize=(16, 5))\n\n# Plot the L4 SST from MUR (hosted by AWS Open Registry)\nsubsets_day_means.plot.line(\n x=\"date\",\n y=\"L4_MUR_SST\",\n color=\"red\",\n label=\"L4 MUR SST (AWS Open Registry)\",\n ax=ax,\n)\n\n# Plot the L2 SST from GHRSST (subset through Harmony API)\nsubsets_day_means.plot.scatter(\n x=\"date\",\n y=\"sst_mean\", \n label=\"L2 MODIS SST (EOSDIS Cloud)\",\n s=100,\n ax=ax\n)\n\n# Plot the in situ temps measured at the surface during Argo profiles (accessed from ArgoVis)\nargo_skinny.plot.scatter(\n x=\"date\",\n y=\"temp_at_pres_min\",\n s=100,\n color=\"orange\",\n marker=\"v\",\n label=\"In situ measurements (ArgoVis API)\",\n ax=ax\n)\n\n# Matplotlib aesthetic treatments starting from here -->\nplt.xticks(rotation=15)\nax.set_xlabel(None)\nax.set_xlim(subsets_day_means.date.iloc[0], subsets_day_means.date.iloc[-1])\nax.set_ylabel(\"Temperature (deg C)\")\nax.set_ylim(15.0, 18.0)\nax.grid(alpha=0.25)\nax.set_title(\"Daily SST from L2 MODIS, L4 MUR, and in situ measurements (January 2019)\")\n\nText(0.5, 1.0, 'Daily SST from L2 MODIS, L4 MUR, and in situ measurements (January 2019)')", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#find-granules-by-cyclepass-number", + "href": "notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html#find-granules-by-cyclepass-number", + "title": "\nTable of Contents\n", + "section": "Find granules by cycle/pass number", + "text": "Find granules by cycle/pass number\nThe CMR Search API provides for searching ingested granules by their cycle and pass numbers. A third parameter, the tile identifier, is provisioned for use during the upcoming SWOT mission but isn’t used by CMR Search at this time. Read more about these orbit identifiers here.\nPasses within a cycle are unique, there will be no repeats until the next cycle. Tile numbers are only unique within a pass, so if you’re looking only at tile numbers there will be over 300 per cycle, but only 1 per pass.\nInfo below may only apply to NRT use case:\n\nThis workflow/notebook can be run routinely to maintain a time series of NRT data, downloading new granules as they become available in CMR.\nThe notebook writes/overwrites a file .update to the target data directory with each successful run. The file tracks to date and time of the most recent update to the time series of NRT granules using a timestamp in the format yyyy-mm-ddThh:mm:ssZ.\nThe timestamp matches the value used for the created_at parameter in the last successful run. This parameter finds the granules created within a range of datetimes. This workflow leverages the created_at parameter to search backwards in time for new granules ingested between the time of our timestamp and now.\n\nThe variables in the cell below determine the workflow behavior on its initial run:\n\ntrackcycle and trackpass: Set the cycle and pass numbers to use for the CMR granule search.\ncmr: The domain of the target CMR instance, either cmr.earthdata.nasa.gov.\nccid: The unique CMR concept-id of the desired collection.\ndata: The path to a local directory in which to download/maintain a copy of the NRT granule time series.\n\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\n# this function returns a concept id for a particular dataset\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n#\n# This cell accepts parameters from command line with papermill: \n# https://papermill.readthedocs.io\n#\n# These variables should be set before the first run, then they \n# should be left alone. All subsequent runs expect the values \n# for cmr, ccid, data to be unchanged. The mins value has no \n# impact on subsequent runs.\n#\n\ntrackcycle = 25\ntrackpass = 1\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nccid = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ndata = \"resources/trackcycle\"\n\nThe variable data is pointed at a nearby folder resources/cyclepass by default. You should change data to a suitable download path on your file system. An unlucky sequence of git commands could disappear that folder and its downloads, if your not careful. Just change it.\nThe search retrieves granules ingested during the last n minutes. A file in your local data dir file that tracks updates to your data directory, if one file exists. The CMR Search falls back on the ten minute window if not.\n\n#timestamp = (datetime.utcnow()-timedelta(minutes=mins)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n#timestamp\n\nThis cell will replace the timestamp above with the one read from the .update file in the data directory, if it exists.\n\nif not isdir(data):\n print(f\"NOTE: Making new data directory at '{data}'. (This is the first run.)\")\n makedirs(data)\n#else:\n# try:\n# with open(f\"{data}/.update\", \"r\") as f:\n# timestamp = f.read()\n# except FileNotFoundError:\n# print(\"WARN: No .update in the data directory. (Is this the first run?)\")\n# else:\n# print(f\"NOTE: .update found in the data directory. (The last run was at {timestamp}.)\")\n\nNOTE: Making new data directory at 'resources/trackcycle'. (This is the first run.)\n\n\nThere are several ways to query for CMR updates that occured during a given timeframe. Read on in the CMR Search documentation:\n\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-new-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-revised-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-production-date (Granules)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-created-at (Granules)\n\nThe created_at parameter works for our purposes. It’s a granule search parameter that returns the records ingested since the input timestamp.\n\nparams = {\n 'scroll': \"true\",\n 'page_size': 2000,\n 'sort_key': \"-start_date\",\n 'collection_concept_id': ccid, \n #'created_at': timestamp,\n # Limit results to granules matching cycle, pass numbers:\n 'cycle': trackcycle,\n 'passes[0][pass]': trackpass,\n}\n\nparams\n\n{'scroll': 'true',\n 'page_size': 2000,\n 'sort_key': '-start_date',\n 'collection_concept_id': 'C1968980576-POCLOUD',\n 'cycle': 25,\n 'passes[0][pass]': 1}\n\n\nGet the query parameters as a string and then the complete search url:\n\nquery = urlencode(params)\nurl = f\"https://{cmr}/search/granules.umm_json?{query}\"\nprint(url)\n\nhttps://cmr.earthdata.nasa.gov/search/granules.umm_json?scroll=true&page_size=2000&sort_key=-start_date&collection_concept_id=C1968980576-POCLOUD&cycle=25&passes%5B0%5D%5Bpass%5D=1\n\n\nDownload the granule records that match our search parameters.\n\nwith urlopen(url) as f:\n results = loads(f.read().decode())\n\nprint(f\"{results['hits']} granules results for '{ccid}' cycle '{trackcycle}' and pass '{trackpass}'.\")\n\n1 granules results for 'C1968980576-POCLOUD' cycle '25' and pass '1'.\n\n\nNeatly print the first granule’s data for reference (assuming at least one was returned).\n\nif len(results['items'])>0:\n #print(dumps(results['items'][0], indent=2)) #print whole record\n print(dumps(results['items'][0]['umm'][\"RelatedUrls\"], indent=2)) #print associated URLs\n \n # Also, replace timestamp with one corresponding to time of the search.\n #timestamp = datetime.utcnow().strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n[\n {\n \"URL\": \"s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Type\": \"GET DATA VIA DIRECT ACCESS\",\n \"Description\": \"This link provides direct download access via S3 to the granule.\"\n },\n {\n \"URL\": \"s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Type\": \"GET DATA VIA DIRECT ACCESS\",\n \"Description\": \"This link provides direct download access via S3 to the granule.\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\",\n \"Type\": \"GET DATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.xfdumanifest.xml\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.xfdumanifest.xml\",\n \"Type\": \"EXTENDED METADATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Description\": \"Download S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.bufr.bin\",\n \"Type\": \"GET DATA\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/s3credentials\",\n \"Description\": \"api endpoint to retrieve temporary credentials valid for same-region direct s3 access\",\n \"Type\": \"VIEW RELATED INFORMATION\"\n },\n {\n \"URL\": \"https://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02\",\n \"Type\": \"USE SERVICE API\",\n \"Subtype\": \"OPENDAP DATA\",\n \"Description\": \"OPeNDAP request URL\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.ssha.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.swh_ocean.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.sea_state_bias.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.atm_cor_sig0.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n },\n {\n \"URL\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.data_01.ku.sig0_ocean.png\",\n \"Type\": \"GET RELATED VISUALIZATION\",\n \"Subtype\": \"DIRECT DOWNLOAD\",\n \"MimeType\": \"image/png\"\n }\n]\n\n\nThe link for http access denoted by \"Type\": \"GET DATA\" in the list of RelatedUrls.\nGrab the download URL, but do it in a way that’ll work for search results returning any number of granule records:\n\ndownloads = []\n\nfor l in results['items'][0]['umm'][\"RelatedUrls\"]:\n #if the link starts with the following, it is the download link we want\n if 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/' in l['URL']: \n #we want the .nc file\n if '.nc' in l['URL']:\n downloads.append(l['URL'])\ndownloads\n\n['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc']\n\n\nFinish by downloading the files to the data directory in a loop. Overwrite .update with a new timestamp on success.\n\nfor f in downloads:\n try:\n earthaccess.download([f[0]], f\"{data}/{basename(f)}\")\n except Exception as e:\n print(f\"[{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n else:\n print(f\"[{datetime.now()}] SUCCESS: {f}\")\n\n\n\n\nError while downloading the file h\nTraceback (most recent call last):\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/earthaccess/store.py\", line 483, in _download_file\n with session.get(\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 600, in get\n return self.request(\"GET\", url, **kwargs)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 573, in request\n prep = self.prepare_request(req)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/sessions.py\", line 484, in prepare_request\n p.prepare(\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/models.py\", line 368, in prepare\n self.prepare_url(url, params)\n File \"/Users/walschots/anaconda3/lib/python3.10/site-packages/requests/models.py\", line 439, in prepare_url\n raise MissingSchema(\nrequests.exceptions.MissingSchema: Invalid URL 'h': No scheme supplied. Perhaps you meant http://h?\n\n\n\n\n\n\n\n\n\n[2023-08-02 14:11:23.926892] SUCCESS: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc\n\n\nIf there were updates to the local time series during this run and no exceptions were raised during the download loop, then overwrite the timestamp file that tracks updates to the data folder (resources/nrt/.update):\n\n#if len(results['items'])>0:\n# with open(f\"{data}/.update\", \"w\") as f:\n# f.write(timestamp)", "crumbs": [ "Tutorials", - "Science Data Stories", - "SST Cross Validation" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access by Cycle/Pass" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#summary", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#summary", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "Summary", - "text": "Summary\nA previous notebook covered basic use of Dask for parallel computing with Earthdata. This included the case where we have a function we wish to replicate over many files, represented by the schematic below.\n\nIn the previous notebook, a toy example was used to demonstrate this basic functionality using a local cluster and dask.delayed(). In this notebook, the workflow is used on a more complex analysis.\nThe analysis will generate global maps of spatial correlation between sea surface temperature (SST) and sea surface height (SSH). The analysis uses PO.DAAC hosted, gridded SSH and SST data sets:\n\nMEaSUREs gridded SSH Version 2205: 0.17° x 0.17° resolution, global map, one file per 5-days, https://doi.org/10.5067/SLREF-CDRV3\nGHRSST Level 4 MW_OI Global Foundation SST, V5.0: 0.25° x 0.25° resolution, global map, daily files, https://doi.org/10.5067/GHMWO-4FR05\n\nThe time period of overlap between these data sets is 1998 – 2020, with 1808 days in total overlapping. For each pair of SST, SSH files on these days, compute a map of spatial correlation between them, where the following method is used at each gridpoint:\n\nThis notebook will first define the functions to read in the data and perform the computations, then test them on a single file. Next a smaller parallel computation will be performed on all pairs of files in 2018 (73 pairs in total), reducing what would have otherwise taken hours to minutes instead. Finally, the last section presents the code used to perform the full computation on all 1808 pairs of files at 0.25 degree resolution.", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#processing-a-large-data-set-in-chunks-using-coiled.cluster-example-use-for-an-sst-seasonal-cycle-analysis", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#processing-a-large-data-set-in-chunks-using-coiled.cluster-example-use-for-an-sst-seasonal-cycle-analysis", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Processing a Large Data Set in Chunks Using coiled.cluster(), Example Use for an SST Seasonal Cycle Analysis", + "text": "Processing a Large Data Set in Chunks Using coiled.cluster(), Example Use for an SST Seasonal Cycle Analysis\n\nAuthors: Dean Henze, NASA JPL PO.DAAC\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "Requirements, prerequisite knowledge, learning outcomes", - "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCompute environment: This notebook can technically be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server). However, running in the cloud is recommended, since it is unlikely that a laptop has the power to replicate the compute times we quote here. If running in a local environment, the number of workers spun up Section 4 will likely need to be decreased.\nVM type: For running in AWS (recommended), we used C7i instances, which are “compute-optimized” VM’s well-suited to the particular computations performed here (more on this later). Since the cost per hour of these instances go up in size, we recommend the following workflow to explore this notebook.\n\nStart by running Sections 1 - 3 in a low cost c7i.2xlarge instance (fractions of a $1 per hour).\nParallel computations start in Section 4. For this, we ran Sections 1-4 with a c7i.24xlarge. At the time this notebook was written, this VM type took 7-10 minutes to run the computations, and cost ~$4/hr. You can run a smaller, less expensive VM type, but will need to change one line of code in Section 4.\nFor Optional Section 5, we ran using a c7i.24xlarge, although you could try running it with a c7i.48xlarge (double the vCPUs and double the cost).\n\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use dask.delayed() with a local cluster on an analysis mirroring what someone might want to do in a real-world setting. As such, you will get better insight on how to apply this workflow to your own analysis. Further, this notebook touches briefly on choosing VM types, which may be many user’s first introduction to the topic.", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#summary", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#summary", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Summary", + "text": "Summary\nPrevious notebooks have covered the use of Dask and parallel computing applied to the type of tasks in the schematic below, where we have a function which needs to work on a large data set as a whole. This could e.g. because the function works on some or all of the data from each of the files, so we can’t just work on each file independently like in the function replication example.\n \nIn a previous notebook, a toy example was used to demonstrate this basic functionality using a local dask cluster and Xarray built-in functions to work on the data set in chunks. In this notebook, that workflow is expanded to a more complex analysis. Parallel computations are performed via the third party software/package Coiled. In short, Coiled allows us to spin up AWS virtual machines (EC2 instances) and create a distributed cluster out of them, all with a few lines of Python from within a notebook. You will need a Coiled account, but once set up, you can run this notebook entirely from your laptop while the parallel computation portion will be run on the distributed cluster in AWS.\n\nAnalysis: Mean Seasonal Cycle of SST Anomalies\nThe analysis will generate the mean seasonal cycle of sea surface temperature (SST) at each gridpoint in a region of the west coast of the U.S.A. The analysis uses a PO.DAAC hosted gridded global SST data set:\n\nGHRSST Level 4 MUR Global Foundation SST Analysis, V4.1: 0.01° x 0.01° resolution, global map, daily files, https://doi.org/10.5067/GHGMR-4FJ04\n\nThe analysis will use files over the first decade of the time record. The following procedure is used to generate seasonal cycles:\n\nIn Section 1 of this notebook, the first decade of MUR files are located on PO.DAAC using the earthaccess package, then a file is inspected and memory requirements for this data set are assessed. In Section 2, a “medium-sized” computation is performed, deriving the mean seasonal cycle for the files thinned out to once per week (570 files, 1.3 TB of uncompressed data) for about \\(\\$\\) 0.20. In Section 3, we perform the computation on all the files in the first decade, ~4000 files, ~10 TB of uncompressed data, for about \\(\\$\\) 3.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#import-packages", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#import-packages", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "Import packages", - "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.0 earthaccess==0.9.0 matplotlib==3.8.0 jupyterlab\nor with conda:\nconda install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.0 earthaccess==0.9.0 matplotlib==3.8.0 jupyterlab\nNote that the versions are important, specifially for the science / math packages - when running newer versions of xarray, scipy, and numpy, we got some strange results.\n\n# Built in packages\nimport time\nimport sys\nimport os\nimport shutil\n\n# Math / science packages\nimport xarray as xr\nimport numpy as np\nfrom scipy.optimize import leastsq\n\n# Plotting packages\nfrom matplotlib import pylab as plt\n%matplotlib inline\n\n# Cloud / parallel computing packages\nimport earthaccess\nimport dask\nfrom dask.distributed import Client\nfrom dask import delayed\nimport dask.array as da\nimport multiprocessing", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Requirements, prerequisite knowledge, learning outcomes", + "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCoiled account: Create a coiled account (free to sign up), and connect it to an AWS account. For more information on Coiled, setting up an account, and connecting it to an AWS account, see their website https://www.coiled.io.\nCompute environment: This notebook can be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server), but the data loading step currently works substantially faster in the cloud. In both cases, the parallel computations are still sent to VM’s in the cloud.\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Coiled with a distributed cluster to analyze a large data set in chunks, naturally parallelizing Xarray built in functions on the cluster. You will get better insight on how to apply this workflow to your own analysis.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#define-functions", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#define-functions", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "1. Define functions", - "text": "1. Define functions\nThe main function implemented is spatial_corrmap(), which will return the map of correlations as a 2D array. The other functions below are called by spatial_corrmap().\n\ndef load_sst_ssh(gran_ssh, gran_sst):\n \"\"\"\n Return SLA and SST variables for a single file each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections, respectively, returned as xarray.DataArray's. Input args are granule info \n (earthaccess.results.DataGranule object's) for each collection. \n \"\"\"\n earthaccess.login(strategy=\"environment\") # Confirm credentials are current\n \n # Get SLA and SST variables, loaded fully into local memory:\n ssh = xr.load_dataset(earthaccess.open([gran_ssh], provider='POCLOUD')[0])['SLA'][0,...]\n sst = xr.load_dataset(earthaccess.open([gran_sst], provider='POCLOUD')[0])['analysed_sst'][0,...]\n\n return ssh, sst\n\n\ndef spatialcorr(x, y, p1, p2):\n \"\"\"\n Correlation between two 2D variables p1(x, y), p2(x, y), over the domain (x, y). Correlation is \n computed between the anomalies of p1, p2, where anomalies for each variables are the deviations \n from respective linear 2D surface fits.\n \"\"\"\n # Compute anomalies:\n ssha, _ = anomalies_2Dsurf(x, y, p1) # See function further down.\n ssta, _ = anomalies_2Dsurf(x, y, p2)\n \n # Compute correlation coefficient:\n a, b = ssta.flatten(), ssha.flatten()\n if ( np.nansum(abs(a))==0 ) or ( np.nansum(abs(b))==0 ): \n # For cases with all 0's, the correlation should be 0. Numpy computes this correctly \n # but throws a lot of warnings. So instead, manually append 0.\n return 0\n else:\n return np.nanmean(a*b)/np.sqrt(np.nanvar(a) * np.nanvar(b))\n\n\ndef anomalies_2Dsurf(x, y, p):\n \"\"\"\n Return anomalies for a 2D variable. Anomalies are computed as the deviations of each \n point from a bi-linear 2D surface fit to the data (using scipy).\n \n Inputs\n ------\n x, y: 1D array-like.\n Independent vars (likely the lon, lat coordinates).\n p: 2D array-like, of shape (len(y), len(x)).\n Dependent variable. 2D surface fit will be to p(x, y).\n \n Returns\n ------\n va, vm: 2D NumPy arrays\n Anomalies (va) and mean surface fit (vm).\n \"\"\"\n # Function for a 2D surface:\n def surface(c,x0,y0): # Takes independent vars and poly coefficients\n a,b,c=c\n return a + b*x0 + c*y0\n # Function for the difference between data and the computed surface:\n def err(c,x0,y0,p): # Takes independent/dependent vars and poly coefficients\n a,b,c=c\n return p - (a + b*x0 + c*y0 )\n\n\n # Prep arrays and remove NAN's:\n xx, yy = np.meshgrid(x, y)\n xf, yf, pf = xx.flatten(), yy.flatten(), p.flatten()\n msk=~np.isnan(pf)\n xf, yf, pf = xf[msk], yf[msk], pf[msk]\n\n \n # Initial values of polynomial coefficients to start fitting algorithm off with:\n dpdx=(pf.max()-pf.min())/(xf.max()-xf.min())\n dpdy=(pf.max()-pf.min())/(yf.max()-yf.min())\n c = [pf.mean(),dpdx,dpdy]\n\n \n # Fit and compute anomalies:\n coef = leastsq(err,c,args=(xf,yf,pf))[0]\n vm = surface(coef, xx, yy) # mean surface\n va = p - vm # anomalies\n return va, vm\n\n\ndef spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Get a 2D map of SSH-SST spatial correlation coefficients, for one each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections. At each gridpoint, the spatial correlation is computed over a lat, lon window of \n size 2*lat_halfwin x 2*lon_halfwin. Correlation is computed from the SSH, SST anomalies, \n which are computed in turn as the deviations from a fitted 2D surface over the window.\n \n Inputs\n ------\n grans: 2-tuple of earthaccess.results.DataGranule objects\n Metadata for the SSH, SST files. These objects contain https and S3 locations.\n lat_halfwin, lon_halfwin: floats\n Half window size in degrees for latitude and longitude dimensions, respectively.\n lats, lons: None or 1D array-like\n Latitude, longitude gridpoints at which to compute the correlations. \n If None, will use the SSH grid.\n f_notnull: float between 0-1 (default = 0.5)\n Threshold fraction of non-NAN values in a window, otherwise the correlation is not computed, \n and NAN is returned for that grid point. For edge cases, 'ghost' elements are counted.\n\n Returns\n ------\n coef: 2D numpy array\n Spatial correlation coefficients.\n \n lats, lons: 1D numpy arrays.\n Latitudes and longitudes creating the 2D grid that 'coef' was calculated on.\n \"\"\" \n # Load datafiles, convert SST longitude to (0,360), and interpolate SST to SSH grid: \n ssh, sst = load_sst_ssh(*grans)\n sst = sst.roll(lon=len(sst['lon'])//2)\n sst['lon'] = sst['lon']+180\n sst = sst.interp(lon=ssh['Longitude'], lat=ssh['Latitude'])\n\n \n # Compute windows size and threshold number of non-nan points:\n dlat = (ssh['Latitude'][1]-ssh['Latitude'][0]).item()\n dlon = (ssh['Longitude'][1]-ssh['Longitude'][0]).item()\n nx_win = 2*round(lon_halfwin/dlon)\n ny_win = 2*round(lat_halfwin/dlat)\n n_thresh = nx_win*ny_win*f_notnull\n\n\n # Some prep work for efficient identification of windows where number of non-nan's < threshold:\n # Map of booleans for sst*ssh==np.nan\n notnul = (sst*ssh).notnull() \n # Combine map and sst, ssh data into single Dataset for more efficient indexing:\n notnul = notnul.rename(\"notnul\") # Needs a name to merge\n mergeddata = xr.merge([ssh, sst, notnul], compat=\"equals\")\n \n\n # Compute spatial correlations over whole map:\n coef = []\n \n if lats is None:\n lats = ssh['Latitude'].data\n lons = ssh['Longitude'].data\n \n for lat_cen in lats:\n for lon_cen in lons:\n\n # Create window for both sst and ssh with xr.sel:\n lat_bottom = lat_cen - lat_halfwin\n lat_top = lat_cen + lat_halfwin\n lon_left = lon_cen - lon_halfwin\n lon_right = lon_cen + lon_halfwin\n data_win = mergeddata.sel(\n Longitude=slice(lon_left, lon_right), \n Latitude=slice(lat_bottom, lat_top)\n )\n \n # If number of non-nan values in window is less than threshold \n # value, append np.nan, else compute correlation coefficient:\n n_notnul = data_win[\"notnul\"].sum().item()\n if n_notnul < n_thresh:\n coef.append(np.nan)\n else:\n c = spatialcorr(\n data_win['Longitude'], data_win['Latitude'], \n data_win['SLA'].data, data_win['analysed_sst'].data\n )\n coef.append(c)\n \n return np.array(coef).reshape((len(lats), len(lons))), np.array(lats), np.array(lons)", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#import-packages", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#import-packages", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Import packages", + "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\n\n# NASA data access packages:\nimport earthaccess\n\n# Analysis packages:\nimport xarray as xr\nimport numpy as np \n\n# Visualization packages:\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Cloud computing / dask packages:\nimport coiled\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f89550bbfb0>", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "2. Get all matching pairs of SSH, SST files for 2018", - "text": "2. Get all matching pairs of SSH, SST files for 2018\nThe spatial_corrmap() function takes as one of its arguments a 2-tuple of earthaccess.results.DataGranule objects, one each for SSH and SST (recall that these are the objects returned from a call to earthaccess.search_data()). This section will retrieve pairs of these objects for all SSH, SST data in 2018 on days where the data sets overlap.\n\nearthaccess.login()\n\n\n## Granule info for all files in 2018:\ndt2018 = (\"2018-01-01\", \"2018-12-31\")\ngrans_ssh = earthaccess.search_data(\n short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\", \n temporal=dt2018\n )\ngrans_sst = earthaccess.search_data(\n short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\", \n temporal=dt2018\n )\n\nGranules found: 73\nGranules found: 365\n\n\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\nprint(' SSH file days: ', dates_ssh[:8], '\\n', 'SST file days: ', dates_sst[:8])\n\n SSH file days: ['20180102', '20180107', '20180112', '20180117', '20180122', '20180127', '20180201', '20180206'] \n SST file days: ['20180101', '20180102', '20180103', '20180104', '20180105', '20180106', '20180107', '20180108']\n\n\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nThe result is two lists of earthaccess.results.DataGranule objects, where the ith element of the SSH, SST lists contain granule info for the respective data sets on the same day:\n\nprint(grans_ssh_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_ssh_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_ssh_analyze[:4]])\nprint(grans_sst_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_sst_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_sst_analyze[:4]])\n\nSEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']\nMW_OI-REMSS-L4-GLOB-v5.0 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file", + "text": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file\nWe use earthaccess to find metadata and endpoints for the files.\n\nearthaccess.login() # Login with your credentials\n\nEnter your Earthdata Login username: deanh808\nEnter your Earthdata password: ········\n\n\n<earthaccess.auth.Auth at 0x7f897ede49b0>\n\n\n\ndatainfo = earthaccess.search_data(\n short_name=\"MUR-JPL-L4-GLOB-v4.1\",\n cloud_hosted=True,\n temporal=(\"2002-01-01\", \"2013-05-01\"),\n )\n\nGranules found: 3988\n\n\n\nOpen and inspect a file\nOpen a file and plot the SST data in the region for our analysis.\n\nfileobj_test = earthaccess.open([datainfo[0]])[0] # Generate file-like objects compatible with Xarray\nsst_test = xr.open_dataset(fileobj_test)['analysed_sst']\nsst_test\n\nOpening 1 granules, approx size: 0.32 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\n[647964000 values with dtype=float32]\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000...[647964000 values with dtype=float32]Coordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00'], dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n# Region to perform analysis over:\nlat_region = (30, 45)\nlon_region = (-135, -105)\n\n\n## Plot SST in analysis region:\nfig = plt.figure()\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(cmap='RdYlBu_r')\n\n\n\n\n\n\n\n\n\n\nMemory considerations\nDemonstrating that these are fairly large files, especially uncompressed, at the time this notebook was written:\n\nprint(\"Disk size of one file =\", datainfo[0]['size'], \"MB.\")\n\nDisk size of one file = 332.3598403930664 MB.\n\n\n\nprint(\"Size in-memory of the SST variable once uncompressed =\", sst_test.nbytes/10**9, \"GB.\")\n\nSize in-memory of the SST variable once uncompressed = 2.591856 GB.\n\n\nAt ~2.5 GB uncompressed, and ~4000 MUR files at the time this notebook was written, we are dealing with a ~10 TB data set.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "3. Test the computation on a pair of files, output on a coarse resolution grid", - "text": "3. Test the computation on a pair of files, output on a coarse resolution grid\nTo verify the functions work, test them on the first pair of files. To reduce computation time, we compute them for a 2 degree x 2 degree output grid for now.\n\n# Compute spatial correlation map for 2 degree x 2 degree resolution and time it:\nt1 = time.time()\n\nlats = np.arange(-80, 80, 2)\nlons = np.arange(0, 359, 2)\ncoef, lats, lons = spatial_corrmap((grans_ssh_analyze[0], grans_sst_analyze[0]), 3, 3, lats=lats, lons=lons, f_notnull=0.5)\n\nt2 = time.time()\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds.\")\n\nOpening 1 granules, approx size: 0.01 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nOpening 1 granules, approx size: 0.0 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nTotal computation time = 21.34 seconds.\n\n\n\n## Plot the results:\nplt.figure(figsize=(8,3))\nplt.contourf(lons, lats, coef, cmap='RdBu_r')\nplt.colorbar()\n\n\n\n\n\n\n\n\n\nEstimation of computation time for higher resolution output and more files\nThe computation for one file computed on a 2 x 2 degree grid takes:\n\nprint(str(comptime) + \" seconds.\")\n\n18.88 seconds.\n\n\nthen assuming linear scaling with number of gridpoints (reasonable since our top level function is a big for-loop), processing one file at 0.5 x 0.5 degree resolution would take:\n\neta_fullres_seconds = comptime*(2/0.5)*(2/0.5)\neta_fullres_minutes = round(eta_fullres_seconds/60)\nprint(str(eta_fullres_minutes) + \" minutes.\")\n\n5 minutes.\n\n\nand for the record over all of 2018 would take:\n\neta_allfiles_hrs = round( (len(grans_ssh)*eta_fullres_minutes)/60, 1 )\neta_allfiles_days = round(eta_allfiles_hrs/24, 2)\nprint(str(len(grans_ssh)) + \" granules for 2018.\")\nprint(str(eta_allfiles_hrs) + \" hours = \" + str(eta_allfiles_days) + \" days.\")\n\n73 granules for 2018.\n6.1 hours = 0.25 days.", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "2. Seasonal cycle at weekly temporal resolution", + "text": "2. Seasonal cycle at weekly temporal resolution\nFor this “medium-sized” computation, the decade time record is thinned out to one file per week. This will be ~200 GB on disk, and ~1.3 TB uncompressed in memory. Using the parallel computing methods below, we were able to accomplish this in about 4 minutes for \\$0.20 (1 minute for opening the data set and 3 minutes for computations). For the size of this computation, we obtained good results with 25 compute-optimized c7g.large VMs. For the larger computation in Section 3, we switch to memory-optimized VMs.\n\n# Thin to weekly temporal resolution:\ndatainfo_thinned = [datainfo[i] for i in range(len(datainfo)) if i%7==0]\n\n# Confirm we have about a decade of files at weekly resolution:\nprint(\"First and last file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[-1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(\"\\nFirst and second file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\n\nFirst and last file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2013-04-26T21:00:00.000Z\n\nFirst and second file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2002-06-07T21:00:00.000Z\n\n\nSince Xarray built-in functions are used to both open and process the data, the workflow is to start up a cluster, open the files into a single dataset with chunking, and then Xarray function calls will naturally be run in parallel on the cluster.\n\nfileobjs = earthaccess.open(datainfo_thinned) # Generate file objects from the endpoints which are compatible with Xarray\n\nOpening 570 granules, approx size: 190.08 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nCPU times: user 1.03 s, sys: 70.6 ms, total: 1.1 s\nWall time: 1.55 s\n\n\n\ncluster = coiled.Cluster(\n n_workers=25, \n region=\"us-west-2\", \n worker_vm_types=\"c7g.large\", # or can try \"m7a.medium\"\n scheduler_vm_types=\"c7g.large\" # or can try \"m7a.medium\"\n ) \nclient = cluster.get_client()\n\n\n\n\n\n\n\n╭────────────────────────── Not Synced with Cluster ───────────────────────────╮\n│ ╷ ╷ │\n│ Package │ Error │ Risk │\n│ ╶───────────┼────────────────────────────────────────────────────┼─────────╴ │\n│ libcxxabi │ libcxxabi~=17.0.6 has no install candidate for │ Warning │\n│ │ Python 3.12 linux-aarch64 on conda-forge │ │\n│ ╵ ╵ │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n\n\n\n\n\n\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={'lat': 6000, 'lon': 6000, 'time': 1})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of the computations\n # operate along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 200})\nsst\n\nCPU times: user 9.23 s, sys: 564 ms, total: 9.79 s\nWall time: 51.2 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 570, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(570, 17999, 36000), dtype=float32, chunksize=(200, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-04-27T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 570lat: 17999lon: 36000dask.array<chunksize=(200, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.34 TiB\n190.73 MiB\n\n\nShape\n(570, 17999, 36000)\n(200, 500, 500)\n\n\nDask graph\n7776 chunks in 1143 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 570\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-04-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-08T09:00:00.000000000',\n '2002-06-15T09:00:00.000000000', ..., '2013-04-13T09:00:00.000000000',\n '2013-04-20T09:00:00.000000000', '2013-04-27T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-08 09:00:00',\n '2002-06-15 09:00:00', '2002-06-22 09:00:00',\n '2002-06-29 09:00:00', '2002-07-06 09:00:00',\n '2002-07-13 09:00:00', '2002-07-20 09:00:00',\n '2002-07-27 09:00:00', '2002-08-03 09:00:00',\n ...\n '2013-02-23 09:00:00', '2013-03-02 09:00:00',\n '2013-03-09 09:00:00', '2013-03-16 09:00:00',\n '2013-03-23 09:00:00', '2013-03-30 09:00:00',\n '2013-04-06 09:00:00', '2013-04-13 09:00:00',\n '2013-04-20 09:00:00', '2013-04-27 09:00:00'],\n dtype='datetime64[ns]', name='time', length=570, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\ncluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 32.08 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 2.25 s, sys: 559 ms, total: 2.81 s\nWall time: 3min 54s\n\n\n\nclient.shutdown()\ncluster.shutdown()\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#parallel-computations-with-dask", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#parallel-computations-with-dask", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "4. Parallel computations with Dask", - "text": "4. Parallel computations with Dask\nSections 1 and 2 need to be run prior to this.\nThe previous section showed that analyzing a year’s worth of data at 0.5 x 0.5 degree output resolution would take hours. In this section, we use dask.delayed() and a local cluster to complete this task in 7 - 20 minutes, depending on the VM type used.\nFirst, define a wrapper function which calls spatial_corrmap() for a pair of SSH, SST files and saves the output to a netCDF file. We will parallelize this function rather than spatial_corrmap():\n\ndef corrmap_tofile(grans, dir_results=\"./\", lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and saves the results to a netCDF file.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n corrmap_da = xr.DataArray(\n data=coef, dims=[\"lat\", \"lon\"], \n coords=dict(lon=lons, lat=lats), \n name='corr_ssh_sst'\n )\n corrmap_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n return\n\nNext, some prep work:\n\n# All output will be saved to this local directory:\ndir_results = \"results/\"\nos.makedirs(dir_results, exist_ok=True)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80, 0.5)\nlons = np.arange(0, 359, 0.5)\n\nStart up the cluster. We used a c7i.24xlarge EC2 instance type, which has 96 vCPU’s, and therefore we are able to start up 73 workers. If you use a smaller instance type in the C7i series, change the n_workers arg as needed.\n\nclient = Client(n_workers=73, threads_per_worker=1)\nprint(client.cluster)\nprint(client.dashboard_link)\n\nThis block of code will give each worker our EDL credentials (even though we logged in with earthaccess() this is necessary to get creds to each worker):\n\ndef auth_env(auth): # this gets executed on each worker\n os.environ[\"EARTHDATA_USERNAME\"] = auth[\"EARTHDATA_USERNAME\"]\n os.environ[\"EARTHDATA_PASSWORD\"] = auth[\"EARTHDATA_PASSWORD\"]\n \n_ = client.run(auth_env, auth=earthaccess.auth_environ())\n\nthen setup the parallel computations and run! (At the time this notebook was written, earthaccess produces a lot of output each time a file is opened, and so the output from this cell is long):\n\nt1 = time.time()\n\n# Process granules in parallel using Dask:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\ncorrmap_tofile_parallel = delayed(corrmap_tofile)\ntasks = [\n corrmap_tofile_parallel(g2, dir_results=\"results/\", lats=lats, lons=lons, f_notnull=0.5) \n for g2 in grans_2tuples[:]\n ] # Sets up the computations (relatively quick)\n_ = da.compute(*tasks) # Performs the computations (takes most of the time)\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 451.97 seconds = 7.5328333333333335 minutes.\n\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 121, lat: 321, lon: 718)>\ndask.array<concatenate, shape=(121, 321, 718), dtype=float64, chunksize=(1, 321, 718), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.5 1.0 1.5 2.0 ... 356.5 357.0 357.5 358.0 358.5\n * lat (lat) float64 -80.0 -79.5 -79.0 -78.5 -78.0 ... 78.5 79.0 79.5 80.0\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 121lat: 321lon: 718dask.array<chunksize=(1, 321, 718), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n212.77 MiB\n1.76 MiB\n\n\nShape\n(121, 321, 718)\n(1, 321, 718)\n\n\nDask graph\n121 chunks in 666 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 718 321 121\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.5 1.0 ... 357.5 358.0 358.5array([ 0. , 0.5, 1. , ..., 357.5, 358. , 358.5])lat(lat)float64-80.0 -79.5 -79.0 ... 79.5 80.0array([-80. , -79.5, -79. , ..., 79. , 79.5, 80. ])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5,\n ...\n 354.0, 354.5, 355.0, 355.5, 356.0, 356.5, 357.0, 357.5, 358.0, 358.5],\n dtype='float64', name='lon', length=718))latPandasIndexPandasIndex(Index([-80.0, -79.5, -79.0, -78.5, -78.0, -77.5, -77.0, -76.5, -76.0, -75.5,\n ...\n 75.5, 76.0, 76.5, 77.0, 77.5, 78.0, 78.5, 79.0, 79.5, 80.0],\n dtype='float64', name='lat', length=321))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "3. Seasonal cycle for full record (daily resolution)", + "text": "3. Seasonal cycle for full record (daily resolution)\nSection 1 needs to be run prior to this one, but Section 2 can be skipped.\nIn this section, all files in the decade are processed. This will be ~4000 files, ~1.3 TB on disk, and ~10 TB for the SST varaible once uncompressed in memory. Using the parallel computing methods below (with 40 r7g.xlarge VMs), we were able to accomplish this in about 20 minutes for \\$3 (5 minutes for opening the data set and 15 minutes for computations).\nFor this computation, memory-optimized VMs were chosen (they have high memory per CPU), following the example Coiled post here. In short, it is more efficient to create larger chunks and have VMs which can handle the larger chunks.\n\nfileobjs = earthaccess.open(datainfo) # Generate file-like objects compatible with Xarray\n\nOpening 3988 granules, approx size: 1330.13 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\ncluster = coiled.Cluster(\n n_workers=40, \n region=\"us-west-2\", \n worker_vm_types=\"r7g.xlarge\",\n scheduler_vm_types=\"r7g.xlarge\"\n ) \nclient = cluster.get_client()\n\n\n\n\n\n\n\n╭────────────────────────── Not Synced with Cluster ───────────────────────────╮\n│ ╷ ╷ │\n│ Package │ Error │ Risk │\n│ ╶───────────┼────────────────────────────────────────────────────┼─────────╴ │\n│ libcxxabi │ libcxxabi~=17.0.6 has no install candidate for │ Warning │\n│ │ Python 3.12 linux-aarch64 on conda-forge │ │\n│ ╵ ╵ │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n\n\n\n\n\n\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={'lat': 6000, 'lon': 6000, 'time': 1})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of our computations are\n # operating along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 400})\nsst\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 18.07 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 55.3 s, sys: 3.72 s, total: 59 s\nWall time: 5min 1s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 3988, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(3988, 17999, 36000), dtype=float32, chunksize=(400, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-05-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 3988lat: 17999lon: 36000dask.array<chunksize=(400, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.40 TiB\n381.47 MiB\n\n\nShape\n(3988, 17999, 36000)\n(400, 500, 500)\n\n\nDask graph\n25920 chunks in 7980 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 3988\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-05-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-02T09:00:00.000000000',\n '2002-06-03T09:00:00.000000000', ..., '2013-04-29T09:00:00.000000000',\n '2013-04-30T09:00:00.000000000', '2013-05-01T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-02 09:00:00',\n '2002-06-03 09:00:00', '2002-06-04 09:00:00',\n '2002-06-05 09:00:00', '2002-06-06 09:00:00',\n '2002-06-07 09:00:00', '2002-06-08 09:00:00',\n '2002-06-09 09:00:00', '2002-06-10 09:00:00',\n ...\n '2013-04-22 09:00:00', '2013-04-23 09:00:00',\n '2013-04-24 09:00:00', '2013-04-25 09:00:00',\n '2013-04-26 09:00:00', '2013-04-27 09:00:00',\n '2013-04-28 09:00:00', '2013-04-29 09:00:00',\n '2013-04-30 09:00:00', '2013-05-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=3988, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\ncluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 225.00 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 11.1 s, sys: 1.05 s, total: 12.1 s\nWall time: 14min 16s\n\n\n\nclient.shutdown()\ncluster.shutdown()\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#other-notes", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#other-notes", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "Other notes", - "text": "Other notes\n\nWhy C7i instance types? Notice that the size of our data files are relatively small, about 10 MB per pair of files. Yet, the computations we perform on them are complex enough that it takes ~5-7 minutes per pair of files (and this is only at 0.5 degree output resolution, multiply this by 4x for the 0.25 degree resolution in Section 5!). This type of computation is referred to as “compute limited”, because the limiting factor in the time for completion is churning through the computation itself. Contrast this to e.g. a “memory limited” computation, where perhaps the computation is simple but the size of each file is large (an example would be taking the global average of a MUR 0.01 degree file). As per Amazon’s page describing the different classes of EC2 types, the C7i series are compute optimized, and therefore well suited to this problem. For a given amount of total memory in the VM, we get a lot of high performance processors, and each one can churn through the computations per pair of SST-SSH files. Please take this explanation with a grain of salt. The author is not a computer scientist and is learning these complex topics himself!", + "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#additional-notes", + "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#additional-notes", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "4. Additional Notes", + "text": "4. Additional Notes\n\nTo compute the mean seasonal cycle, Xarray’s built in groupby() function is used to group the data by month of the year. As per this Xarray docs page, one can try using the flox package to speed up this groupby operation.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Coiled Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", - "href": "notebooks/Advanced_cloud/dask_delayed_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", - "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", - "section": "5. Optional: Parallel computation on full record at 0.25 degree resolution", - "text": "5. Optional: Parallel computation on full record at 0.25 degree resolution\nOnly Section 1 needs to be run prior to this. Sections 2-4 can be skipped.\nThis section mirrors the workflow of Section 4, but processes all 1808 pairs of files, spanning a little over two decades, at higher resolution. To get an estimate of how long this would take without parallel computing, you can re-run section 3 but replace a value of 0.5 for the higher_res variable with 0.25 (in the part where we estimate comp times). Trying this on a few machines, we get that it would take anywhere from 21 to 34 hours to process the record over a single year, which means for 22 years it would take 19 to 31 days to complete the entire record. When we used this code to run the computation in parallel on a c7i.24xlarge instance, computation took us instead ~10.5 hours and cost ~$45, obtaining the following mean map for the full record:\n\n\n\nimage.png\n\n\nFirst, we duplicate most of the code in Section 2, this time getting granule info objects for the entire record:\n\nearthaccess.login()\n\n## Granule info for all files in both collections:\ngrans_ssh = earthaccess.search_data(short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\")\ngrans_sst = earthaccess.search_data(short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\")\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nGranules found: 2207\nGranules found: 9039\n\n\nSame wrapper function as in section 4:\n\ndef corrmap_tofile(grans, dir_results=\"./\", lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and saves the results to a netCDF file.\n \"\"\"\n coef, lats, lons = spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=lats, lons=lons, f_notnull=0.5)\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n corrmap_da = xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n corrmap_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n return\n\nSome prep work:\n\n# Re-create the local directory to store results in:\ndir_results = \"results/\"\nif os.path.exists(dir_results) and os.path.isdir(dir_results):\n shutil.rmtree(dir_results)\nos.makedirs(dir_results)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80.1, 0.25)\nlons = np.arange(0, 360, 0.25)\n\nDefine function that will pass each worker our EDL credentials:\n\ndef auth_env(auth): # this gets executed on each worker\n os.environ[\"EARTHDATA_USERNAME\"] = auth[\"EARTHDATA_USERNAME\"]\n os.environ[\"EARTHDATA_PASSWORD\"] = auth[\"EARTHDATA_PASSWORD\"]\n\n\nSlightly altered method of setting up the parallel computations\nIn theory, we would like to have the simplest parallel workflow of: 1. Start up cluster 2. Map all of our file pairs to the cluster workers\nAnd in fact this is how we did it in Section 4. However, we found when processing the full record that as the workers complete more of the file pairs, the computation time for each pair is progressively longer. From the error messages, we think this may have something to do with memory usage and garbage collection. In short, a fraction of the VM memory is not released by each worker after they finish a pair of files, and our guess is this build up over 100’s of files has a performance impact.\nTo get around this, we use the follwing workflow: 1. Split the list of file-pairs into “batches” 2. In a for-loop: >* Start a new cluster >* Map a file-pairs for one of the batches to the cluster workers >* Close the cluster\nWhile less elegant, we find that is does keep the computation times more consistent throughout the 1808 file-pairs.\n\n## Nice to check how many CPU's are on this machine before setting worker number:\nprint(multiprocessing.cpu_count())\n\n96\n\n\n\n## Create list of integers which will be start/end indexes for each file batch:\nn_workers=96\nn_batches = int(np.ceil(len(grans_ssh_analyze)/n_workers))\ni_batches = [n_workers*i for i in (range(n_batches+1))]\n\nSetup parallel computations and run (At the time this notebook was written, earthaccess produces a lot of output each time a file is opened, and so the output from this cell is long):\n\nt1 = time.time()\n\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\n\ndask.config.set({\"distributed.admin.system-monitor.gil.enabled\": False}) # Adjust settings to suppress noisy output when closing cluster\nfor i in range(len(i_batches)-1):\n\n # Start new cluster and pass Earthdata Login creds to each worker:\n client = Client(n_workers=n_workers, threads_per_worker=1)\n print(client.cluster, '\\n', client.dashboard_link)\n _ = client.run(auth_env, auth=earthaccess.auth_environ()) \n \n # Process granules in parallel using Dask:\n corrmap_tofile_parallel = delayed(corrmap_tofile)\n tasks = [\n corrmap_tofile_parallel(g2, dir_results=\"results/\", lats=lats, lons=lons, f_notnull=0.5) \n for g2 in grans_2tuples[i_batches[i]:i_batches[i+1]]\n ] # Sets up the computations (relatively quick)\n _ = da.compute(*tasks) # Performs the computations (takes most of the time)\n\n # Close cluster:\n client.cluster.close()\n client.close()\n print(\"Time elapsed =\", str(round(time.time() - t1)/60), \"minutes.\")\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 37563.47 seconds = 626.0578333333334 minutes.\n\n\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 1808, lat: 641, lon: 1440)>\ndask.array<concatenate, shape=(1808, 641, 1440), dtype=float64, chunksize=(1, 641, 1440), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.25 0.5 0.75 1.0 ... 359.0 359.2 359.5 359.8\n * lat (lat) float64 -80.0 -79.75 -79.5 -79.25 ... 79.25 79.5 79.75 80.0\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 1808lat: 641lon: 1440dask.array<chunksize=(1, 641, 1440), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.43 GiB\n7.04 MiB\n\n\nShape\n(1808, 641, 1440)\n(1, 641, 1440)\n\n\nDask graph\n1808 chunks in 5425 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1440 641 1808\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.25 0.5 ... 359.2 359.5 359.8array([0.0000e+00, 2.5000e-01, 5.0000e-01, ..., 3.5925e+02, 3.5950e+02,\n 3.5975e+02])lat(lat)float64-80.0 -79.75 -79.5 ... 79.75 80.0array([-80. , -79.75, -79.5 , ..., 79.5 , 79.75, 80. ])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0,\n 2.25,\n ...\n 357.5, 357.75, 358.0, 358.25, 358.5, 358.75, 359.0, 359.25, 359.5,\n 359.75],\n dtype='float64', name='lon', length=1440))latPandasIndexPandasIndex(Index([ -80.0, -79.75, -79.5, -79.25, -79.0, -78.75, -78.5, -78.25, -78.0,\n -77.75,\n ...\n 77.75, 78.0, 78.25, 78.5, 78.75, 79.0, 79.25, 79.5, 79.75,\n 80.0],\n dtype='float64', name='lat', length=641))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#processing-a-large-data-set-in-chunks-using-a-dask-local-cluster-example-with-an-sst-seasonal-cycle-analysis", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#processing-a-large-data-set-in-chunks-using-a-dask-local-cluster-example-with-an-sst-seasonal-cycle-analysis", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Processing a Large Data Set in Chunks Using a Dask Local Cluster, Example with an SST Seasonal Cycle Analysis", + "text": "Processing a Large Data Set in Chunks Using a Dask Local Cluster, Example with an SST Seasonal Cycle Analysis\n\nAuthor: Dean Henze, NASA JPL PO.DAAC", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Dask Function Replication Example" + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/basic_dask.html#import-packages", - "href": "notebooks/Advanced_cloud/basic_dask.html#import-packages", - "title": "Basics of Xarray with Dask Parallization for Earth Data", - "section": "Import packages", - "text": "Import packages\n\nimport time\n\nimport earthaccess\nimport xarray as xr\nimport numpy as np\n\nimport dask\nfrom dask.distributed import Client, LocalCluster\nfrom dask import delayed\nimport dask.array as da\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f3e8b374550>", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#summary", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#summary", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Summary", + "text": "Summary\nA previous notebook covered the use of Dask and parallel computing applied to the type of tasks in the schematic below, where we have a function which needs to work on a large data set as a whole. This could e.g. because the function works on some or all of the data from each of the files, so we can’t just work on each file independently like in the function replication example.\n \nIn the previous notebook, a toy example was used to demonstrate this basic functionality using a local dask cluster and Xarray built-in functions to work on the data set in chunks. In this notebook, that workflow is expanded to a more complex analysis. The computation is also repeated on several different VM’s.\n\nAnalysis: Mean Seasonal Cycle of SST Anomalies\nThe analysis will generate the mean seasonal cycle of sea surface temperature (SST) at each gridpoint in a region of the west coast of the U.S.A. The analysis uses a PO.DAAC hosted gridded global SST data set:\n\nGHRSST Level 4 MUR Global Foundation SST Analysis, V4.1: 0.01° x 0.01° resolution, global map, daily files, https://doi.org/10.5067/GHGMR-4FJ04\n\nThe analysis will use files over the first decade of the time record. The following procedure is used to generate seasonal cycles:\n\nIn Section 1 of this notebook, the first decade of MUR files are located on PO.DAAC using the earthaccess package, then a file is inspected and memory requirements for this data set are assessed. In Section 2, a “medium-sized” computation is performed, deriving the mean seasonal cycle for the files thinned out to once per week (570 files, 1.3 TB of uncompressed data) for about \\(\\$\\) 0.10. In Section 3, we perform the computation on all the files in the first decade, roughly 4000 files and 10 TB of uncompressed data, for \\(\\$\\) 3.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "MUR with Dask" + "Advanced Cloud", + "Dask and Coiled", + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/basic_dask.html#other-notes", - "href": "notebooks/Advanced_cloud/basic_dask.html#other-notes", - "title": "Basics of Xarray with Dask Parallization for Earth Data", - "section": "Other notes", - "text": "Other notes\n\nOne convenience of this parallelization method that it doesn’t require code to be restructured much (often times, not at all). E.g. as long as your code can be wrapped into a function, a few additional lines of code can be used to parallelize it.\nFor one’s own applications, figuring out how much memory their processing code requires for a single worker is important to determine how many workers can be spun up with a particular EC2 instance.\nThe authors found that for local clusters, Dask seems to not manage memory optimally. For example, try running the above code with enough workers that each has ~8GB of memory, and see the memory warnings which appear. Nonetheless, the computations will finish successfully.", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Requirements, prerequisite knowledge, learning outcomes", + "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCompute environment: This notebook can technically be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server). However, running in the cloud is recommended, since it is unlikely that a laptop has the power to replicate the compute times we quote here. If running in a local environment, the number of workers spun up Section 4 will likely need to be decreased.\nVM type: For running in AWS (recommended), we used general purpose VM types for Sections 1 and 2, then switched to memory-optimized VM’s for the large computations of Section 3 (more on this later). Since the cost per hour of these instances go up in size, we recommend the following workflow to explore this notebook.\n\nStart by running Section 1 in a lower cost m6i.xlarge instance (fractions of a \\(\\$\\) 1 per hour).\nSection 2 includes the “medium-sized” parallel computations. For this, we ran Sections 1 and 2 on a m7g.8xlarge instance. At the time this notebook was written, this VM type took ~2-3 minutes to run the computations, and cost ~\\(\\$\\) 1.3/hr.\nFor Optional Section 3, we ran using several memory optimized instances, including r7a.32xlarge, r7i.48xlarge, r7iz.16xlarge VMs.\n\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Dask with a local cluster to analyze a large data set in chunks, naturally parallelizing Xarray built in functions on the cluster. You will get better insight on how to apply this workflow to your own analysis.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "MUR with Dask" + "Advanced Cloud", + "Dask and Coiled", + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/basic_dask.html#loading-data-and-chunking", - "href": "notebooks/Advanced_cloud/basic_dask.html#loading-data-and-chunking", - "title": "Basics of Xarray with Dask Parallization for Earth Data", - "section": "3.1 Loading data and chunking", - "text": "3.1 Loading data and chunking\nFirst, load the data for multiple timestamps into one Xarray dataset (the MUR data set is appropriately formatted, so Xarray can combine the data from multiple files along the time dimension):\n\nsstdata = xr.open_mfdataset(fileobjs[:10])\nsstdata['analysed_sst']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 10, lat: 17999, lon: 36000)>\ndask.array<concatenate, shape=(10, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-10T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 10lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n24.14 GiB\n7.99 MiB\n\n\nShape\n(10, 17999, 36000)\n(1, 1023, 2047)\n\n\nDask graph\n3240 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 10\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-01-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nXarray has also chunked the data arrays, which is important for parallel processing. The concept of chunks is covered in the prerequisite material linked to in the header, but in short they are the subsets of data that processors will work on in parallel.\nHowever, note that in the above chunking strategy (defaulted to by Xarray) there are 2 hang ups. First, the time dimension has a small chunk size, which is not efficient if we are looking to perform computations primarily along that axis. Second, the chunk sizes are too small - a good rule of thumb is to make chunk sizes ~100 MB. Therefore, we rechunk to something more efficient:\n\nsstdata = sstdata.chunk(chunks={'lat': 1000, 'lon': 3000, 'time': 10})\nsstdata['analysed_sst']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 10, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(10, 17999, 36000), dtype=float32, chunksize=(10, 1000, 3000), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-10T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 10lat: 17999lon: 36000dask.array<chunksize=(10, 1000, 3000), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n24.14 GiB\n114.44 MiB\n\n\nShape\n(10, 17999, 36000)\n(10, 1000, 3000)\n\n\nDask graph\n216 chunks in 22 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 10\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-01-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#import-packages", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#import-packages", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Import packages", + "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab jupyter-server-proxy\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab jupyter-server-proxy\n\n# NASA data access packages:\nimport earthaccess\n\n# Analysis packages:\nimport xarray as xr\nimport numpy as np \n\n# Visualization packages:\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Cloud computing / dask packages:\nfrom dask.distributed import Client\nimport multiprocessing\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f0c624a0f50>", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "MUR with Dask" + "Advanced Cloud", + "Dask and Coiled", + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/basic_dask.html#computations", - "href": "notebooks/Advanced_cloud/basic_dask.html#computations", - "title": "Basics of Xarray with Dask Parallization for Earth Data", - "section": "3.2 Computations", - "text": "3.2 Computations\nThe above array loaded into memory is quite large (~24 GiB). Calling the following command (commented out by default) to get the temporal mean at each grid point took us a little over 5 minutes:\n\n#%%time\n#sstdata['analysed_sst'].mean(dim='time').compute() # Un-comment to test computation time.\n\nHowever, using a local cluster speeds up the computations to under a minute (we used an m6i.4xlarge EC2 instance type). For this type of parallelization, we can start up the local cluster as in the previous section, and then run Xarray built in functions as usual, calling compute() at the end.\n\nclient = Client(n_workers=12, threads_per_worker=1)\n\n\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(e42eb811, 'tcp://127.0.0.1:37033', workers=12, threads=12, memory=60.88 GiB)\n\n\n'https://cluster-inqaz.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\nmeansst_2dmap = sstdata['analysed_sst'].mean(dim='time').compute()\nmeansst_2dmap\n\nCPU times: user 16 s, sys: 4.06 s, total: 20.1 s\nWall time: 55.1 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (lat: 17999, lon: 36000)>\narray([[ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n ...,\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004]], dtype=float32)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0xarray.DataArray'analysed_sst'lat: 17999lon: 36000nan nan nan nan nan nan nan ... 271.4 271.4 271.4 271.4 271.4 271.4array([[ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n ...,\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004]], dtype=float32)Coordinates: (2)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (2)latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (0)\n\n\nPlot a subset of the mean map:\n\nsub = meansst_2dmap.sel(lat=slice(25, 40), lon=slice(-90, -50))\n\nplt.figure(figsize=(8,4))\nplt.contourf(sub['lon'], sub['lat'], sub.values, levels=np.arange(284, 304, 1))\nplt.colorbar(label=\"Mean SST (K)\")\nplt.title(\"Mean SST off the east coast of the U.S.\")\n\nText(0.5, 1.0, 'Mean SST off the east coast of the U.S.')\n\n\n\n\n\n\n\n\n\n\ndask.config.set({\"distributed.admin.system-monitor.gil.enabled\": False}) # Adjust settings to suppress noisy output when closing cluster\nclient.close()\n\n\nsstdata.close()", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file", + "text": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file\nWe use earthaccess to find metadata and endpoints for the files.\n\nearthaccess.login() # Login with your credentials\n\nEnter your Earthdata Login username: deanh808\nEnter your Earthdata password: ········\n\n\n<earthaccess.auth.Auth at 0x7f0d2a4f4920>\n\n\n\ndatainfo = earthaccess.search_data(\n short_name=\"MUR-JPL-L4-GLOB-v4.1\",\n cloud_hosted=True,\n temporal=(\"2002-01-01\", \"2013-05-01\"),\n )\n\nGranules found: 3988\n\n\n\nOpen and inspect a file\nOpen a file and plot the SST data in the region for our analysis.\n\nfileobj_test = earthaccess.open([datainfo[0]])[0] # Generate file-like objects compatible with Xarray\nsst_test = xr.open_dataset(fileobj_test)['analysed_sst']\nsst_test\n\nOpening 1 granules, approx size: 0.32 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\n[647964000 values with dtype=float32]\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000...[647964000 values with dtype=float32]Coordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00'], dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n# Region to perform analysis over:\nlat_region = (30, 45)\nlon_region = (-135, -105)\n\n\n## Plot SST in analysis region:\nfig = plt.figure()\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(cmap='RdYlBu_r')\n\n\n\n\n\n\n\n\n\n\nMemory considerations\nDemonstrating that these are fairly large files, especially uncompressed, at the time this notebook was written:\n\nprint(\"Disk size of one file =\", datainfo[0]['size'], \"MB.\")\n\nDisk size of one file = 332.3598403930664 MB.\n\n\n\nprint(\"Size in-memory of the SST variable once uncompressed =\", sst_test.nbytes/10**9, \"GB.\")\n\nSize in-memory of the SST variable once uncompressed = 2.591856 GB.\n\n\nAt ~2.5 GB uncompressed, and ~4000 MUR files at the time this notebook was written, we are dealing with a ~10 TB data set.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "MUR with Dask" + "Advanced Cloud", + "Dask and Coiled", + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/basic_dask.html#other-notes-1", - "href": "notebooks/Advanced_cloud/basic_dask.html#other-notes-1", - "title": "Basics of Xarray with Dask Parallization for Earth Data", - "section": "Other notes", - "text": "Other notes\n\nThis method requires code to be written in a specific way, typically utilizing NumPy and Xarray. That is, one cannot start up a cluster and expect an arbitrarily written block of code to work in parallel on the cluster. For example, in the computation above, we used an Xarray built-in function, which is already set up to work with clusters. In general, for many Earthdata researchers starting with Dask, the following plan of attack is beneficial:\n\nSee if the computation you want to perform can be done with an Xarray built-in function, all of which should work with Dask.\nIf there is no Xarray built-in function, look for a built-in function in another library such as NumPy or SciPy (or a library built on top of these), and read the docs to check whether the function was intended to work with Dask. Generally, NumPy functions should work. SciPy functions are hit or miss in the author’s experience.\nIf no built-in function can be found, write your own function using Dask Arrays which are an extension of NumPy arrays. Tutorials on working with Dask Arrays can be found elsewhere.\n\nChunking can have a significant effect on performance. Here are additional notes on chunking from the Dask documentation: https://docs.dask.org/en/latest/array-chunks.html\nIt turns out that the majority of time is spent opening/locating/streaming the data within the files - comparatively little time is spent actually computing the mean. We can make our computations even faster if we have more efficient access to the data, e.g. using kerchunk, which is covered elsewhere.", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "2. Seasonal cycle at weekly temporal resolution", + "text": "2. Seasonal cycle at weekly temporal resolution\nSection 1 needs to be run prior to this\nFor this “medium-sized” computation, the decade time record is thinned out to one file per week. This will be ~200 GB on disk, and ~1.3 TB uncompressed in memory. Using the parallel computing methods below, we were able to accomplish this in about 3 minutes for \\$0.10 (1 minute for opening the data set and 2 minutes for computations). For the size of this computation, we obtained good results with an m7g.8xlarge instance (32 CPUs, 128 GiB Memory), using 16 workers. 16 workers, rather than the maximum amount of 32, were chosen so that each worker has more memory available (8 GiB rather than 4 GiB).\n\n# Thin to weekly temporal resolution:\ndatainfo_thinned = [datainfo[i] for i in range(len(datainfo)) if i%7==0]\n\n# Confirm we have about a decade of files at weekly resolution:\nprint(\"First and last file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[-1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(\"\\nFirst and second file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\n\nFirst and last file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2013-04-26T21:00:00.000Z\n\nFirst and second file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2002-06-07T21:00:00.000Z\n\n\nSince Xarray built-in functions are used to both open and process the data, the workflow is to start up a cluster, open the files into a single dataset with chunking, and then Xarray function calls will naturally be run in parallel on the cluster.\n\nfileobjs = earthaccess.open(datainfo_thinned) # Generate file objects from the endpoints which are compatible with Xarray\n\nOpening 570 granules, approx size: 190.08 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n## Double check the number of CPU's available on this VM type:\nprint(multiprocessing.cpu_count())\n\n32\n\n\n\n## Local Dask Cluster\nclient = Client(n_workers=16, threads_per_worker=1)\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(07e4762f, 'tcp://127.0.0.1:38783', workers=16, threads=16, memory=122.12 GiB)\n\n\n'https://cluster-dlufo.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs[:], parallel=True, chunks={})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of the computations\n # operate along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 200})\nsst\n\nCPU times: user 18 s, sys: 2.16 s, total: 20.2 s\nWall time: 59.5 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 570, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(570, 17999, 36000), dtype=float32, chunksize=(200, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-04-27T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 570lat: 17999lon: 36000dask.array<chunksize=(200, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.34 TiB\n190.73 MiB\n\n\nShape\n(570, 17999, 36000)\n(200, 500, 500)\n\n\nDask graph\n7776 chunks in 1143 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 570\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-04-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-08T09:00:00.000000000',\n '2002-06-15T09:00:00.000000000', ..., '2013-04-13T09:00:00.000000000',\n '2013-04-20T09:00:00.000000000', '2013-04-27T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-08 09:00:00',\n '2002-06-15 09:00:00', '2002-06-22 09:00:00',\n '2002-06-29 09:00:00', '2002-07-06 09:00:00',\n '2002-07-13 09:00:00', '2002-07-20 09:00:00',\n '2002-07-27 09:00:00', '2002-08-03 09:00:00',\n ...\n '2013-02-23 09:00:00', '2013-03-02 09:00:00',\n '2013-03-09 09:00:00', '2013-03-16 09:00:00',\n '2013-03-23 09:00:00', '2013-03-30 09:00:00',\n '2013-04-06 09:00:00', '2013-04-13 09:00:00',\n '2013-04-20 09:00:00', '2013-04-27 09:00:00'],\n dtype='datetime64[ns]', name='time', length=570, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\n#cluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 32.44 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 52.5 s, sys: 7.15 s, total: 59.6 s\nWall time: 2min 12s\n\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "MUR with Dask" + "Advanced Cloud", + "Dask and Coiled", + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#processing-a-large-data-set-in-chunks-using-coiled.cluster-example-use-for-an-sst-seasonal-cycle-analysis", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#processing-a-large-data-set-in-chunks-using-coiled.cluster-example-use-for-an-sst-seasonal-cycle-analysis", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Processing a Large Data Set in Chunks Using coiled.cluster(), Example Use for an SST Seasonal Cycle Analysis", - "text": "Processing a Large Data Set in Chunks Using coiled.cluster(), Example Use for an SST Seasonal Cycle Analysis\n\nAuthors: Dean Henze, NASA JPL PO.DAAC\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "section": "3. Seasonal cycle for full record (daily resolution)", + "text": "3. Seasonal cycle for full record (daily resolution)\nSection 1 needs to be run prior to this, but Section 2 can be skipped.\nIn this section, all files in the decade are processed. This will be ~4000 files, ~1.3 TB on disk, and ~10 TB for the SST varaible once uncompressed in memory. We were able to accomplish this using a few different VM’s and configurations listed below. Currently, the code is setup for using a r7a.32xlarge VM with 32 workers, which completed the computations in 14 minutes for \\$3 (6 minutes for opening the data set and 8 minutes for computations).\nMore on the VM type chosen\nFor this computation, memory-optimized VMs were chosen (they have high memory per CPU). This Coiled post was used as inspiration, where it is found that having larger chunks are more efficient, which is why memory-optimized VMs are needed to handle the larger chunks. Additionally, we found that having 32 GB per worker, regardless of the worker number, was necessary to complete the computations without receiving memory errors.\nVM runs that worked\n\nr7a.32xlarge (128 CPUs, 1024 GiB memory): 32 workers each with 32 GB of memory; completed in 13 minutes for \\$3\nr7i.48xlarge (192 CPUs, 1,536 GiB memory): 48 workers each with 32 GB of memory; completed in 13 minutes for \\$4\nr7iz.16xlarge (64 CPUs, 512 GiB memory): 16 workers each with 32 GB of memory; completed in 18 minutes for \\$2.50\n\n\nfileobjs = earthaccess.open(datainfo) # Generate file-like objects compatible with Xarray\n\nOpening 3988 granules, approx size: 1330.13 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n## Double check the number of CPU's available on this VM type:\nprint(multiprocessing.cpu_count())\n\n128\n\n\n\n## Local Dask Cluster\nclient = Client(n_workers=32, threads_per_worker=1)\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(3cd02cc8, 'tcp://127.0.0.1:44455', workers=32, threads=32, memory=0.96 TiB)\n\n\n'https://cluster-srigu.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of our computations are\n # operating along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 400})\nsst\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 17.93 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 2min 9s, sys: 29.5 s, total: 2min 38s\nWall time: 5min 31s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 3988, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(3988, 17999, 36000), dtype=float32, chunksize=(400, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-05-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 3988lat: 17999lon: 36000dask.array<chunksize=(400, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.40 TiB\n381.47 MiB\n\n\nShape\n(3988, 17999, 36000)\n(400, 500, 500)\n\n\nDask graph\n25920 chunks in 7979 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 3988\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-05-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-02T09:00:00.000000000',\n '2002-06-03T09:00:00.000000000', ..., '2013-04-29T09:00:00.000000000',\n '2013-04-30T09:00:00.000000000', '2013-05-01T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-02 09:00:00',\n '2002-06-03 09:00:00', '2002-06-04 09:00:00',\n '2002-06-05 09:00:00', '2002-06-06 09:00:00',\n '2002-06-07 09:00:00', '2002-06-08 09:00:00',\n '2002-06-09 09:00:00', '2002-06-10 09:00:00',\n ...\n '2013-04-22 09:00:00', '2013-04-23 09:00:00',\n '2013-04-24 09:00:00', '2013-04-25 09:00:00',\n '2013-04-26 09:00:00', '2013-04-27 09:00:00',\n '2013-04-28 09:00:00', '2013-04-29 09:00:00',\n '2013-04-30 09:00:00', '2013-05-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=3988, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 227.20 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 3min 41s, sys: 45.5 s, total: 4min 27s\nWall time: 8min 24s\n\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#summary", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#summary", + "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#additional-notes", + "href": "notebooks/Advanced_cloud/dask_cluster_01.html#additional-notes", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Summary", - "text": "Summary\nPrevious notebooks have covered the use of Dask and parallel computing applied to the type of tasks in the schematic below, where we have a function which needs to work on a large data set as a whole. This could e.g. because the function works on some or all of the data from each of the files, so we can’t just work on each file independently like in the function replication example.\n \nIn a previous notebook, a toy example was used to demonstrate this basic functionality using a local dask cluster and Xarray built-in functions to work on the data set in chunks. In this notebook, that workflow is expanded to a more complex analysis. Parallel computations are performed via the third party software/package Coiled. In short, Coiled allows us to spin up AWS virtual machines (EC2 instances) and create a distributed cluster out of them, all with a few lines of Python from within a notebook. You will need a Coiled account, but once set up, you can run this notebook entirely from your laptop while the parallel computation portion will be run on the distributed cluster in AWS.\n\nAnalysis: Mean Seasonal Cycle of SST Anomalies\nThe analysis will generate the mean seasonal cycle of sea surface temperature (SST) at each gridpoint in a region of the west coast of the U.S.A. The analysis uses a PO.DAAC hosted gridded global SST data set:\n\nGHRSST Level 4 MUR Global Foundation SST Analysis, V4.1: 0.01° x 0.01° resolution, global map, daily files, https://doi.org/10.5067/GHGMR-4FJ04\n\nThe analysis will use files over the first decade of the time record. The following procedure is used to generate seasonal cycles:\n\nIn Section 1 of this notebook, the first decade of MUR files are located on PO.DAAC using the earthaccess package, then a file is inspected and memory requirements for this data set are assessed. In Section 2, a “medium-sized” computation is performed, deriving the mean seasonal cycle for the files thinned out to once per week (570 files, 1.3 TB of uncompressed data) for about \\(\\$\\) 0.20. In Section 3, we perform the computation on all the files in the first decade, ~4000 files, ~10 TB of uncompressed data, for about \\(\\$\\) 3.", + "section": "4. Additional Notes", + "text": "4. Additional Notes\n\nTo compute the mean seasonal cycle, Xarray’s built in groupby() function is used to group the data by month of the year. As per this Xarray docs page, one can try using the flox package to speed up this groupby operation.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Dask Dataset Chunking Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#replicating-a-function-over-many-files-with-coiled.function-example-use-for-an-sst-ssh-spatial-correlation-analysis", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#replicating-a-function-over-many-files-with-coiled.function-example-use-for-an-sst-ssh-spatial-correlation-analysis", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Requirements, prerequisite knowledge, learning outcomes", - "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCoiled account: Create a coiled account (free to sign up), and connect it to an AWS account. For more information on Coiled, setting up an account, and connecting it to an AWS account, see their website https://www.coiled.io.\nCompute environment: This notebook can be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server), but the data loading step currently works substantially faster in the cloud. In both cases, the parallel computations are still sent to VM’s in the cloud.\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Coiled with a distributed cluster to analyze a large data set in chunks, naturally parallelizing Xarray built in functions on the cluster. You will get better insight on how to apply this workflow to your own analysis.", + "section": "Replicating a Function Over Many Files with coiled.function(), Example Use for an SST-SSH Spatial Correlation Analysis", + "text": "Replicating a Function Over Many Files with coiled.function(), Example Use for an SST-SSH Spatial Correlation Analysis\n\nAuthors: Dean Henze and Jinbo Wang, NASA JPL PO.DAAC\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#import-packages", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#import-packages", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#summary", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#summary", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Import packages", - "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\n\n# NASA data access packages:\nimport earthaccess\n\n# Analysis packages:\nimport xarray as xr\nimport numpy as np \n\n# Visualization packages:\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Cloud computing / dask packages:\nimport coiled\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f89550bbfb0>", + "section": "Summary", + "text": "Summary\nPrevious notebooks have covered the use of Dask and parallel computing applied to the type of task in the schematic below, where we wish to replicate a function over a set of files.\n\nA separate notebook explores this workflow for computing spatial correlation maps between sea surface temperature (SST) and sea surface height (SSH) (an overview of the analysis is described below), where the parallel computations were performed with Dask on a local cluster using dask.delayed(). In this notebook, we perform the same computations, but parallelize them using the third party software/package Coiled. In short Coiled will allow us to spin up AWS virtual machines (EC2 instances) and create a distributed cluster out of them, all with a few lines of Python from within this notebook. For this type of parallel computation, we use coiled.function()’s, taking the place of dask.delayed(). You will need a Coiled account, but once set up, you can run this notebook entirely from your laptop while the parallel computation portion will be run on the distributed cluster in AWS.\n\nSST-SSH Correlation Analysis\nThe analysis will generate global maps of spatial correlation between sea surface temperature (SST) and sea surface height (SSH). The analysis uses PO.DAAC hosted, gridded SSH and SST data sets:\n\nMEaSUREs gridded SSH Version 2205: 0.17° x 0.17° resolution, global map, one file per 5-days, https://doi.org/10.5067/SLREF-CDRV3\nGHRSST Level 4 MW_OI Global Foundation SST, V5.0: 0.25° x 0.25° resolution, global map, daily files, https://doi.org/10.5067/GHMWO-4FR05\n\nThe time period of overlap between these data sets is 1998 – 2020, with 1808 days in total overlapping. For each pair of SST, SSH files on these days, compute a map of spatial correlation between them, where the following method is used at each gridpoint:\n\nThis notebook will first define the functions to read in the data and perform the computations, then test them on a single file. Next a smaller parallel computation will be performed on all pairs of files in 2018 (73 pairs in total), reducing what would have otherwise taken hours to minutes instead. Finally, an optional section will demonstrate what was used to perform the full computation on all 1808 pairs of files at 0.25 degree resolution.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#requirements-prerequisite-knowledge-learning-outcomes", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file", - "text": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file\nWe use earthaccess to find metadata and endpoints for the files.\n\nearthaccess.login() # Login with your credentials\n\nEnter your Earthdata Login username: deanh808\nEnter your Earthdata password: ········\n\n\n<earthaccess.auth.Auth at 0x7f897ede49b0>\n\n\n\ndatainfo = earthaccess.search_data(\n short_name=\"MUR-JPL-L4-GLOB-v4.1\",\n cloud_hosted=True,\n temporal=(\"2002-01-01\", \"2013-05-01\"),\n )\n\nGranules found: 3988\n\n\n\nOpen and inspect a file\nOpen a file and plot the SST data in the region for our analysis.\n\nfileobj_test = earthaccess.open([datainfo[0]])[0] # Generate file-like objects compatible with Xarray\nsst_test = xr.open_dataset(fileobj_test)['analysed_sst']\nsst_test\n\nOpening 1 granules, approx size: 0.32 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\n[647964000 values with dtype=float32]\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000...[647964000 values with dtype=float32]Coordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00'], dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n# Region to perform analysis over:\nlat_region = (30, 45)\nlon_region = (-135, -105)\n\n\n## Plot SST in analysis region:\nfig = plt.figure()\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(cmap='RdYlBu_r')\n\n\n\n\n\n\n\n\n\n\nMemory considerations\nDemonstrating that these are fairly large files, especially uncompressed, at the time this notebook was written:\n\nprint(\"Disk size of one file =\", datainfo[0]['size'], \"MB.\")\n\nDisk size of one file = 332.3598403930664 MB.\n\n\n\nprint(\"Size in-memory of the SST variable once uncompressed =\", sst_test.nbytes/10**9, \"GB.\")\n\nSize in-memory of the SST variable once uncompressed = 2.591856 GB.\n\n\nAt ~2.5 GB uncompressed, and ~4000 MUR files at the time this notebook was written, we are dealing with a ~10 TB data set.", + "section": "Requirements, prerequisite knowledge, learning outcomes", + "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCoiled account: Create a coiled account (free to sign up), and connect it to an AWS account. For more information on Coiled, setting up an account, and connecting it to an AWS account, see their website https://www.coiled.io.\nCompute environment: This notebook can be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server), and will run equally as well in either. In both cases, the parallel computations are still sent to VM’s in the cloud.\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Coiled with a distributed cluster to replicate a function over many files in parallel. You will get better insight on how to apply this workflow to your own analysis.", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#import-packages", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#import-packages", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "2. Seasonal cycle at weekly temporal resolution", - "text": "2. Seasonal cycle at weekly temporal resolution\nFor this “medium-sized” computation, the decade time record is thinned out to one file per week. This will be ~200 GB on disk, and ~1.3 TB uncompressed in memory. Using the parallel computing methods below, we were able to accomplish this in about 4 minutes for \\$0.20 (1 minute for opening the data set and 3 minutes for computations). For the size of this computation, we obtained good results with 25 compute-optimized c7g.large VMs. For the larger computation in Section 3, we switch to memory-optimized VMs.\n\n# Thin to weekly temporal resolution:\ndatainfo_thinned = [datainfo[i] for i in range(len(datainfo)) if i%7==0]\n\n# Confirm we have about a decade of files at weekly resolution:\nprint(\"First and last file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[-1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(\"\\nFirst and second file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\n\nFirst and last file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2013-04-26T21:00:00.000Z\n\nFirst and second file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2002-06-07T21:00:00.000Z\n\n\nSince Xarray built-in functions are used to both open and process the data, the workflow is to start up a cluster, open the files into a single dataset with chunking, and then Xarray function calls will naturally be run in parallel on the cluster.\n\nfileobjs = earthaccess.open(datainfo_thinned) # Generate file objects from the endpoints which are compatible with Xarray\n\nOpening 570 granules, approx size: 190.08 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nCPU times: user 1.03 s, sys: 70.6 ms, total: 1.1 s\nWall time: 1.55 s\n\n\n\ncluster = coiled.Cluster(\n n_workers=25, \n region=\"us-west-2\", \n worker_vm_types=\"c7g.large\", # or can try \"m7a.medium\"\n scheduler_vm_types=\"c7g.large\" # or can try \"m7a.medium\"\n ) \nclient = cluster.get_client()\n\n\n\n\n\n\n\n╭────────────────────────── Not Synced with Cluster ───────────────────────────╮\n│ ╷ ╷ │\n│ Package │ Error │ Risk │\n│ ╶───────────┼────────────────────────────────────────────────────┼─────────╴ │\n│ libcxxabi │ libcxxabi~=17.0.6 has no install candidate for │ Warning │\n│ │ Python 3.12 linux-aarch64 on conda-forge │ │\n│ ╵ ╵ │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n\n\n\n\n\n\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={'lat': 6000, 'lon': 6000, 'time': 1})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of the computations\n # operate along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 200})\nsst\n\nCPU times: user 9.23 s, sys: 564 ms, total: 9.79 s\nWall time: 51.2 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 570, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(570, 17999, 36000), dtype=float32, chunksize=(200, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-04-27T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 570lat: 17999lon: 36000dask.array<chunksize=(200, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.34 TiB\n190.73 MiB\n\n\nShape\n(570, 17999, 36000)\n(200, 500, 500)\n\n\nDask graph\n7776 chunks in 1143 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 570\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-04-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-08T09:00:00.000000000',\n '2002-06-15T09:00:00.000000000', ..., '2013-04-13T09:00:00.000000000',\n '2013-04-20T09:00:00.000000000', '2013-04-27T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-08 09:00:00',\n '2002-06-15 09:00:00', '2002-06-22 09:00:00',\n '2002-06-29 09:00:00', '2002-07-06 09:00:00',\n '2002-07-13 09:00:00', '2002-07-20 09:00:00',\n '2002-07-27 09:00:00', '2002-08-03 09:00:00',\n ...\n '2013-02-23 09:00:00', '2013-03-02 09:00:00',\n '2013-03-09 09:00:00', '2013-03-16 09:00:00',\n '2013-03-23 09:00:00', '2013-03-30 09:00:00',\n '2013-04-06 09:00:00', '2013-04-13 09:00:00',\n '2013-04-20 09:00:00', '2013-04-27 09:00:00'],\n dtype='datetime64[ns]', name='time', length=570, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\ncluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 32.08 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 2.25 s, sys: 559 ms, total: 2.81 s\nWall time: 3min 54s\n\n\n\nclient.shutdown()\ncluster.shutdown()\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", + "section": "Import packages", + "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nNote that the versions are important, specifially for the science / math packages - when running newer versions of xarray, scipy, and numpy, we got some strange results.\n\n# Built in packages\nimport time\nimport sys\nimport os\nimport shutil\n\n# Math / science packages\nimport xarray as xr\nimport numpy as np\nfrom scipy.optimize import leastsq\n\n# Plotting packages\nfrom matplotlib import pylab as plt\n\n# Cloud / parallel computing packages\nimport earthaccess\nimport coiled", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#define-functions", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#define-functions", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "3. Seasonal cycle for full record (daily resolution)", - "text": "3. Seasonal cycle for full record (daily resolution)\nSection 1 needs to be run prior to this one, but Section 2 can be skipped.\nIn this section, all files in the decade are processed. This will be ~4000 files, ~1.3 TB on disk, and ~10 TB for the SST varaible once uncompressed in memory. Using the parallel computing methods below (with 40 r7g.xlarge VMs), we were able to accomplish this in about 20 minutes for \\$3 (5 minutes for opening the data set and 15 minutes for computations).\nFor this computation, memory-optimized VMs were chosen (they have high memory per CPU), following the example Coiled post here. In short, it is more efficient to create larger chunks and have VMs which can handle the larger chunks.\n\nfileobjs = earthaccess.open(datainfo) # Generate file-like objects compatible with Xarray\n\nOpening 3988 granules, approx size: 1330.13 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\ncluster = coiled.Cluster(\n n_workers=40, \n region=\"us-west-2\", \n worker_vm_types=\"r7g.xlarge\",\n scheduler_vm_types=\"r7g.xlarge\"\n ) \nclient = cluster.get_client()\n\n\n\n\n\n\n\n╭────────────────────────── Not Synced with Cluster ───────────────────────────╮\n│ ╷ ╷ │\n│ Package │ Error │ Risk │\n│ ╶───────────┼────────────────────────────────────────────────────┼─────────╴ │\n│ libcxxabi │ libcxxabi~=17.0.6 has no install candidate for │ Warning │\n│ │ Python 3.12 linux-aarch64 on conda-forge │ │\n│ ╵ ╵ │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n\n\n\n\n\n\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={'lat': 6000, 'lon': 6000, 'time': 1})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of our computations are\n # operating along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 400})\nsst\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 18.07 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 55.3 s, sys: 3.72 s, total: 59 s\nWall time: 5min 1s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 3988, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(3988, 17999, 36000), dtype=float32, chunksize=(400, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-05-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 3988lat: 17999lon: 36000dask.array<chunksize=(400, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.40 TiB\n381.47 MiB\n\n\nShape\n(3988, 17999, 36000)\n(400, 500, 500)\n\n\nDask graph\n25920 chunks in 7980 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 3988\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-05-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-02T09:00:00.000000000',\n '2002-06-03T09:00:00.000000000', ..., '2013-04-29T09:00:00.000000000',\n '2013-04-30T09:00:00.000000000', '2013-05-01T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-02 09:00:00',\n '2002-06-03 09:00:00', '2002-06-04 09:00:00',\n '2002-06-05 09:00:00', '2002-06-06 09:00:00',\n '2002-06-07 09:00:00', '2002-06-08 09:00:00',\n '2002-06-09 09:00:00', '2002-06-10 09:00:00',\n ...\n '2013-04-22 09:00:00', '2013-04-23 09:00:00',\n '2013-04-24 09:00:00', '2013-04-25 09:00:00',\n '2013-04-26 09:00:00', '2013-04-27 09:00:00',\n '2013-04-28 09:00:00', '2013-04-29 09:00:00',\n '2013-04-30 09:00:00', '2013-05-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=3988, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\ncluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3161: UserWarning: Sending large graph of size 225.00 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 11.1 s, sys: 1.05 s, total: 12.1 s\nWall time: 14min 16s\n\n\n\nclient.shutdown()\ncluster.shutdown()\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", + "section": "1. Define functions", + "text": "1. Define functions\nThe main function implemented is spatial_corrmap(), which will return the map of correlations as a 2D NumPy array along with the 1D latitude, longitude arrays for the map. The other functions below are called by spatial_corrmap().\n\ndef load_sst_ssh(gran_ssh, gran_sst):\n \"\"\"\n Return SLA and SST variables for a single file each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections, respectively, returned as xarray.DataArray's. Input args are granule info \n (earthaccess.results.DataGranule object's) for each collection. \n \"\"\"\n earthaccess.login(strategy=\"environment\") # Confirm credentials are current\n \n # Get SLA and SST variables, loaded fully into local memory:\n ssh = xr.load_dataset(earthaccess.open([gran_ssh], provider='POCLOUD')[0])['SLA'][0,...]\n sst = xr.load_dataset(earthaccess.open([gran_sst], provider='POCLOUD')[0])['analysed_sst'][0,...]\n\n return ssh, sst\n\n\ndef spatialcorr(x, y, p1, p2):\n \"\"\"\n Correlation between two 2D variables p1(x, y), p2(x, y), over the domain (x, y). Correlation is \n computed between the anomalies of p1, p2, where anomalies for each variables are the deviations \n from respective linear 2D surface fits.\n \"\"\"\n # Compute anomalies:\n ssha, _ = anomalies_2Dsurf(x, y, p1) # See function further down.\n ssta, _ = anomalies_2Dsurf(x, y, p2)\n \n # Compute correlation coefficient:\n a, b = ssta.flatten(), ssha.flatten()\n if ( np.nansum(abs(a))==0 ) or ( np.nansum(abs(b))==0 ): \n # For cases with all 0's, the correlation should be 0. Numpy computes this correctly \n # but throws a lot of warnings. So instead, manually append 0.\n return 0\n else:\n return np.nanmean(a*b)/np.sqrt(np.nanvar(a) * np.nanvar(b))\n\n\ndef anomalies_2Dsurf(x, y, p):\n \"\"\"\n Return anomalies for a 2D variable. Anomalies are computed as the deviations of each \n point from a bi-linear 2D surface fit to the data (using scipy).\n \n Inputs\n ------\n x, y: 1D array-like.\n Independent vars (likely the lon, lat coordinates).\n p: 2D array-like, of shape (len(y), len(x)).\n Dependent variable. 2D surface fit will be to p(x, y).\n \n Returns\n ------\n va, vm: 2D NumPy arrays\n Anomalies (va) and mean surface fit (vm).\n \"\"\"\n # Function for a 2D surface:\n def surface(c,x0,y0): # Takes independent vars and poly coefficients\n a,b,c=c\n return a + b*x0 + c*y0\n # Function for the difference between data and the computed surface:\n def err(c,x0,y0,p): # Takes independent/dependent vars and poly coefficients\n a,b,c=c\n return p - (a + b*x0 + c*y0 )\n\n\n # Prep arrays and remove NAN's:\n xx, yy = np.meshgrid(x, y)\n xf, yf, pf = xx.flatten(), yy.flatten(), p.flatten()\n msk=~np.isnan(pf)\n xf, yf, pf = xf[msk], yf[msk], pf[msk]\n\n \n # Initial values of polynomial coefficients to start fitting algorithm off with:\n dpdx=(pf.max()-pf.min())/(xf.max()-xf.min())\n dpdy=(pf.max()-pf.min())/(yf.max()-yf.min())\n c = [pf.mean(),dpdx,dpdy]\n\n \n # Fit and compute anomalies:\n coef = leastsq(err,c,args=(xf,yf,pf))[0]\n vm = surface(coef, xx, yy) # mean surface\n va = p - vm # anomalies\n return va, vm\n\n\ndef spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Get a 2D map of SSH-SST spatial correlation coefficients, for one each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections. At each gridpoint, the spatial correlation is computed over a lat, lon window of size \n 2*lat_halfwin x 2*lon_halfwin. Correlation is computed from the SSH, SST anomalies, which are \n computed in turn as the deviations from a fitted 2D surface over the window.\n \n Inputs\n ------\n grans: 2-tuple of earthaccess.results.DataGranule objects\n Metadata for the SSH, SST files. These objects contain https and S3 locations.\n lat_halfwin, lon_halfwin: floats\n Half window size in degrees for latitude and longitude dimensions, respectively.\n lats, lons: None or 1D array-like\n Latitude, longitude gridpoints at which to compute the correlations. \n If None, will use the SSH grid.\n f_notnull: float between 0-1 (default = 0.5)\n Threshold fraction of non-NAN values in a window, otherwise the correlation is not computed, \n and NAN is returned for that grid point. For edge cases, 'ghost' elements are counted.\n\n Returns\n ------\n coef: 2D numpy array\n Spatial correlation coefficients.\n \n lats, lons: 1D numpy arrays.\n Latitudes and longitudes creating the 2D grid that 'coef' was calculated on.\n \"\"\" \n # Load datafiles, convert SST longitude to (0,360), and interpolate SST to SSH grid: \n ssh, sst = load_sst_ssh(*grans)\n sst = sst.roll(lon=len(sst['lon'])//2)\n sst['lon'] = sst['lon']+180\n sst = sst.interp(lon=ssh['Longitude'], lat=ssh['Latitude'])\n\n \n # Compute windows size and threshold number of non-nan points:\n dlat = (ssh['Latitude'][1]-ssh['Latitude'][0]).item()\n dlon = (ssh['Longitude'][1]-ssh['Longitude'][0]).item()\n nx_win = 2*round(lon_halfwin/dlon)\n ny_win = 2*round(lat_halfwin/dlat)\n n_thresh = nx_win*ny_win*f_notnull\n\n\n # Some prep work for efficient identification of windows where number of non-nan's < threshold:\n # Map of booleans for sst*ssh==np.nan\n notnul = (sst*ssh).notnull() \n # Combine map and sst, ssh data into single Dataset for more efficient indexing:\n notnul = notnul.rename(\"notnul\") # Needs a name to merge\n mergeddata = xr.merge([ssh, sst, notnul], compat=\"equals\")\n \n\n # Compute spatial correlations over whole map:\n coef = []\n \n if lats is None:\n lats = ssh['Latitude'].data\n lons = ssh['Longitude'].data\n \n for lat_cen in lats:\n for lon_cen in lons:\n\n # Create window for both sst and ssh with xr.sel:\n lat_bottom = lat_cen - lat_halfwin\n lat_top = lat_cen + lat_halfwin\n lon_left = lon_cen - lon_halfwin\n lon_right = lon_cen + lon_halfwin\n data_win = mergeddata.sel(\n Longitude=slice(lon_left, lon_right), \n Latitude=slice(lat_bottom, lat_top)\n )\n \n # If number of non-nan values in window is less than threshold \n # value, append np.nan, else compute correlation coefficient:\n n_notnul = data_win[\"notnul\"].sum().item()\n if n_notnul < n_thresh:\n coef.append(np.nan)\n else:\n c = spatialcorr(\n data_win['Longitude'], data_win['Latitude'], \n data_win['SLA'].data, data_win['analysed_sst'].data\n )\n coef.append(c)\n \n return np.array(coef).reshape((len(lats), len(lons))), np.array(lats), np.array(lons)", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_cluster_01.html#additional-notes", - "href": "notebooks/Advanced_cloud/coiled_cluster_01.html#additional-notes", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", "title": "Parallel Computing with Earthdata in the Cloud", - "section": "4. Additional Notes", - "text": "4. Additional Notes\n\nTo compute the mean seasonal cycle, Xarray’s built in groupby() function is used to group the data by month of the year. As per this Xarray docs page, one can try using the flox package to speed up this groupby operation.", + "section": "2. Get all matching pairs of SSH, SST files for 2018", + "text": "2. Get all matching pairs of SSH, SST files for 2018\nThe spatial_corrmap() function takes as one of its arguments a 2-tuple of earthaccess.results.DataGranule objects, one each for SSH and SST (recall that these are the objects returned from a call to earthaccess.search_data()). This section will retrieve pairs of these objects for all SSH, SST data in 2018 on days where the data sets overlap.\n\nearthaccess.login()\n\n<earthaccess.auth.Auth at 0x179b33bc0>\n\n\n\n## Granule info for all files in 2018:\ndt2018 = (\"2018-01-01\", \"2018-12-31\")\ngrans_ssh = earthaccess.search_data(\n short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\", \n temporal=dt2018\n )\ngrans_sst = earthaccess.search_data(\n short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\", \n temporal=dt2018\n )\n\nGranules found: 73\nGranules found: 365\n\n\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\nprint(' SSH file days: ', dates_ssh[:8], '\\n', 'SST file days: ', dates_sst[:8])\n\n SSH file days: ['20180102', '20180107', '20180112', '20180117', '20180122', '20180127', '20180201', '20180206'] \n SST file days: ['20180101', '20180102', '20180103', '20180104', '20180105', '20180106', '20180107', '20180108']\n\n\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nThe result is two lists of earthaccess.results.DataGranule objects, where the ith element of the SSH, SST lists contain granule info for the respective data sets on the same day:\n\nprint(grans_ssh_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_ssh_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_ssh_analyze[:4]])\nprint(grans_sst_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_sst_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_sst_analyze[:4]])\n\nSEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']\nMW_OI-REMSS-L4-GLOB-v5.0 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']", "crumbs": [ "Advanced Cloud", "Dask and Coiled", - "Coiled Dataset Chunking Example" + "Coiled Function Replication Example" ] }, { - "objectID": "notebooks/SearchDownload_SWOTviaCMR.html#summary", - "href": "notebooks/SearchDownload_SWOTviaCMR.html#summary", - "title": "Search and Download SWOT Data via earthaccess", - "section": "Summary", - "text": "Summary\nThis notebook will find and download pre-validated SWOT hydrology data (v2.0) programmatically via earthaccess python library. For more information about earthaccess visit: https://nsidc.github.io/earthaccess/" - }, - { - "objectID": "notebooks/SearchDownload_SWOTviaCMR.html#requirements", - "href": "notebooks/SearchDownload_SWOTviaCMR.html#requirements", - "title": "Search and Download SWOT Data via earthaccess", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport geopandas as gpd\nimport glob\nfrom pathlib import Path\nimport pandas as pd\nimport os\nimport zipfile\nimport earthaccess\n\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login() \n\n\n\nSearch for SWOT data links\nWe want to find the SWOT files for a particular pass over North America.\nEach dataset has it’s own unique shortname, which can be used to search earthaccess. Shortnames can be found on dataset landing pages or Earthdata Search Collections.\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRiver Vector Shapefile - SWOT_L2_HR_RiverSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LakeSP_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\n\nLet’s start our search for River Vector Shapefiles with a particular pass, pass 013. SWOT files come in “reach” and “node” versions in the same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’ and call out a specific pass number that we want.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_013_NA*') # here we filter by Reach files (not node), pass=013, continent code=NA\n\nGranules found: 6\n\n\nDuring the science orbit, a pass will be repeated once every 21 days. A particular location may have different passes observe it within the 21 days, however. See the SWOT swath visualizer for your location!\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"./datasets/data_downloads/SWOT_files/\")\nfolder = Path(\"./datasets/data_downloads/SWOT_files\")\n\n Getting 6 granules, approx download size: 0.0 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.zip\n\n\n\n\nShapefiles come in a .zip format, and need to be unzipped in the existing folder\n\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\nos.listdir(folder)\n\n['SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.zip',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shx',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shp',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.prj',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.prj']" + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "3. Test the computation on a pair of files, output on a coarse resolution grid", + "text": "3. Test the computation on a pair of files, output on a coarse resolution grid\nTo verify the functions work, test them on the first pair of files. To reduce computation time, we compute them for a 2 degree x 2 degree output grid for now.\n\n# Compute spatial correlation map for 2 degree x 2 degree resolution and time it:\nt1 = time.time()\n\nlats = np.arange(-80, 80, 2)\nlons = np.arange(0, 359, 2)\ncoef, lats, lons = spatial_corrmap((grans_ssh_analyze[0], grans_sst_analyze[0]), 3, 3, lats=lats, lons=lons, f_notnull=0.5)\n\nt2 = time.time()\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds.\")\n\nOpening 1 granules, approx size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\nOpening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\nTotal computation time = 26.95 seconds.\n\n\n\n## Plot the results:\nplt.figure(figsize=(8,3))\nplt.contourf(lons, lats, coef, cmap='RdBu_r')\nplt.colorbar()\n\n\n\n\n\n\n\n\n\nEstimation of computation time for higher resolution output and more files\nThe computation for one file computed on a 2 x 2 degree grid takes:\n\nprint(str(comptime) + \" seconds.\")\n\n26.95 seconds.\n\n\nthen assuming linear scaling, processing one file at 0.5 x 0.5 degree resolution would take:\n\neta_fullres_seconds = comptime*(2/0.5)*(2/0.5)\neta_fullres_minutes = round(eta_fullres_seconds/60)\nprint(str(eta_fullres_minutes) + \" minutes.\")\n\n7 minutes.\n\n\nand for the record over all of 2018 would take:\n\neta_allfiles_hrs = round( (len(grans_ssh)*eta_fullres_minutes)/60, 1 )\neta_allfiles_days = round(eta_allfiles_hrs/24, 2)\nprint(str(len(grans_ssh)) + \" granules for 2018.\")\nprint(str(eta_allfiles_hrs) + \" hours = \" + str(eta_allfiles_days) + \" days.\")\n\n73 granules for 2018.\n8.5 hours = 0.35 days.", + "crumbs": [ + "Advanced Cloud", + "Dask and Coiled", + "Coiled Function Replication Example" + ] }, { - "objectID": "quarto_text/Workshops.html", - "href": "quarto_text/Workshops.html", - "title": "Workshops", - "section": "", - "text": "We develop tutorials for teaching events that each have their own e-book. We often do this in collaboration with NASA OpenScapes. Tutorials are developed to teach open science and Cloud workflows for specific audiences. They are a snapshot in time as workflows with NASA Earthdata Cloud emerge and evolve.", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#parallel-computations-with-coiled-functions", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#parallel-computations-with-coiled-functions", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "4. Parallel computations with Coiled Functions", + "text": "4. Parallel computations with Coiled Functions\nSections 1 and 2 need to be run prior to this.\nThe previous section showed that analyzing a year’s worth of data at 0.5 x 0.5 degree output resolution would take hours. In this section, we use Coiled to parallelize this computation to take ~10 minutes and cost ~$1 (at the time this was written). Our task is to replicate and apply our function to all the files in 2018, which can be accomplished with a call to coiled.function().\nFirst, define a wrapper function which calls spatial_corrmap() for a pair of SSH, SST granules and collects the output into an Xarray.DataArray, returning it along with the date of granule coverages. We will parallelize this function rather than spatial_corrmap(), then take the output and save to netCDF files locally.\n\ndef corrmap_toda(grans, lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and collects output into an \n Xarray DataArray. Returns this along with the date of the file coverages.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n return date, xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n\nNext, some prep work:\n\n# All output will be saved to this local directory:\ndir_results = \"results/\"\nos.makedirs(dir_results, exist_ok=True)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80, 0.5)\nlons = np.arange(0, 359, 0.5)\n\nthen setup the parallel computations and run! (you can monitor the progress of the cluster on your Coiled dashboard)\n\n## -----------------------------\n## Perform and time computations\n## -----------------------------\n\nt1 = time.time()\n\n\n# Wrap function in a Coiled function. Here is where we make cluster specifications like VM type:\ncorrmap_toda_parallel = coiled.function(\n region=\"us-west-2\", spot_policy=\"on-demand\", vm_type=\"m6i.large\", \n environ=earthaccess.auth_environ(), # Ensure that our EDL credentials are passed to each worker.\n n_workers=73 # Optional: have the cluster manually scale to 73 VM's. Omit for adaptive scaling.\n )(corrmap_toda)\n\n# Begin computations:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\nresults = corrmap_toda_parallel.map(\n grans_2tuples, lat_halfwin=3, lon_halfwin=3, \n lats=lats, lons=lons, f_notnull=0.5\n )\n\n# Retreive the results from the cluster as they become available and save as .nc files locally:\nfor date, result_da in results:\n result_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n\n# Since we manually scaled up the cluster, manually scale it back down to stop using resources:\ncorrmap_toda_parallel.cluster.scale(1)\n\n\nt2 = time.time()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 555.63 seconds = 9.2605 minutes.\n\n\n\ncorrmap_toda_parallel.cluster.shutdown()\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 73, lat: 320, lon: 718)>\ndask.array<concatenate, shape=(73, 320, 718), dtype=float64, chunksize=(1, 320, 718), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.5 1.0 1.5 2.0 ... 356.5 357.0 357.5 358.0 358.5\n * lat (lat) float64 -80.0 -79.5 -79.0 -78.5 -78.0 ... 78.0 78.5 79.0 79.5\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 73lat: 320lon: 718dask.array<chunksize=(1, 320, 718), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n127.96 MiB\n1.75 MiB\n\n\nShape\n(73, 320, 718)\n(1, 320, 718)\n\n\nDask graph\n73 chunks in 220 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 718 320 73\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.5 1.0 ... 357.5 358.0 358.5array([ 0. , 0.5, 1. , ..., 357.5, 358. , 358.5])lat(lat)float64-80.0 -79.5 -79.0 ... 79.0 79.5array([-80. , -79.5, -79. , ..., 78.5, 79. , 79.5])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5,\n ...\n 354.0, 354.5, 355.0, 355.5, 356.0, 356.5, 357.0, 357.5, 358.0, 358.5],\n dtype='float64', name='lon', length=718))latPandasIndexPandasIndex(Index([-80.0, -79.5, -79.0, -78.5, -78.0, -77.5, -77.0, -76.5, -76.0, -75.5,\n ...\n 75.0, 75.5, 76.0, 76.5, 77.0, 77.5, 78.0, 78.5, 79.0, 79.5],\n dtype='float64', name='lat', length=320))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", "crumbs": [ - "Workshops" + "Advanced Cloud", + "Dask and Coiled", + "Coiled Function Replication Example" ] }, { - "objectID": "quarto_text/Workshops.html#swot-early-career-researcher-workshop-using-binder", - "href": "quarto_text/Workshops.html#swot-early-career-researcher-workshop-using-binder", - "title": "Workshops", - "section": "2024 SWOT Early Career Researcher Workshop Using Binder", - "text": "2024 SWOT Early Career Researcher Workshop Using Binder\nhttps://github.com/podaac/2024-SWOT-ECR-Workshop\nExplore SWOT data on a Binder virtual environment or local machine. This material was presented at the 9th Global Energy and Water Exchanges (GEWEX) Open Science Conference and the Hacking Limnology 2024 Virtual Summit Remote Sensing Day.", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#other-notes", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#other-notes", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "Other notes", + "text": "Other notes\n\nWhen using coiled.function(), we passed the argument n_workers=73 because we knew we wanted 73 workers to process the 73 files. However, this arg isn’t mandatory - if we left it out, Coiled would have started with 1 worker and then “adaptively scaled”, figuring out that it needed 73 workers to do the job faster. It takes a few extra minutes for Coiled to figure out exactly how many workers to scale up to, so we short-cutted the process here.\nWhen we made the call to coiled.function() we chose input args which would prioritize computation time over cost. Alternate choices could be made to prioritize cost instead, e.g. the following should be less expensive:\n\ncoiled.function(region=\"us-west-2\", cpu=1, arm=True, spot_policy=\"spot_with_fallback\", environ=earthaccess.auth_environ())(corrmap_toda)", "crumbs": [ - "Workshops" + "Advanced Cloud", + "Dask and Coiled", + "Coiled Function Replication Example" ] }, { - "objectID": "quarto_text/Workshops.html#swot-data-access-workshop", - "href": "quarto_text/Workshops.html#swot-data-access-workshop", - "title": "Workshops", - "section": "2024 SWOT Data Access Workshop", - "text": "2024 SWOT Data Access Workshop\nhttps://podaac.github.io/2024-SWOT-Hydro-Workshop/\nThe Surface Water and Ocean Topography (SWOT) satellite, a joint NASA-CNES venture, provides unprecedented measurements of surface water extents and elevations for hydrologic science and applications. This workshop focuses on the SWOT Hydrology datasets including river and lake vector data in shapefiles, and raster, pixel cloud, and pixel vector data in netCDF. In this pre-meeting workshop for the AGU Chapman: Remote Sensing of the Water Cycle Conference, participants are introduced to SWOT and the various ways to access and utilize its data products, including via cloud computing, local download, and data transformation tools.", + "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", + "href": "notebooks/Advanced_cloud/coiled_function_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", + "title": "Parallel Computing with Earthdata in the Cloud", + "section": "5. Optional: Parallel computation on full record at 0.25 degree resolution", + "text": "5. Optional: Parallel computation on full record at 0.25 degree resolution\nOnly Section 1 needs to be run prior to this. Sections 2-4 can be skipped.\nThis section mirrors the workflow of Section 4, but processes all 1808 pairs of files, spanning a little over two decades, at higher resolution. To get an estimate of how long this would take without parallel computing, you can re-run section 3 but replace a value of 0.5 for the higher_res variable with 0.25 (in the part where we estimate comp times). Trying this on a few machines, we get that it would take anywhere from 21 to 34 hours to process the record over a single year, which means for 22 years it would take 19 to 31 days to complete the entire record. When we used this code to run the computation in parallel on a 250 t4g.small instances, computation took us instead ~5 hours and cost ~\\(\\$\\) 20, obtaining the following mean map for the full record:\n\n\n\nimage.png\n\n\nFirst, we duplicate most of the code in Section 2, this time getting granule info objects for the entire record:\n\nearthaccess.login()\n\n## Granule info for all files in both collections:\ngrans_ssh = earthaccess.search_data(short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\")\ngrans_sst = earthaccess.search_data(short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\")\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nGranules found: 2207\nGranules found: 9039\n\n\nSame function to parallelize as in Section 4:\n\ndef corrmap_toda(grans, lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and collects output into an \n Xarray DataArray. Returns this along with the date of the file coverages.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n return date, xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n\nSome prep work:\n\n# Re-create the local directory to store results in:\ndir_results = \"results/\"\nif os.path.exists(dir_results) and os.path.isdir(dir_results):\n shutil.rmtree(dir_results)\nos.makedirs(dir_results)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80.1, 0.25)\nlons = np.arange(0, 360, 0.25)\n\nthen setup the parallel computations and run!\n\n## -----------------------------\n## Perform and time computations\n## -----------------------------\n\nt1 = time.time()\n\n\n# Wrap function in a Coiled function. Here is where we make cluster specifications like VM type:\ncorrmap_toda_parallel = coiled.function(\n region=\"us-west-2\", spot_policy=\"on-demand\", \n vm_type=\"t4g.small\", # General purpose vm that strikes a balance between performance and cost.\n environ=earthaccess.auth_environ(), # Ensure our EDL credentials are passed to each worker.\n n_workers=[0,250] # Adaptively scale to at most 250 VM's. Will go back to 0 once finished.\n )(corrmap_toda)\n\n# Begin computations:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\nresults = corrmap_toda_parallel.map(\n grans_2tuples, lat_halfwin=3, lon_halfwin=3, \n lats=lats, lons=lons, f_notnull=0.5\n )\n\n# Retreive the results from the cluster as they become available and save as .nc files locally:\nfor date, result_da in results:\n result_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n\n# shutdown cluster:\ncorrmap_toda_parallel.cluster.shutdown()\n\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", "crumbs": [ - "Workshops" + "Advanced Cloud", + "Dask and Coiled", + "Coiled Function Replication Example" ] }, { - "objectID": "quarto_text/Workshops.html#agu-cloud-workshop", - "href": "quarto_text/Workshops.html#agu-cloud-workshop", - "title": "Workshops", - "section": "2023 AGU Cloud Workshop", - "text": "2023 AGU Cloud Workshop\nhttps://nasa-openscapes.github.io/2023-Cloud-Workshop-AGU/\nIn this workshop, NASA Openscapes Mentors from NASA’s Earth Observing System Data and Information System (EOSDIS) DAACs (data centers) teach the foundations of an open science mindset and apply these concepts to work in the cloud with NASA Earthdata. Participants take part in hands-on tutorials using a JupyterHub managed by 2i2c in AWS. The goal is to teach participants how to leverage data and services from NASA Earthdata Cloud within their work across a variety of disciplines and data types, as well as how to apply the concepts of open science as a daily practice.", - "crumbs": [ - "Workshops" - ] - }, - { - "objectID": "quarto_text/Workshops.html#s-mode-open-data-workshop", - "href": "quarto_text/Workshops.html#s-mode-open-data-workshop", - "title": "Workshops", - "section": "2022 S-MODE Open Data Workshop", - "text": "2022 S-MODE Open Data Workshop\nhttps://espo.nasa.gov/s-mode/content/S-MODE_2022_Open_Data_Workshop - Recordings and Presentations - Github tutorials\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) science team is hosted a virtual Open Data Workshop on 1 December 2022 from 11:00am – 1:00pm ET to share about the S-MODE mission, to learn about its instrumentation, and find out how to access and use its data products.", - "crumbs": [ - "Workshops" - ] + "objectID": "notebooks/MODIS_L2P_SST_DataCube.html#before-you-start", + "href": "notebooks/MODIS_L2P_SST_DataCube.html#before-you-start", + "title": "The following notebook is no longer supported, see this related notebook highlighting Zarr Data Cubes", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nfrom urllib import request, parse\nfrom http.cookiejar import CookieJar\nimport getpass\nimport netrc\nimport requests\nimport urllib\nimport json\nimport pprint\nimport time\nimport os\nfrom os import makedirs, path\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport shutil\nfrom osgeo import gdal, gdalconst\n#from nco import Nco\nimport glob\n#import shutil\nimport xarray as xr\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\n%matplotlib inline\n\n\n# Constants\n\n# the local download directory\ndownload_dir = \"./modis-datacube-output\"\n\n# URS, CMR, Harmony roots\nedl = \"urs.earthdata.nasa.gov\"\ncmr = \"cmr.earthdata.nasa.gov\"\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\ndownload_dir = os.path.abspath(download_dir) + os.path.sep\nPath(download_dir).mkdir(parents=True, exist_ok=True)" }, { - "objectID": "quarto_text/Workshops.html#swot-ocean-cloud-workshop", - "href": "quarto_text/Workshops.html#swot-ocean-cloud-workshop", - "title": "Workshops", - "section": "2022 SWOT Ocean Cloud Workshop", - "text": "2022 SWOT Ocean Cloud Workshop\nhttps://podaac.github.io/2022-SWOT-Ocean-Cloud-Workshop/\nThe goal of the workshop is to get ready for Surface Water and Ocean Topography (SWOT) and enable the (oceanography) science team to be ready for processing and handling the large volumes of SWOT SSH data in the cloud. Learning objectives focus on how to access the simulated SWOT L2 SSH data from Earthdata Cloud either by downloading or accessing the data on the cloud. PO.DAAC is the NASA archive for the SWOT mission, and once launched will be making data available via the NASA Earthdata Cloud, hosted in AWS.", - "crumbs": [ - "Workshops" - ] + "objectID": "notebooks/MODIS_L2P_SST_DataCube.html#perform-the-subsetting-operation-using-the-earthdata-harmony-service", + "href": "notebooks/MODIS_L2P_SST_DataCube.html#perform-the-subsetting-operation-using-the-earthdata-harmony-service", + "title": "The following notebook is no longer supported, see this related notebook highlighting Zarr Data Cubes", + "section": "Perform the subsetting operation using the Earthdata Harmony service", + "text": "Perform the subsetting operation using the Earthdata Harmony service\nHarmony allows us to use a CMR style query to find and subset all matching granules for a collection, datetime, and spatial bounding box.\n\ntry: \n harmonyConfig = {\n 'collection_id': ccid, \n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'lat': '(' + str(south) + \":\" + str(north) + ')',\n 'lon': '(' + str(west) + \":\" + str(east) + ')', \n 'start': start_time,\n 'stop': stop_time\n }\n\n # subset granule\n async_url = harmony_root + '/{collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?subset=lat{lat}&subset=lon{lon}&subset=time(\"{start}\":\"{stop}\")'.format(**harmonyConfig)\n\n print('Request URL', async_url)\n async_response = request.urlopen(async_url)\n async_results = async_response.read()\n async_json = json.loads(async_results)\n pprint.pprint(async_json)\n\n\nexcept urllib.error.HTTPError as e:\n print(f\" [{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n{e.read()}\\n\")\n raise e \nexcept Exception as e:\n print(f\" [{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n \n\nMonitor the Harmony job\n\njobConfig = {\n 'jobID': async_json['jobID']\n}\n\njob_url = harmony_root+'/jobs/{jobID}'.format(**jobConfig)\nprint('Job URL', job_url)\n\n\n\njob_response = request.urlopen(job_url)\njob_results = job_response.read()\njob_json = json.loads(job_results)\n\nprint('Job response:')\nprint()\npprint.pprint(job_json)\nwhile job_json['status'] == 'running' and job_json['progress'] < 100:\n print('Job status is running. Progress is ', job_json['progress'], '%. Trying again.')\n time.sleep(10)\n loop_response = request.urlopen(job_url)\n loop_results = loop_response.read()\n job_json = json.loads(loop_results)\n if job_json['status'] == 'running':\n continue\n\nDownload subsets to local computer\n\n# Download the data\nfile_urls = []\n\nfor job_result in job_json['links']:\n\n download_url = job_result['href']\n file_name = job_result['title']\n if file_name == 'Job Status':\n continue\n \n if file_name == 'STAC catalog':\n continue\n \n print(\"downloading \" + file_name)\n \n #store output in a defined directory with a meaninful filename based on orginal name\n out_file = download_dir + file_name\n print(out_file)\n file_urls.append(out_file)\n with request.urlopen(download_url) as response, open(out_file, 'wb') as output:\n shutil.copyfileobj(response, output) \n \n \n\nPerform resampling/reprojection on subsets using the GDAL module and gdal.Warp(). GDAL will only work on one variable (“layer”) at a time and also strip out important CF metadata and coordinate variables. Therefore we will use NCO tricks to correct these artifacts here and in the next steps. Use the ‘pynco’ module for NCO python bindings.\n\nnco = Nco()\n\n# Keyword args for gdal.Warp():\n# Set the output size in decimal degrees close to 1 km native resolution.\n# Use 'bilinear' interpolation (another option is 'cubicspline')\nkwargs = {'format': 'netCDF', 'copyMetadata': True, \n 'outputBounds': [west, south, east, north], \n 'xRes': 0.01,\n 'yRes' : 0.01,\n 'dstSRS':'+proj=longlat +datum=WGS84 +no_defs',\n 'resampleAlg': 'bilinear',\n }\nprint(kwargs)\n\nnc_vars = ['sea_surface_temperature', 'quality_level']\n\n# Loop through subsetted files (use file_urls as the loop list) and warp into defined region from kwargs{}\n\nfor i in range(len(file_urls)):\n for j in range(len(nc_vars)): \n variable = nc_vars[j]\n \n # input filename\n src_filename = file_urls[i] \n print(\"source filename: \", src_filename)\n \n # load the netCDF 'layer' like sea_surface_temperature (variable)\n nc_file = 'NETCDF:' + src_filename + ':' + variable\n print(nc_file)\n \n # try/catch for GDAL steps. Dont work on empty netCDF file from subsetting operation \n try:\n src = gdal.Open(nc_file, gdalconst.GA_ReadOnly)\n\n # set output filename\n out_filename = download_dir + 'subset_reproject-' + variable + '-' + basename(file_urls[i]) \n ds = gdal.Warp(out_filename, src, **kwargs)\n print(\"\")\n\n del ds\n del src \n \n # add time dimenson to 'Band1' using NCO\n nco.ncecat(input=out_filename, output='tmp.nc', options=['-v Band1 -u time'])\n nco.ncks(input='tmp.nc', output=out_filename, options=['-v Band1'])\n\n # use NCO to copy (append with -A ) the time variable to the output and make it a record dimension\n nco.ncks(input=src_filename, output=out_filename, options=['-v time -A --mk_rec_dmn time'])\n\n except Exception as e:\n #Errors can happen when downloading subsetted files because some might \n #not actually fall in the bounding box, and are returned 'empty'\n print(f\" [{datetime.now()}] FAILURE: \\n\")\n \n else:\n print(f\" [{datetime.now()}] SUCCESS for: {out_filename}\")\n print()\n\nAdd variable level CF metadata information that GDAL stripped out using NCO commands. Use the ‘pynco’ module for NCO python bindings.\n\nnco = Nco()\n\nsstConfig = {\n 'scale_factor': 0.005, \n 'add_offset': 273.15,\n 'valid_max': 10000,\n 'valid_min': -1000,\n 'long_name': 'sea surface temperature',\n 'standard_name': 'sea_surface_skin_temperature',\n 'coverage_content_type': 'physicalMeasurement'\n }\n\nqualityConfig = {\n 'valid_max': 0,\n 'valid_min': 5, \n 'flag_values': '0b, 1b, 2b, 3b, 4b, 5b',\n 'flag_meanings': 'no_data bad_data worst_quality low_quality acceptable_quality best_quality',\n 'long_name': 'quality level of SST pixel',\n 'coverage_content_type': 'qualityInformation'\n }\n \nnc_vars = ['sea_surface_temperature', 'quality_level']\nos.chdir(download_dir)\n\nfor i in range(len(nc_vars)): \n variable = nc_vars[i]\n reg_ex = \"subset*\" + variable + \"*\"\n for file in glob.glob(reg_ex):\n if variable == 'sea_surface_temperature':\n print(\" -> Updating \"+ file)\n nco.ncrename(input=file, output=file, options=['-v .Band1,sea_surface_temperature'])\n \n\n # update the SST variable attributes\n nco.ncatted(input=file, output=file, options=['-a scale_factor,'+ variable + ',o,f,{scale_factor}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a add_offset,'+ variable + ',o,f,{add_offset}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_min,'+ variable + ',o,s,{valid_min}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_max,'+ variable + ',o,s,{valid_max}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a long_name,'+ variable + ',o,c,\"{long_name}\"'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a standard_name,'+ variable + ',o,c,{standard_name}'.format(**sstConfig)])\n nco.ncatted(input=file, output=file, options=['-a coverage_content_type,'+ variable + ',o,c,{coverage_content_type}'.format(**sstConfig)])\n \n elif variable == 'quality_level':\n print(\" -> Updating \"+ file)\n \n nco.ncrename(input=file, output=file, options=['-v .Band1,' + variable])\n\n # update the quality variable attributes\n nco.ncatted(input=file, output=file, options=['-a valid_min,'+ variable + ',o,s,{valid_min}'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a valid_max,'+ variable + ',o,s,{valid_max}'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a long_name,'+ variable + ',o,c,\"{long_name}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a flag_values,'+ variable + ',o,c,\"{flag_values}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a flag_meanings,'+ variable + ',o,c,\"{flag_meanings}\"'.format(**qualityConfig)])\n nco.ncatted(input=file, output=file, options=['-a coverage_content_type,'+ variable + ',o,c,{coverage_content_type}'.format(**qualityConfig)])\n \n \nprint( \"-Done-\\n\")\n\nCreate the MODIS SST Data Cube. Copy variable(s) to SST target files and catenate all of them into a final output netCDF file using NCO.\n\nnco = Nco()\nos.chdir(download_dir)\n\n\n# Loop through the SST files and add variable quality_level to SST file (target)\nreg_ex = \"subset_reproject-sea_surface_temperature*\"\n\nprint( \"Copying quality_level variables to target sst files . . .\")\nfor sst_file in glob.glob(reg_ex): \n quality_file = sst_file.replace(\"sea_surface_temperature\", \"quality_level\") \n nco.ncks(input=quality_file, output=sst_file, options=['-v quality_level -A'])\n \n \n# Create the data cube using NCO ncrcat command\nprint(\". . . -Done- \\n\\nCreating MODIS SST data cube . . . \")\nnco.ncrcat(input=glob.glob(reg_ex), output='MODIS_SST.data-cube.nc')\nprint(\". . . -Done- \\n\")\n\n\nRead the data with xarray and perform some plotting\n\ndataCube = download_dir + 'MODIS_SST.data-cube.nc'\nxds = xr.open_dataset(dataCube)\n\n# create objects for subplots\nfig, axes = plt.subplots(ncols=2)\n\n# plot a time series at a specific location\nxds.sea_surface_temperature.isel(lat = 200, lon = 300).plot(ax=axes[0], marker = '.', linestyle = 'None')\n\n# a histogram of all points in region of interest\nxds.sea_surface_temperature.plot(ax=axes[1])\n\nplt.tight_layout()\nplt.draw()\n\n# filter the dataset using quality information (quality_level value 4 and 5 are best data)\nqc_dataset = xds.where((xds['sea_surface_temperature'] < 310) & (xds['quality_level'] >= 4))\n\n# re-plot the time series at a specific location and the regional histogram\nfig, axes = plt.subplots(ncols=2)\nqc_dataset.sea_surface_temperature.isel(lat = 200, lon = 300).plot(ax=axes[0], marker = '.', linestyle = 'None')\nqc_dataset.sea_surface_temperature.plot(ax=axes[1])\n\nplt.tight_layout()\nplt.draw()" }, { - "objectID": "quarto_text/Workshops.html#cloud-agu-workshop", - "href": "quarto_text/Workshops.html#cloud-agu-workshop", - "title": "Workshops", - "section": "2021 Cloud AGU Workshop", - "text": "2021 Cloud AGU Workshop\nhttps://nasa-openscapes.github.io/2021-Cloud-Workshop-AGU\nThe 2021 Cloud Workshop at AGU: Enabling Analysis in the Cloud Using NASA Earth Science Data is a virtual half-day collaborative open science learning experience aimed at exploring, learning, and promoting effective cloud-based science and applications workflows using NASA Earthdata Cloud data, tools, and services (among others), in support of Earth science data processing and analysis in the era of big data.", + "objectID": "index.html#welcome", + "href": "index.html#welcome", + "title": "PO.DAAC Cookbook", + "section": "Welcome!", + "text": "Welcome!\nWelcome to the tutorial repository for the Physical Oceanography Distributed Active Archive Center (PO.DAAC)! Our goal is to make NASA’s ocean, climate, and surface water data universally accessible and meaningful.\nThis site is under active, open development. Stay tuned for more and ever-evolving content!", "crumbs": [ - "Workshops" + "Welcome" ] }, { - "objectID": "quarto_text/Workshops.html#cloud-hackathon", - "href": "quarto_text/Workshops.html#cloud-hackathon", - "title": "Workshops", - "section": "2021 Cloud Hackathon", - "text": "2021 Cloud Hackathon\nhttps://nasa-openscapes.github.io/2021-Cloud-Hackathon\nThe Cloud Hackathon: Transitioning Earthdata Workflows to the Cloud is a virtual 5-day (4 hours per day) collaborative open science learning experience aimed at exploring, creating, and promoting effective cloud-based science and applications workflows using NASA Earthdata Cloud data, tools, and services (among others), in support of Earth science data processing and analysis in the era of big data. Its goals are to:\n\nIntroduce Earth science data users to NASA Earthdata cloud-based data products, tools and services in order to increase awareness and support transition to cloud-based science and applications workflows.\nEnable science and applications workflows in the cloud that leverage NASA Earth Observations and capabilities (services) from within the NASA Earthdata Cloud, hosted in Amazon Web Services (AWS) cloud, thus increasing NASA Earthdata data utility and meaningfulness for science and applications use cases.\nFoster community engagement utilizing Earthdata cloud tools and services in support of open science and open data.", + "objectID": "index.html#about-the-cookbook", + "href": "index.html#about-the-cookbook", + "title": "PO.DAAC Cookbook", + "section": "About the Cookbook", + "text": "About the Cookbook\nThe PO.DAAC Cookbook is a place to learn about & experiment with the NASA Earthdata datasets we host. All data can be accessed freely in the cloud or downloaded locally. The How To section gives bite-sized pieces of code created in collaboration with the NASA Earthdata Cloud Cookbook community. Tutorials connect these pieces together to form example workflows specific to PO.DAAC datasets both within the cloud and on a local machine. To learn more about the cloud specifically, see the Earthdata Cloud Primer.\nMost tutorials included in this cookbook are created with Python Jupyter Notebooks. All chapters in the cookbook are a combination of narrative, links, code, and outputs — and underlying each chapter is a file type that you can access on PO.DAAC GitHub (linked on the left navbar): Jupyter (.ipynb) or Quarto (.qmd) files.", "crumbs": [ - "Workshops" + "Welcome" ] }, { - "objectID": "quarto_text/GHRSST.html#background", - "href": "quarto_text/GHRSST.html#background", - "title": "GHRSST", - "section": "Background", - "text": "Background\nThe Group for High Resolution Sea Surface Temperature (GHRSST) was established in 2002 to foster an international focus and coordination for the development of a new generation of global, multi-sensor, high-resolution near real time SST datasets. It brings together international space agencies, research institutes, universities, and government agencies to collectively address the scientific, logistical and managerial challenges posed by creating the SST datasets and services within the Project. The overall aim of the GHRSST is to provide the best quality sea surface temperature data for applications in short, medium and decadal/climate time scales in the most cost effective and efficient manner through international collaboration and scientific innovation. More information can be found on PO.DAAC’s GHRSST webpage.", + "objectID": "index.html#about-po.daac", + "href": "index.html#about-po.daac", + "title": "PO.DAAC Cookbook", + "section": "About PO.DAAC", + "text": "About PO.DAAC\nThe Physical Oceanography Distributed Active Archive Center (PO.DAAC) is a NASA Earth Observing System Data and Information System (EOSDIS) data center managed by the Earth Science Data and Information System (ESDIS) Project. The PO.DAAC is operated by Jet Propulsion Laboratory (JPL) in Pasadena, California.\nFor a brief overview of PO.DAAC’s history, see The Evolution of the PO.DAAC: Seasat to SWOT.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST" + "Welcome" ] }, { - "objectID": "quarto_text/GHRSST.html#data-resources-tutorials", - "href": "quarto_text/GHRSST.html#data-resources-tutorials", - "title": "GHRSST", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nMapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions - Utilizes the PO.DAAC Data Downloader to download SSTA from the GHRSST MUR climatology dataset and plot on a local machine.\n\n\nParallelizing MUR Computations with Dask in the Cloud - covers the basics of using Dask for parallel computing with the MUR dataset completely in the cloud\n\n\nQGIS - Mapping Sea Surface Temperature Anomalies - how to visualize and project SSTA in QGIS.\n\n\nUsing OPeNDAP to Access the MUR Sea Surface Temperature dataset - opening and visualizing the GHRSST MUR SST dataset using OPeNDAP.\n\n\nMUR Sea Surface Temperature Analysis of Washington State - Using earthaccess to open GHRSST MUR SST dataset in the cloud over Washington State.", + "objectID": "index.html#citation", + "href": "index.html#citation", + "title": "PO.DAAC Cookbook", + "section": "Citation", + "text": "Citation\nPlease cite the PO.DAAC Cookbook through the project’s Zenodo archive using DOI: 10.5281/zenodo.10530664. This DOI represents all versions, and will always resolve to the latest one.\nThe citation will look something like:\n\nNickles, C., Taglialatela, C., McNelis, J., Gangl, M., Ou, C., Tarpinian, N., McDonald, V., Henze, D., Tebaldi, N., Greguska, F., Perez, S., Wang, J., Armstrong, E., Sanchez, J., Walschots, Z., Liu, S., & Gentemann, C. (2024). podaac/tutorials: PO.DAAC Cookbook v2024.01 (v2024.01.18). Zenodo. https://doi.org/10.5281/zenodo.10530664\n\nPlease visit the Cookbook’s DOI link to get the most recent version - the one above is not automatically generated and may be out of date as we release updated versions of the Cookbook.\n\nDisclaimer\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST" + "Welcome" ] }, { - "objectID": "quarto_text/GHRSST.html#additional-resources", - "href": "quarto_text/GHRSST.html#additional-resources", - "title": "GHRSST", - "section": "Additional Resources", - "text": "Additional Resources\nGHRSST Project Page", + "objectID": "external/earthdata_search.html", + "href": "external/earthdata_search.html", + "title": "How do I find data using Earthdata Search?", + "section": "", + "text": "The original source for this document is https://nasa-openscapes.github.io/2021-Cloud-Workshop-AGU/tutorials/01_Earthdata_Search.html\nThis tutorial guides you through how to use Earthdata Search for NASA Earth observations search and discovery, and how to connect the search output (e.g. download or access links) to a programmatic workflow (locally or from within the cloud).\n\nStep 1. Go to Earthdata Search and Login\nGo to Earthdata Search https://search.earthdata.nasa.gov and use your Earthdata login credentials to log in. If you do not have an Earthdata account, please see the Workshop Prerequisites for guidance.\n\n\nStep 2. Search for dataset of interest\nUse the search box in the upper left to type key words. In this example we are interested in the ECCO dataset, hosted by the PO.DAAC. This dataset is available from the NASA Earthdata Cloud archive hosted in AWS cloud.\nClick on the “Available from AWS Cloud” filter option on the left. Here, 104 matching collections were found with the basic ECCO search.\n\n\n\nFigure caption: Search for ECCO data available in AWS cloud in Earthdata Search portal\n\n\nLet’s refine our search further. Let’s search for ECCO monthly SSH in the search box (which will produce 39 matching collections), and for the time period for year 2015. The latter can be done using the calendar icon on the left under the search box.\nScroll down the list of returned matches until we see the dataset of interest, in this case ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4).\nWe can click on the (i) icon for the dataset to read more details, including the dataset shortname (helpful for programmatic workflows) just below the dataset name; here ECCO_L4_SSH_05DEG_MONTHLY_V4R4.\n\n\n\nFigure caption: Refine search, set temporal bounds, get more information\n\n\n\n\nStep 3. Explore the dataset details, including Cloud Access information\nOnce we clicked the (i), scrolling down the info page for the dataset we will see Cloud Access information, such as:\n\nwhether the dataset is available in the cloud\nthe cloud Region (all NASA Earthdata Cloud data is/will be in us-west-2 region)\nthe S3 storage bucket and object prefix where this data is located\nlink that generates AWS S3 Credentials for in-cloud data access (we will cover this in the Direct Data Access Tutorials)\nlink to documentation describing the In-region Direct S3 Access to Buckets. Note: these will be unique depending on the DAAC where the data is archived. (We will show examples of direct in-region access in Tutorial 3.)\n\n\n\n\nFigure caption: Cloud access info in EDS\n\n\n\n\n\nFigure caption: Documentation describing the In-region Direct S3 Access to Buckets\n\n\nPro Tip: Clicking on “For Developers” to exapnd will provide programmatic endpoints such as those for the CMR API, and more. CMR API and CMR STAC API tutorials can be found on the 2021 Cloud Hackathon website.\nFor now, let’s say we are intersted in getting download link(s) or access link(s) for specific data files (granules) within this collection.\nAt the top of the dataset info section, click on Search Results, which will take us back to the list of datasets matching our search parameters. Clicking on the dataset (here again it’s the same ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4)) we now see a list of files (granules) that are part of the dataset (collection).\n\n\nStep 4. Customize the download or data access\nClick on the green + symbol to add a few files to our project. Here we added the first 3 listed for 2015. Then click on the green button towards the bottom that says “Download”. This will take us to another page with options to customize our download or access link(s).\n\n\n\nFigure caption: Select granules and click download\n\n\n\n4.a. Entire file content\nLet’s stay we are interested in the entire file content, so we select the “Direct Download” option (as opposed to other options to subset or transform the data):\n\n\n\nFigure caption: Customize your download or access\n\n\nClicking the green Download Data button again, will take us to the final page for instructions to download and links for data access in the cloud. You should see three tabs: Download Files, AWS S3 Access, Download Script:\n \nThe Download Files tab provides the https:// links for downloading the files locally. E.g.: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc\nThe AWS S3 Access tab provides the S3:// links, which is what we would use to access the data directly in-region (us-west-2) within the AWS cloud (an example will be shown in Tutorial 3). E.g.: s3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc where s3 indicates data is stored in AWS S3 storage, podaac-ops-cumulus-protected is the bucket, and ECCO_L4_SSH_05DEG_MONTHLY_V4R4 is the object prefix (the latter two are also listed in the dataset collection information under Cloud Access (step 3 above)).\nTip: Another quicker way to find the bucket and object prefix is from the list of data files the search returns. Next to the + green button is a grey donwload symbol. Click on that to see the Download Files https:// links or on the AWS S3 Access to get the direct S3:// access links, which contain the bucket and object prefix where data is stored.\n\n\n4.b. Subset or transform before download or access\nDAAC tools and services are also being migrated or developed in the cloud, next to that data. These include the Harmony API and OPeNDAP in the cloud, as a few examples.\nWe can leverage these cloud-based services on cloud-archived data to reduce or transform the data (depending on need) before getting the access links regardless of whether we prefer to download the data and work on a local machine or whether we want to access the data in the cloud (from a cloud workspace). These can be useful data reduction services that support a faster time to science.\nHarmony\nHarmony allows you to seamlessly analyze Earth observation data from different NASA data centers. These services (API endpoints) provide data reduction (e.g. subsetting) and transfromation services (e.g. convert netCDF data to Zarr cloud optimized format).\n\n\n\nFigure caption: Leverage Harmony cloud-based data transformation services\n\n\nWhen you click the final green Download button, the links provided are to data that had been transformed based on our selections on the previous screen (here chosing to use the Harmony service to reformat the data to Zarr). These data are staged for us in an S3 bucket in AWS, and we can use the s3:// links to access those specific data. This service also provides STAC access links. This particular example is applicable if your workflow is in the AWS us-west-2 region.\n\n\n\nFigure caption: Harmony-staged data in S3\n\n\n\n\n\nStep 5. Integrate file links into programmatic workflow, locally or in the AWS cloud.\nIn tutorial 3 Direct Data Access, we will work programmatically in the cloud to access datasets of interest, to get us set up for further scientific analysis of choice. There are several ways to do this. One way to connect the search part of the workflow we just did in Earthdata Search to our next steps working in the cloud is to simply copy/paste the s3:// links provides in Step 4 above into a JupyterHub notebook or script in our cloud workspace, and continue the data analysis from there.\nOne could also copy/paste the s3:// links and save them in a text file, then open and read the text file in the notebook or script in the JupyterHub in the cloud.\nTutorial 3 will pick up from here and cover these next steps in more detail.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST" + "How To", + "Find Data", + "using Earthdata Search" ] }, { - "objectID": "quarto_text/SMODE.html#background", - "href": "quarto_text/SMODE.html#background", - "title": "S-MODE", - "section": "Background", - "text": "Background\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) is a NASA Earth Venture Suborbital (EVS-3) mission that utilizes research aircraft equipped with state-of-the-art remote sensing instruments, a research vessel, Wave Gliders, Saildrones, and many other in situ assets. These instruments contribute to an unprecedented view of the physics of submesoscale eddies and fronts, and their effects on vertical transport in the upper ocean. The S-MODE investigation is composed of a Pilot Campaign (Fall 2021) and two Intensive Operating Periods (IOP-1 and IOP-2, Fall 2022 and Spring 2023). Each field campaign is between 3-4 weeks in duration. The scientific area of interest is located about 150 miles off the coast of San Francisco\nMore information can be found on PO.DAAC’s SMODE webpage.", + "objectID": "external/find_data_programmatically.html#introduction", + "href": "external/find_data_programmatically.html#introduction", + "title": "How do I find data using code?", + "section": "Introduction", + "text": "Introduction\nHere are our recommended approaches for finding data with code, from the command line or a notebook.\n\nPythonRMatlabCommand Line\n\n\nIn Python we can use the earthaccess library (renamed, previously earthdata)\nTo install the package we’ll run this code from the command line. Note: you can run shell code directly from a Jupyter Notebook cell by adding a !, so it would be !conda install.\n## In the command line\n## Install earthaccess\nconda install -c conda-forge earthaccess\nThis example searches for data from the Land Processes DAAC with a spatial bounding box and temporal range.\n## In Python\n## Import packages\nfrom earthaccess import DataGranules, DataCollections\nfrom pprint import pprint \n\n\n## We'll get 4 collections that match with our keyword of interest\ncollections = DataCollections().keyword(\"REFLECTANCE\").cloud_hosted(True).get(4)\n\n## Let's print 2 collections\nfor collection in collections[0:2]:\n print(pprint(collection.summary()) , collection.abstract(), \"\\n\")\n \n## Search for files from the second dataset result over a small plot in Nebraska, USA for two weeks in September 2022\ngranules = DataGranules().concept_id(\"C2021957657-LPCLOUD\").temporal(\"2022-09-10\",\"2022-09-24\").bounding_box(-101.67271,41.04754,-101.65344,41.06213)\nprint(len(granules))\ngranules\n\n\nTo find data in R, we’ll also use the earthaccess python package - we can do so from R using the reticulate package (cheatsheet). Note below that we import the python library as an R object we name earthaccess, as well as the earthaccess$ syntax for accessing functions from the earthaccess library. The granules object has a list of JSON dictionaries with some extra dictionaries.\n## In R\n## load R libraries\nlibrary(tidyverse) # install.packages(\"tidyverse\") \nlibrary(reticulate) # install.packages(\"reticulate\")\n\n## load python library\nearthaccess <- reticulate::import(\"earthaccess\") \n\n## use earthaccess to access data # https://nsidc.github.io/earthaccess/tutorials/search-granules/\ngranules <- earthaccess$search_data(\n doi = \"10.5067/SLREF-CDRV3\",\n temporal = reticulate::tuple(\"2017-01\", \"2017-02\") # with an earthaccess update, this can be simply c() or list()\n)\n\n## Granules found: 72\n\n## exploring\ngranules # this is the result of the get request. \n\nclass(granules) # \"list\"\n## granules <- reticulate::py_to_r(granules) # Object to convert is not a Python object\n\n\nMatlab code coming soon!\n## In Matlab\n## Coming soon!\n\n\nWith wget and curl:\n## In the command line\n## Coming soon!", "crumbs": [ - "Tutorials", - "Dataset Specific", - "S-MODE" + "How To", + "Find Data", + "using Code" ] }, { - "objectID": "quarto_text/SMODE.html#data-resources-tutorials", - "href": "quarto_text/SMODE.html#data-resources-tutorials", - "title": "S-MODE", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nScience Case Study Airborne\nThe DownloadDopplerScattData.ipynb notebook walks through creating the .netrc file and downloading the Dopplerscatt data used in this case study. The VisualizeDopplerScattData.ipynb notebook contains the Airborne Science Case Study data visualization and discussion. Instructions for installing the airborne material in a conda environment are contained in this Airborne Case Study README.\n\n\nScience Case Study In Situ\nThe insitu_dataviz_demo.ipynb notebook contains the In Situ Science Case Study data visualization and discussion. This notebook also contains sample code to run the PO.DAAC Data Downloader to download Saildrone data. Instructions for installing the necessary Python packages, and more information on obtaining S-MODE data are in the In Situ Case Study README.", + "objectID": "external/access-cloud-python.html#direct-access", + "href": "external/access-cloud-python.html#direct-access", + "title": "How do I access data stored in Earthdata Cloud in Python?", + "section": "Direct Access", + "text": "Direct Access\nWhen you have found the data you want to use, you have two options. You can download the data to work locally, or access the data directly to work in the cloud. This second way of working is called “Direct Cloud Access” or simply, “Direct Access”. Your compute instance needs to be in Amazon Web Services (AWS) Region us-west-2 in order for the code to run successfully. We authenticate using a netrc file and an Earthdata Login, see the appendix for more information on Earthdata Login and netrc setup.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "S-MODE" + "How To", + "Access Data", + "in the Cloud" ] }, { - "objectID": "quarto_text/SMODE.html#additional-resources", - "href": "quarto_text/SMODE.html#additional-resources", - "title": "S-MODE", - "section": "Additional Resources", - "text": "Additional Resources\n\nData in Action Story\nA Closer Look at the Sub-Mesoscale Ocean Dynamics Experiment (S-MODE)\n\n\n2022 S-MODE Open Data Workshop\nhttps://espo.nasa.gov/s-mode/content/S-MODE_2022_Open_Data_Workshop - Recordings and Presentations\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) science team hosted a virtual Open Data Workshop on 1 December 2022 from 11:00am – 1:00pm ET to share about the S-MODE mission, to learn about its instrumentation, and find out how to access and use its data products.", + "objectID": "external/access-cloud-python.html#python", + "href": "external/access-cloud-python.html#python", + "title": "How do I access data stored in Earthdata Cloud in Python?", + "section": "Python", + "text": "Python\nWe can use the earthaccess python library to grab the file URLs and then access them with the xarray library.\n\n#Import packages\nimport earthaccess\nimport xarray as xr\n\n\n#Authentication with Earthdata Login\nauth = earthaccess.login(strategy=\"netrc\")\n\n\n#Access land ice height from ATLAS/ICESat-2 V005 (10.5067/ATLAS/ATL06.005), searching for data over western Greenland coast over two weeks in July 2022. The data are provided as HDF5 granules (files) that span about 1/14th of an orbit.\n\nresults = earthaccess.search_data(short_name=\"ATL06\",\n version=\"006\",\n cloud_hosted=True,\n temporal = (\"2022-07-17\",\"2022-07-31\"),\n bounding_box = (-51.96423,68.10554,-48.71969,70.70529))\n\nGranules found: 5\n\n\n\n#Use xarray to load the data as a multifile dataset for a single group in the HDF5 file, in this case land ice segments:\nds = xr.open_mfdataset(earthaccess.open(results), group='/gt1l/land_ice_segments')\nds\n\n Opening 5 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (delta_time: 241711)\nCoordinates:\n * delta_time (delta_time) datetime64[ns] 2022-07-18T01:00:46.67...\n latitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n longitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\nData variables:\n atl06_quality_summary (delta_time) int8 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li_sigma (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n segment_id (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n sigma_geo_h (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\nAttributes:\n Description: The land_ice_height group contains the primary set of deriv...\n data_rate: Data within this group are sparse. Data values are provide...xarray.DatasetDimensions:delta_time: 241711Coordinates: (3)delta_time(delta_time)datetime64[ns]2022-07-18T01:00:46.678760592 .....contentType :referenceInformationdescription :Number of GPS seconds since the ATLAS SDP epoch. The ATLAS Standard Data Products (SDP) epoch offset is defined within /ancillary_data/atlas_sdp_gps_epoch as the number of GPS seconds between the GPS epoch (1980-01-06T00:00:00.000000Z UTC) and the ATLAS SDP epoch. By adding the offset contained within atlas_sdp_gps_epoch to delta time parameters, the time in gps_seconds relative to the GPS epoch can be computed.long_name :Elapsed GPS secondssource :section 4.4standard_name :timearray(['2022-07-18T01:00:46.678760592', '2022-07-18T01:00:46.681322640',\n '2022-07-18T01:00:46.684008720', ..., '2022-07-26T00:49:18.826637808',\n '2022-07-26T00:49:18.829449568', '2022-07-26T00:49:18.832263232'],\n dtype='datetime64[ns]')latitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Latitude of segment center, WGS84, North=+,long_name :Latitudesource :section 3.10standard_name :latitudeunits :degrees_northvalid_max :90.0valid_min :-90.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nlongitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Longitude of segment center, , WGS84, East=+long_name :Longitudesource :section 3.10standard_name :longitudeunits :degrees_eastvalid_max :180.0valid_min :-180.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nData variables: (5)atl06_quality_summary(delta_time)int8dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :The ATL06_quality_summary parameter indicates the best-quality subset of all ATL06 data. A zero in this parameter implies that no data-quality tests have found a problem with the segment, a one implies that some potential problem has been found. Users who select only segments with zero values for this flag can be relatively certain of obtaining high-quality data, but will likely miss a significant fraction of usable data, particularly in cloudy, rough, or low-surface-reflectance conditions.flag_meanings :best_quality potential_problemflag_values :[0 1]long_name :ATL06_Quality_Summarysource :section 4.3units :1valid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n236.05 kiB\n76.49 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Standard land-ice segment height determined by land ice algorithm, corrected for first-photon bias, representing the median- based height of the selected PEslong_name :Land Ice heightsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li_sigma(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Propagated error due to sampling error and FPB correction from the land ice algorithmlong_name :Expected RMS segment misfitsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsegment_id(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :referenceInformationdescription :Segment number, counting from the equator. Equal to the segment_id for the second of the two 20m ATL03 segments included in the 40m ATL06 segmentlong_name :Reference Point, msource :section 3.1.2.1units :1\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsigma_geo_h(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Total vertical geolocation error due to PPD and POD, including the effects of horizontal geolocation error on the segment vertical error.long_name :Vertical Geolocation Errorsource :ATBD Section 3.10units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nIndexes: (1)delta_timePandasIndexPandasIndex(DatetimeIndex(['2022-07-18 01:00:46.678760592',\n '2022-07-18 01:00:46.681322640',\n '2022-07-18 01:00:46.684008720',\n '2022-07-18 01:00:46.686753504',\n '2022-07-18 01:00:46.689526560',\n '2022-07-18 01:00:46.692315280',\n '2022-07-18 01:00:46.695049040',\n '2022-07-18 01:00:46.700724096',\n '2022-07-18 01:00:46.703545872',\n '2022-07-18 01:00:46.706366832',\n ...\n '2022-07-26 00:49:18.806914512',\n '2022-07-26 00:49:18.809737328',\n '2022-07-26 00:49:18.812559600',\n '2022-07-26 00:49:18.815380608',\n '2022-07-26 00:49:18.818200224',\n '2022-07-26 00:49:18.821015744',\n '2022-07-26 00:49:18.823827088',\n '2022-07-26 00:49:18.826637808',\n '2022-07-26 00:49:18.829449568',\n '2022-07-26 00:49:18.832263232'],\n dtype='datetime64[ns]', name='delta_time', length=241711, freq=None))Attributes: (2)Description :The land_ice_height group contains the primary set of derived ATL06 products. This includes geolocation, height, and standard error and quality measures for each segment. This group is sparse, meaning that parameters are provided only for pairs of segments for which at least one beam has a valid surface-height measurement.data_rate :Data within this group are sparse. Data values are provided only for those ICESat-2 20m segments where at least one beam has a valid land ice height measurement.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "S-MODE" + "How To", + "Access Data", + "in the Cloud" ] }, { - "objectID": "quarto_text/Contribute.html#make-suggestions-or-add-tutorials", - "href": "quarto_text/Contribute.html#make-suggestions-or-add-tutorials", - "title": "Contribute", - "section": "Make Suggestions or Add Tutorials!", - "text": "Make Suggestions or Add Tutorials!\nThese instructions are for anyone that would like to contribute tutorials that utilize (in part) NASA Earthdata to the PO.DAAC Cookbook. If you have cloned the PO.DAAC tutorials GitHub repository with all of the PO.DAAC Cookbook Notebooks, you can make changes on your copy of the tutorials and then create a pull request that will be reviewed by our team to potentially add your content. Follow these intructions on how to create a pull request in GitHub. If adding a new tutorial, within the Pull Request, state the section of the Cookbook you think your content would fit best and a member of PO.DAAC may link the tutorial so it renders within the Cookbook.\nAdded content will only be accepted if it follows these guidlines:\n\nFor Jupyter Notebook Tutorials, follow this template as a standard.\nFor tutorials outside of Jupyter Notebooks, the format must have the following sections:\n\nTitle\nAuthor Name/Affiliation\nSummary\nRequirements (the compute environment used, requirements to run the notebook (needed packages etc.))\nLearning Objectives\n\nThe tutorial must be tested successfully and reviewed by a PO.DAAC member non-author. (This will be done before merging the pull request.)", + "objectID": "external/access-cloud-python.html#end-user-license-agreement-eula", + "href": "external/access-cloud-python.html#end-user-license-agreement-eula", + "title": "How do I access data stored in Earthdata Cloud in Python?", + "section": "End User License Agreement (EULA)", + "text": "End User License Agreement (EULA)\nSometimes, accessing data in NASA Earthdata Cloud requires an End-User License Agreement (EULA). If you cannot access a dataset, this may be your issue! See these instructions for how to authorize EULAs.", "crumbs": [ - "Contribute" + "How To", + "Access Data", + "in the Cloud" ] }, { - "objectID": "quarto_text/Contribute.html#instructions-for-po.daac-contributors", - "href": "quarto_text/Contribute.html#instructions-for-po.daac-contributors", - "title": "Contribute", - "section": "Instructions for PO.DAAC Contributors", - "text": "Instructions for PO.DAAC Contributors\n\nHow the Cookbook was Built\nThe PO.DAAC Cookbook is built using Quarto. To build this particular Quarto book, we used these instructions from NASA Openscapes. It’s a Quarto book tutorial on how to copy (fork or download) an existing Quarto website like this one and adapt it for your own uses.\n\n\nSetting up your Work Station\nAdmittedly, there are many ways to set up your work station to effectively accomplish contributing to or editing the PO.DAAC Cookbook quarto website. Steps 1, 2, 4, and 6 are universal to edit the cookbook, but steps 3 and 5 can have variations. The following is a method we have found to be helpful:\n1. Creat a GitHub Account - If you do not have one already, create a GitHub account here: https://github.com/.\n2. Join a team on the podaac repository - Once you have a GitHub account, in the podaac repository, request to join the PO.DAAC team that best suits your position here. This will give you the permissions required to contribute as a PO.DAAC Member.\n3. Set Up your Coding Workspace - On a local machine, I tend to deploy Jupyter Lab (where I do most of my coding) from Anaconda Navigator. RStudio, VS Code, etc. could also work, depending on which you prefer. The workflow would also work on a cloud environment, where I also tend to use the Jupyter Lab interface.\n4. Install Quarto - download and install Quarto’s latest version here.\n5. Pick your Prefered Method to Interface with GitHub in your Workspace - GitHub Desktop makes it easy for me to track my changes and create Pull Requests without needing to remember commands in a the command line interface. If you prefer to use the command line, this is a comprehensive and maintained list of git commands that may be useful.\n6. Clone the podaac/tutorials GitHub Repository - Instructions to do this are in the Tech Guides Section of this Cookbook. If using GitHub Desktop, say no when it asks you if you would like to fork the repository. A fork creates a completely independent copy of the repository while a clone creates a linked copy that will continue to synchronize with the tutorials repository.\nIf you’ve completed the above, you should have all the necessary ingredients to contribute to the PO.DAAC Cookbook!\n\n\nTutorials Repository Organization\nEach chapter in our Cookbook is a separate .qmd markdown file within the quarto_text directory. The notebooks directory holds all of our internal tutorials that get rendered in the Cookbook. images contains all figures embedded within the Cookbook files.\nThe Cookbook structure (i.e. the order of sections and chapters) is determined in the _quarto.yml file in the root directory. We can shuffle chapter order by editing the _quarto.yml file, and add new chapters by adding to the _quarto.yml and creating a new file in the appropriate sub-directory that is indicated in _quarto.yml.\n\n\nHow to Edit Cookbook Content\n1. Create a New Branch in GitHub - In a GitHub repository, the main source of code for that repo is deployed in what is called the “Master” branch. This is the branch that the PO.DAAC Cookbook is rendered from. To edit, creating a new branch is important so changes are not overwritten on the master branch if another individual is working on the same file as you. It helps to have your own branch to work on (named however you like) to make changes and then merge those changes with the master branch after changes are done. After merging, it is common practice to delete the branch you created. I like to create a new branch from GitHub Desktop like so:\n\n\n\n\n\n2. Navigate to the tutorials Folder in your Coding Workspace - once you’ve created a new branch, any code you modify in your coding workspace from the repository you cloned should have tracked changes in your new branch. You can open any file in the tutorials folder and start editing! Here is what my Jupyter Lab workspace looks like:\n\n\n\n\n\n3. Tip for Previewing Changes in the Cookbook - To implement changes in the actual Cookbook, usually those changes need to be committed to your new branch and pulled into the master branch using a Pull Request (outlined below). Most of the time though, it is nice to see what your changes would look like visually in the Cookbook before you commit to them. To open up a preview page of the cookbook from your workspace, open up the terminal and change the directory to your tutorials folder location. Once there, type in quarto preview and another tab should open up in your browser that changes every time you save a change to your files. Here is a screenshot of my terminal opening the preview session:\n\n\n\n\n\nNote: the warnings about external files are fine. We do not host the external files in our repo, but link to them from other repos around GitHub, so they will not be rendered in the preview session. They will render in the actual Cookbook when your branch is merged with the master branch.\n4. Open the File you Wish to Edit - Most text within the Cookbook can be found in a .qmd file within the quarto_text folder\n5. Make Edits - GitHub should track your changes automatically. For example below, I have opened the ‘Contribute.qmd’ file in my Jupyter Lab and in the GitHub Desktop application, it shows all of the changes I have made in green and the old version in red. Here, I changed the text describing tutorial guidelines. Here is a helpful guide for Markdown Basics in Quarto.\n\n\n\n\n\n6. Commit Changes to your Branch and Push to Origin - I like to use GitHub Desktop for this, but you can also use the terminal using git commands.\n\n\n\n\n\n7. Create a Pull Request to Merge your Branch with the Master Branch - From the GitHub Desktop, you can then select “Create Pull Request” and it should open a browser window taking you to the tutorials repository in GitHub. In that browser window, if the information is not already populated from your commit, Add a descriptive title, outline any changes made, add reviewers within PO.DAAC that you think would be able to review your notebook, and then press “Create pull request.” A reviewer will look over your changes and either give feedback on improvements to be made before merging is enabled or accept the changes and merge your branch into the master branch.\n\n\n\n\n\n8. Delete your Branch after Merge is Complete - it is common practice to delete old branches and start again with new branches for new edits.\n\n\nHow to Add Tutorials and Display them in the Cookbook\nAdding tutorials to the podaac/tutorials GitHub repository as a PO.DAAC Contributor should follow the same instructions as those outside of PO.DAAC. See above.\nAfter a tutorial has been added to the repository, however, in order for it to display in the Cookbook, a couple more files need to be updated:\n1. The _quarto.yml file - This file is essentially the table of contents of the PO.DAAC Cookbook, telling quarto where to place a tutorial or file in the Cookbook. Write the path of the added tutorial in the appropriate desired location.\n2. The specific landing page .qmd file - This is the .qmd file that houses the section the tutorial will be in. I usually link the added tutorial on this homepage for the section.\nFor Example, here is a screenshot of the current ECCO portion of the _quarto.yml file and the ECCO.qmd file. The Use Case Demo notebook is hightlighted in both places it is linked. The notebook sits under multiple sections, first and formost, the “Tutorials” Section, and within that, the “Dataset Specific Examples” Section and finally, the “ECCO” page. In the .yml file, we gave the tutorial a title after the “text:” portion, which will be visible on the left hand side table of contents in the rendered Cookbook. Underneath the title, the notebook GitHub path is written out after “href:” as shown. The ECCO.qmd file hosts the information regarding the available ECCO tutorials, and somewhere within this page, the new tutorial should be linked. Note: this link may have a slightly different path starting point than the .yml file because the .qmd files are within a subfolder of the tutorials repo. You will likely need to add a “../” before the path in the .qmd file.\n\n\n\n\n\n\nGuidance for Dataset Specific Tutorials Section\nOnce a couple tutorials have been created for a particular mission, it is useful to add a page under the “Dataset Specific Tutorials” Section in the Cookbook for the tutorials. To add one, create a .qmd file in the quarto_text folder with the mission name as the file name. A good example for this would be the ECCO.qmd file or the SWOT.qmd file. Each Dataset Specific Landing Page should have the following sections:\n\nTitle of Mission\nBackground - a brief over view of the mission and products that links to the PO.DAAC webpage for the mission\nData Resources & Tutorials - this section can have sub-sections grouping resources)\nAdditional Resources - links to workshops or other useful materials relating to the mission)\n\n\n\n\nHow to Link to Notebook Tutorials Hosted in Other Repositories\nWe can include remote notebooks in the Cookbook by explicitly importing them with the following steps. This will create a local copy of them that have additional preamble inserted that includes the original urls and attribution for the notebook.\n\nNavigate to the _import directory.\nOpen assets.json in a text editor. Copy an existing example and use the same structure to indicate the remote notebook you’d like to include. You can write Markdown in the preamble.\n\ntitle: this will be the new title of the notebook\npreamble: this text will be inserted into the notebook below the new title. It should include any description and attribution of the notebook. The preamble is followed by two URL fields (next):\nsource: the url landing page of the specific notebook.\nurl: the raw url of the notebook. (i.e. it usually starts with https://raw.githubusercontent.com/ and can be found by clicking the raw button at the top of a GitHub file)\ntarget: the local filename to give the notebook. The notebook will be saved in the external folder in the root directory.\nprocess: true or false: whether or not to include the entire entry when running the quarto_import.py script\n\nAfter these updates to _import/assets.json, do the following in the terminal, which will return a confirmation of the file that has been processed:\n\ncd _import\nconda env update -f environment.yml\nconda activate quarto-import\npython quarto_import.py -f assets.json\n\nThen update _quarto.yml by adding your file (external/<target>) to the appropriate location in the Cookbook. Also link the external notebook in any .qmd file landing pages that are necessary (See “How to Add Tutorials and Display them in the Cookbook” above).", + "objectID": "external/access-cloud-python.html#alternative-access-method-without-earthaccess", + "href": "external/access-cloud-python.html#alternative-access-method-without-earthaccess", + "title": "How do I access data stored in Earthdata Cloud in Python?", + "section": "Alternative Access Method without earthaccess", + "text": "Alternative Access Method without earthaccess\nAn alternative approach to accessing data is outlined in some notebooks in the Earthdata Cloud Cookbook Appendix! The earthaccess package uses these methods for it’s back end. See this GitHub folder.", "crumbs": [ - "Contribute" + "How To", + "Access Data", + "in the Cloud" ] }, { - "objectID": "quarto_text/Contribute.html#questions-about-the-contribute-process", - "href": "quarto_text/Contribute.html#questions-about-the-contribute-process", - "title": "Contribute", - "section": "Questions about the contribute process?", - "text": "Questions about the contribute process?\nCreate an issue on our tutorials Issues GitHub page.", + "objectID": "external/zarr_access.html", + "href": "external/zarr_access.html", + "title": "Zarr Access for NetCDF4 files", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository", "crumbs": [ - "Contribute" + "Tutorials", + "Cloud Optimized Examples", + "Zarr Access for NetCDF4 Files" ] }, { - "objectID": "quarto_text/Advanced.html", - "href": "quarto_text/Advanced.html", - "title": "Advanced Cloud", - "section": "", - "text": "AWS Lambda\n\nUser Guide to Scale Scientific Analysis in the Cloud - user guide for deploying AWS services in end-user Amazon accounts\nNotebook Demonstration - This tutorial demonstrates how to plot a timeseries of global mean sea surface temperature values using AWS Lambda to perform the global mean computation using the MUR 25km dataset.\n\n\n\nZarr\n\nTutorial for NetCDF4 Files - Teaches about the Zarr cloud optimized format\n\n\n\nDask and Coiled\n\nIntroduction to Dask Tutorial - covers the basics of using Dask for parallel computing with NASA Earth Data completely in the cloud\nDask Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using dask.delayed(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC.\nDask Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are performed on a single VM with a local Dask cluster.\nCoiled Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using coiled.function(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC. This replicates the analysis from the Dask Function Replication Example, but changes the method of parallel computation. Instead of using a local cluster on a single VM (Dask), many VM’s are combined into a distributed cluster (Coiled).\nCoiled Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are distributed over many VM’s using Coiled’s coiled.cluster().\n\n\n\nUsing Kerchunk, Zarr & Dask in the Cloud\n\nKerchunk JSON Generation - Generates a Kerchunk JSON file for a single PO.DAAC Collection, creates output for input in following tutorial.\nIntegrating Dask, Kerchunk, Zarr and Xarray - Efficiently visualize a whole collection of data in an interactive dashboard via cloud-optimized formats.\n\n\n\nHarmony-py\n\nSubsetting tutorial - a tutorial for a Python library that integrates with NASA’s Harmony Services.", + "objectID": "external/zarr_access.html#timing", + "href": "external/zarr_access.html#timing", + "title": "Zarr Access for NetCDF4 files", + "section": "Timing:", + "text": "Timing:\n\nExercise: 45 minutes", "crumbs": [ - "Advanced Cloud" + "Tutorials", + "Cloud Optimized Examples", + "Zarr Access for NetCDF4 Files" ] }, { - "objectID": "quarto_text/Dask_Coiled.html", - "href": "quarto_text/Dask_Coiled.html", - "title": "Dask and Coiled", - "section": "", - "text": "Notebooks\n\nIntroduction to Dask Tutorial - covers the basics of using Dask for parallel computing with NASA Earth Data completely in the cloud\nDask Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using dask.delayed(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC.\nDask Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are performed on a single VM with a local Dask cluster.\nCoiled Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using coiled.function(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC. This replicates the analysis from the Dask Function Replication Example, but changes the method of parallel computation. Instead of using a local cluster on a single VM (Dask), many VM’s are combined into a distributed cluster (Coiled).\nCoiled Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are distributed over many VM’s using Coiled’s coiled.cluster().", + "objectID": "external/zarr_access.html#summary", + "href": "external/zarr_access.html#summary", + "title": "Zarr Access for NetCDF4 files", + "section": "Summary", + "text": "Summary\nZarr is an open source library for storing N-dimensional array data. It supports multidimensional arrays with attributes and dimensions similar to NetCDF4, and it can be read by XArray. Zarr is often used for data held in cloud object storage (like Amazon S3), because it is better optimized for these situations than NetCDF4.\nThe zarr-eosdis-store library allows NASA EOSDIS NetCDF4 files to be read more efficiently by transferring only file metadata and data needed for computation in a small number of requests, rather than moving the whole file or making many small requests. It works by making the files directly readable by the Zarr Python library and XArray across a network. To use it, files must have a corresponding metadata file ending in .dmrpp, which increasingly true for cloud-accessible EOSDIS data. https://github.com/nasa/zarr-eosdis-store\nThe zarr-eosdis-store library provides several benefits over downloading EOSDIS data files and accessing them using XArray, NetCDF4, or HDF5 Python libraries:\n\nIt only downloads the chunks of data you actually read, so if you don’t read all variables or the full spatiotemporal extent of a file, you usually won’t spend time downloading those portions of the file\nIt parallelizes and optimizes downloads for the portions of files you do read, so download speeds can be faster in general\nIt automatically interoperates with Earthdata Login if you have a .netrc file set up\nIt is aware of some EOSDIS cloud implementation quirks and provides caching that can save time for repeated requests to individual files\n\nIt can also be faster than using XArray pointing NetCDF4 files with s3:// URLs, depending on the file’s internal structure, and is often more convenient.\nConsider using this library when: 1. The portion of the data file you need to use is much smaller than the full file, e.g. in cases of spatial subsets or reading a single variable from a file containing several 1. s3:// URLs are not readily available 1. Code need to run outside of the AWS cloud or us-west-2 region or in a hybrid cloud / non-cloud manner 1. s3:// access using XArray seems slower than you would expect (possibly due to unoptimized internal file structure) 1. No readily-available, public, cloud-optimized version of the data exists already. The example we show is also available as an AWS Public Dataset: https://registry.opendata.aws/mur/ 1. Adding “.dmrpp” to the end of a data URL returns a file\n\nObjectives\n\nBuild on prior knowledge from CMR and Earthdata Login tutorials\nWork through an example of using the EOSDIS Zarr Store to access data using XArray\nLearn about the Zarr format and library for accessing data in the cloud", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled" + "Tutorials", + "Cloud Optimized Examples", + "Zarr Access for NetCDF4 Files" ] }, { - "objectID": "quarto_text/Questions.html", - "href": "quarto_text/Questions.html", - "title": "Questions?", - "section": "", - "text": "Earthdata Forum - For general questions about PO.DAAC data or data access, see the Earthdata Forum and specify PO.DAAC.\n\n\nTutorials GitHub Issues Page - For technical questions about contributing to the Cookbook or reporting issues about any tutorials in the Cookbook, create a new GitHub Issue in our podaac/tutorials repository.", + "objectID": "external/zarr_access.html#exercise", + "href": "external/zarr_access.html#exercise", + "title": "Zarr Access for NetCDF4 files", + "section": "Exercise", + "text": "Exercise\nIn this exercise, we will be using the eosdis-zarr-store library to aggregate and analyze a month of sea surface temperature for the Great Lakes region\n\nSet up\n\nImport Required Packages\n\n# Core libraries for this tutorial\n# Available via `pip install zarr zarr-eosdis-store`\nfrom eosdis_store import EosdisStore\nimport xarray as xr\n\n# Other Python libraries\nimport requests\nfrom pqdm.threads import pqdm\nfrom matplotlib import animation, pyplot as plt\nfrom IPython.core.display import display, HTML\n\n# Python standard library imports\nfrom pprint import pprint\n\nAlso set the width / height for plots we show\n\nplt.rcParams['figure.figsize'] = 12, 6\n\n\n\nSet Dataset, Time, and Region of Interest\nLook in PO.DAAC’s cloud archive for Group for High Resolution Sea Surface Temperature (GHRSST) Level 4 Multiscale Ultrahigh Resolution (MUR) data\n\ndata_provider = 'POCLOUD'\nmur_short_name = 'MUR-JPL-L4-GLOB-v4.1'\n\nLooking for data from the month of September over the Great Lakes\n\nstart_time = '2021-09-01T21:00:00Z'\nend_time = '2021-09-30T20:59:59Z'\n\n# Bounding box around the Great Lakes\nlats = slice(41, 49)\nlons = slice(-93, -76)\n\n# Some other possibly interesting bounding boxes:\n\n# Hawaiian Islands\n# lats = slice(18, 22.5)\n# lons = slice(-161, -154)\n\n# Mediterranean Sea\n# lats = slice(29, 45)\n# lons = slice(-7, 37)\n\n\n\n\nFind URLs for the dataset and AOI\nSet up a CMR granules search for our area of interest, as we saw in prior tutorials\n\ncmr_url = 'https://cmr.earthdata.nasa.gov/search/granules.json'\n\nSearch for granules in our area of interest, expecting one granule per day of September\n\nresponse = requests.get(cmr_url, \n params={\n 'provider': data_provider,\n 'short_name': mur_short_name, \n 'temporal': f'{start_time},{end_time}',\n 'bounding_box': f'{lons.start},{lats.start},{lons.stop},{lats.stop}',\n 'page_size': 2000,\n }\n )\n\n\ngranules = response.json()['feed']['entry']\n\nfor granule in granules:\n print(granule['title'])\n\n20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210902090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210903090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210904090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210905090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210906090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210907090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210908090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210909090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210910090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210911090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210912090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210913090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210914090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210915090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210916090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210917090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210918090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210919090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210920090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210921090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210922090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210923090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210924090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210925090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210926090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210927090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210928090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210929090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210930090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n\n\n\npprint(granules[0])\n\n{'boxes': ['-90 -180 90 180'],\n 'browse_flag': False,\n 'collection_concept_id': 'C1996881146-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 4 MUR Global Foundation Sea Surface Temperature '\n 'Analysis (v4.1)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.059906005859375E-5',\n 'id': 'G2113241213-POCLOUD',\n 'links': [{'href': 's3://podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct download access via S3 to the '\n 'granule.'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve temporary credentials valid for '\n 'same-region direct s3 access'},\n {'href': 'https://opendap.earthdata.nasa.gov/collections/C1996881146-POCLOUD/granules/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/service#',\n 'title': 'OPeNDAP request URL'},\n {'href': 'https://github.com/nasa/podaac_tools_and_services/tree/master/subset_opendap',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://earthdata.nasa.gov/esds/competitive-programs/measures/mur-sst',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#'},\n {'href': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://doi.org/10.1016/j.rse.2017.07.029',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://registry.opendata.aws/mur/#usageexa',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#'},\n {'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1996881146-POCLOUD ',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '300.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': ' '\n 'https://search.earthdata.nasa.gov/search/granules?p=C1996881146-POCLOUD ',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '700.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': 'https://podaac.jpl.nasa.gov/MEaSUREs-MUR',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'time_end': '2021-09-01T21:00:00.000Z',\n 'time_start': '2021-08-31T21:00:00.000Z',\n 'title': '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'updated': '2021-09-10T07:29:40.511Z'}\n\n\n\nurls = []\nfor granule in granules:\n for link in granule['links']:\n if link['rel'].endswith('/data#'):\n urls.append(link['href'])\n break\npprint(urls)\n\n['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210902090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210903090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210904090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210905090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210906090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210907090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210908090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210909090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210910090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210911090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210912090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210913090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210914090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210915090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210916090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210917090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210918090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210919090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210920090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210921090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210922090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210923090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210924090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210925090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210926090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210927090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210928090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210929090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210930090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc']\n\n\n\n\nOpen and view our AOI without downloading a whole file\n\nCheck to see if we can use an efficient partial-access technique\n\nresponse = requests.head(f'{urls[0]}.dmrpp')\n\nprint('Can we use EosdisZarrStore and XArray to access these files more efficiently?')\nprint('Yes' if response.ok else 'No')\n\nCan we use EosdisZarrStore and XArray to access these files more efficiently?\nYes\n\n\nOpen our first URL using the Zarr library\n\nurl = urls[0]\n\nds = xr.open_zarr(EosdisStore(url), consolidated=False)\n\nThat’s it! No downloads, temporary credentials, or S3 filesystems. Hereafter, we interact with the ds variable as with any XArray dataset. We need not worry about the EosdisStore anymore.\nView the file’s variable structure\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 1, lat: 17999, lon: 36000)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 1lat: 17999lon: 36000Coordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \\\"analysed_sst\\\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \\\"Fill value\\\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.83 GiB\n31.96 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\ntimedelta64[ns]\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[1, 2, 4, 8, 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \\\"grdlandmask\\\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n15.98 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n15.98 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nAttributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \\\"Multi-scale Ultra-high Resolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20210910T072132Zstart_time :20210901T090000Zstop_time :20210901T090000Ztime_coverage_start :20210831T210000Ztime_coverage_end :20210901T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-A, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.009999999776geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.009999999776acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\nds.analysed_sst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\ndask.array<open_dataset-4d5a9a1e1fda090e80524b67b2e413c6analysed_sst, shape=(1, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nCoordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\nsst = ds.analysed_sst.sel(lat=lats, lon=lons)\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 801, lon: 1701)>\ndask.array<getitem, shape=(1, 801, 1701), dtype=float32, chunksize=(1, 601, 1536), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 41.0 41.01 41.02 41.03 ... 48.97 48.98 48.99 49.0\n * lon (lon) float32 -93.0 -92.99 -92.98 -92.97 ... -76.02 -76.01 -76.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 1lat: 801lon: 1701dask.array<chunksize=(1, 200, 1536), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.20 MiB\n3.52 MiB\n\n\nShape\n(1, 801, 1701)\n(1, 601, 1536)\n\n\nCount\n329 Tasks\n4 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1701 801 1\n\n\n\n\nCoordinates: (3)lat(lat)float3241.0 41.01 41.02 ... 48.99 49.0long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([41. , 41.01, 41.02, ..., 48.98, 48.99, 49. ], dtype=float32)lon(lon)float32-93.0 -92.99 ... -76.01 -76.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-93. , -92.99, -92.98, ..., -76.02, -76.01, -76. ], dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\nsst.plot()\n\n\n\n\n\n\n\n\n\n\n\nAggregate and analyze 30 files\nSet up a function to open all of our URLs as XArrays in parallel\n\ndef open_as_zarr_xarray(url):\n return xr.open_zarr(EosdisStore(url), consolidated=False)\n\ndatasets = pqdm(urls, open_as_zarr_xarray, n_jobs=30)\n\n\n\n\n\n\n\n\n\n\nCombine the individual file-based datasets into a single xarray dataset with a time axis\n\nds = xr.concat(datasets, 'time')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 30, lat: 17999, lon: 36000)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-3...\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 30lat: 17999lon: 36000Coordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \\\"analysed_sst\\\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \\\"Fill value\\\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n144.83 GiB\n31.96 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\ntimedelta64[ns]\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[1, 2, 4, 8, 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \\\"grdlandmask\\\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n15.98 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n15.98 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nAttributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \\\"Multi-scale Ultra-high Resolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20210910T072132Zstart_time :20210901T090000Zstop_time :20210901T090000Ztime_coverage_start :20210831T210000Ztime_coverage_end :20210901T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-A, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.009999999776geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.009999999776acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\nLook at the Analysed SST variable metadata\n\nall_sst = ds.analysed_sst\nall_sst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 30, lat: 17999, lon: 36000)>\ndask.array<concatenate, shape=(30, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-30T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 30lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nCoordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nCreate a dataset / variable that is only our area of interest and view its metadata\n\nsst = ds.analysed_sst.sel(lat=lats, lon=lons)\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 30, lat: 801, lon: 1701)>\ndask.array<getitem, shape=(30, 801, 1701), dtype=float32, chunksize=(1, 601, 1536), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 41.0 41.01 41.02 41.03 ... 48.97 48.98 48.99 49.0\n * lon (lon) float32 -93.0 -92.99 -92.98 -92.97 ... -76.02 -76.01 -76.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-30T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 30lat: 801lon: 1701dask.array<chunksize=(1, 200, 1536), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n155.93 MiB\n3.52 MiB\n\n\nShape\n(30, 801, 1701)\n(1, 601, 1536)\n\n\nCount\n19590 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1701 801 30\n\n\n\n\nCoordinates: (3)lat(lat)float3241.0 41.01 41.02 ... 48.99 49.0long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([41. , 41.01, 41.02, ..., 48.98, 48.99, 49. ], dtype=float32)lon(lon)float32-93.0 -92.99 ... -76.01 -76.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-93. , -92.99, -92.98, ..., -76.02, -76.01, -76. ], dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nXArray reads data lazily, i.e. only when our code actually needs it. Up to this point, we haven’t read any data values, only metadata. The next line will force XArray to read the portions of the source files containing our area of interest. Behind the scenes, the eosdis-zarr-store library is ensuring data is fetched as efficiently as possible.\nNote: This line isn’t strictly necessary, since XArray will automatically read the data we need the first time our code tries to use it, but calling this will make sure that we can read the data multiple times later on without re-fetching anything from the source files.\nThis line will take several seconds to complete, but since it is retrieving only about 50 MB of data from 22 GB of source files, several seconds constitutes a significant time, bandwidth, and disk space savings.\n\nsst.load();\n\nNow we can start looking at aggregations across the time dimension. In this case, plot the standard deviation of the temperature at each point to get a visual sense of how much temperatures fluctuate over the course of the month.\n\n# We expect a warning here, from finding the standard deviation of arrays that contain all N/A values.\n# numpy produces N/A for these points, though, which is exactly what we want.\nstdev_sst = sst.std('time')\nstdev_sst.name = 'stdev of analysed_sst [Kelvin]'\nstdev_sst.plot();\n\n/srv/conda/envs/notebook/lib/python3.9/site-packages/numpy/lib/nanfunctions.py:1670: RuntimeWarning: Degrees of freedom <= 0 for slice.\n var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n\n\n\n\n\n\n\n\n\n\nInteractive animation of a month of data\nThis section isn’t as important to fully understand. It shows us a way to get an interactive animation to see what we have retrieved so far\nDefine an animation function to plot the ith time step. We need to make sure each plot is using the same color scale, set by vmin and vmax so the animation is consistent\n\nsst_min = sst.min()\nsst_max = sst.max()\n\ndef show_time_step(i):\n plt.clf()\n res = sst[i].plot.imshow(vmin=sst_min, vmax=sst_max)\n return (res,)\n\nRender each time slice once and show it as an HTML animation with interactive controls\n\n#anim = animation.FuncAnimation(plt.gcf(), func=show_time_step, frames=len(sst))\n#display(HTML(anim.to_jshtml()))\n#plt.close()\n\n\n\n\nSupplemental: What’s happening here?\nFor EOSDIS data in the cloud, we have begun producing a metadata sidecar file in a format called DMR++ that extracts all of the information about arrays, variables, and dimensions from data files, as well as the byte offsets in the NetCDF4 file where data can be found. This information is sufficient to let the Zarr library read data from our NetCDF4 files, but it’s in the wrong format. zarr-eosdis-store knows how to fetch the sidecar file and transform it into something the Zarr library understands. Passing it when reading Zarr using XArray or the Zarr library lets these libraries interact with EOSDIS data exactly as if they were Zarr stores in a way that’s more optimal for reading data in the cloud. Beyond this, the zarr-eosdis-store library makes some optimizations in the way it reads data to help make up for situations where the NetCDF4 file is not internally arranged well for cloud-based access patterns.", "crumbs": [ - "Questions?" + "Tutorials", + "Cloud Optimized Examples", + "Zarr Access for NetCDF4 Files" ] }, { - "objectID": "quarto_text/Webinars.html", - "href": "quarto_text/Webinars.html", - "title": "Webinars", + "objectID": "external/Direct_S3_Access_NetCDF.html", + "href": "external/Direct_S3_Access_NetCDF.html", + "title": "How to Access Data Directly in Cloud (netCDF)", "section": "", - "text": "2024: Accessing Data for the World’s Water with SWOT - Learn how to discover, access, and use Surface Water and Ocean Topography (SWOT) mission data and how these data can lead to new, innovative science and applications in the world of water.\n2023: From Ocean to Cloud—Enabling Workflows and Data Utilization - This webinar describes how to set up and use cloud services to run analyses on physical oceanography data at NASA’s PO.DAAC.\n2022: Moving Code to the Data: Analyzing Sea Level Rise Using Earth Data in the Cloud - How in-cloud analysis can be achieved with minimal knowledge of AWS cloud walking through a Jupyter Notebook tutorial.\n2021: Surfing Ocean Data in the Cloud - The Beginner’s Guide to PO.DAAC in the NASA Earthdata Cloud.\n2020: Making Waves: PO.DAAC’s Journey from Servers to a Cloud Environment - Our move to the cloud, what it means for the data, services, and resources PO.DAAC provides, and what it means for the data user community.", - "crumbs": [ - "Webinars" - ] + "text": "imported on: 2023-03-02\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository." }, { - "objectID": "quarto_text/Experimental.html", - "href": "quarto_text/Experimental.html", - "title": "In Development", - "section": "", - "text": "Content will appear as it is being developed!", - "crumbs": [ - "In Development" - ] + "objectID": "external/Direct_S3_Access_NetCDF.html#summary", + "href": "external/Direct_S3_Access_NetCDF.html#summary", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Summary", + "text": "Summary\nIn this notebook, we will access monthly sea surface height from ECCO V4r4 (10.5067/ECG5D-SSH44). The data are provided as a time series of monthly netCDFs on a 0.5-degree latitude/longitude grid.\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF datasets into an xarray dataset. This approach leverages S3 native protocols for efficient access to the data." }, { - "objectID": "quarto_text/DatasetSpecificExamples.html#missions-with-dataset-specific-examples", - "href": "quarto_text/DatasetSpecificExamples.html#missions-with-dataset-specific-examples", - "title": "Dataset Specific", - "section": "Missions with Dataset-specific Examples:", - "text": "Missions with Dataset-specific Examples:\n\nECCO - Estimating the Circulation and Climate of the Ocean\nGHRSST - Group for High Resolution Sea Surface Temperature\nOPERA - Observational Products for End-Users from Remote Sensing Analysis\nSentinel-6A Michael Freilich Jason-CS\nSMAP - Soil Moisture Active Passive\nS-MODE - Submesoscale Ocean Dynamics and Vertical Transport Experiment\nSWOT - Surface Water and Ocean Topography", - "crumbs": [ - "Tutorials", - "Dataset Specific" - ] + "objectID": "external/Direct_S3_Access_NetCDF.html#requirements", + "href": "external/Direct_S3_Access_NetCDF.html#requirements", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Requirements", + "text": "Requirements\n\n1. AWS instance running in us-west-2\nNASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. netrc File\nYou will need a netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." }, { - "objectID": "quarto_text/DatasetSpecificExamples.html#gis-storymaps-of-select-datasets", - "href": "quarto_text/DatasetSpecificExamples.html#gis-storymaps-of-select-datasets", - "title": "Dataset Specific", - "section": "GIS StoryMaps of Select Datasets:", - "text": "GIS StoryMaps of Select Datasets:\nPO.DAAC GIS StoryMap Collection Page", + "objectID": "external/Direct_S3_Access_NetCDF.html#learning-objectives", + "href": "external/Direct_S3_Access_NetCDF.html#learning-objectives", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nhow to retrieve temporary S3 credentials for in-region direct S3 bucket access\nhow to define a dataset of interest and find netCDF files in S3 bucket\nhow to perform in-region direct access of ECCO_L4_SSH_05DEG_MONTHLY_V4R4 data in S3\nhow to plot the data" + }, + { + "objectID": "external/Direct_S3_Access_NetCDF.html#import-packages", + "href": "external/Direct_S3_Access_NetCDF.html#import-packages", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Import Packages", + "text": "Import Packages\n\nimport os\nimport requests\nimport s3fs\nimport xarray as xr\nimport hvplot.xarray" + }, + { + "objectID": "external/Direct_S3_Access_NetCDF.html#get-temporary-aws-credentials", + "href": "external/Direct_S3_Access_NetCDF.html#get-temporary-aws-credentials", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Get Temporary AWS Credentials", + "text": "Get Temporary AWS Credentials\nDirect S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. For now, each NASA DAAC has different AWS credentials endpoints. Below are some of the credential endpoints to various DAACs:\n\ns3_cred_endpoint = {\n 'podaac':'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'gesdisc': 'https://data.gesdisc.earthdata.nasa.gov/s3credentials',\n 'lpdaac':'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials',\n 'ornldaac': 'https://data.ornldaac.earthdata.nasa.gov/s3credentials',\n 'ghrcdaac': 'https://data.ghrc.earthdata.nasa.gov/s3credentials'\n}\n\nCreate a function to make a request to an endpoint for temporary credentials. Remember, each DAAC has their own endpoint and credentials are not usable for cloud data from other DAACs.\n\ndef get_temp_creds(provider):\n return requests.get(s3_cred_endpoint[provider]).json()\n\n\ntemp_creds_req = get_temp_creds('podaac')\n#temp_creds_req" + }, + { + "objectID": "external/Direct_S3_Access_NetCDF.html#set-up-an-s3fs-session-for-direct-access", + "href": "external/Direct_S3_Access_NetCDF.html#set-up-an-s3fs-session-for-direct-access", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Set up an s3fs session for Direct Access", + "text": "Set up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint.\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\nIn this example we’re interested in the ECCO data collection from NASA’s PO.DAAC in Earthdata Cloud. In this case it’s the following string that unique identifies the collection of monthly, 0.5-degree sea surface height data (ECCO_L4_SSH_05DEG_MONTHLY_V4R4).\n\nshort_name = 'ECCO_L4_SSH_05DEG_MONTHLY_V4R4'\n\n\nbucket = os.path.join('podaac-ops-cumulus-protected/', short_name, '*2015*.nc')\nbucket\n\nGet a list of netCDF files located at the S3 path corresponding to the ECCO V4r4 monthly sea surface height dataset on the 0.5-degree latitude/longitude grid, for year 2015.\n\nssh_files = fs_s3.glob(bucket)\nssh_files" + }, + { + "objectID": "external/Direct_S3_Access_NetCDF.html#direct-in-region-access", + "href": "external/Direct_S3_Access_NetCDF.html#direct-in-region-access", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Direct In-region Access", + "text": "Direct In-region Access\nOpen with the netCDF files using the s3fs package, then load them all at once into a concatenated xarray dataset.\n\nfileset = [fs_s3.open(file) for file in ssh_files]\n\nCreate an xarray dataset using the open_mfdataset() function to “read in” all of the netCDF4 files in one call.\n\nssh_ds = xr.open_mfdataset(fileset,\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks='auto')\nssh_ds\n\nGet the SSH variable as an xarray dataarray\n\nssh_da = ssh_ds.SSH\nssh_da\n\nPlot the SSH time series using hvplot\n\nssh_da.hvplot.image(y='latitude', x='longitude', cmap='Viridis',).opts(clim=(ssh_da.attrs['valid_min'][0],ssh_da.attrs['valid_max'][0]))" + }, + { + "objectID": "external/Direct_S3_Access_NetCDF.html#resources", + "href": "external/Direct_S3_Access_NetCDF.html#resources", + "title": "How to Access Data Directly in Cloud (netCDF)", + "section": "Resources", + "text": "Resources\nDirect access to ECCO data in S3 (from us-west-2)\nData_Access__Direct_S3_Access__PODAAC_ECCO_SSH using CMR-STAC API to retrieve S3 links" + }, + { + "objectID": "external/NASA_Earthdata_Authentication.html#earthdata-login", + "href": "external/NASA_Earthdata_Authentication.html#earthdata-login", + "title": "How to Authenticate for NASA Earthdata Programmatically", + "section": "Earthdata Login", + "text": "Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\nWe recommend programmatic authentication with a few lines of code using the earthaccess python package.\n\nimport earthaccess\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\nThe line above has you login to Earthdata and persists the credentials in a netrc file in your home directory behind the scenes. If you know you already have a netrc file, you can also authenticate with the following, without typing in your login credentials each time:\n\nauth = earthaccess.login(strategy=\"netrc\")\n\n\n\nAuthentication is also possible without the earthaccess package; please review this 2021 Cloud Hackathon Authentication tutorial for more details.", "crumbs": [ - "Tutorials", - "Dataset Specific" + "How To", + "Authenticate" ] }, { - "objectID": "quarto_text/Sentinel6MF.html#background", - "href": "quarto_text/Sentinel6MF.html#background", - "title": "Sentinel-6 Michael Freilich", - "section": "Background", - "text": "Background\nThe Sentinel-6 Michael Freilich satellite measures the height of the ocean. In addition, an instrument on board the satellite uses the Global Navigation Satellite System Radio-Occultation sounding technique, which analyses changes in signals from international global navigation system satellites to determine atmospheric temperature and humidity. More information can be found on PO.DAAC’s Sentinel-6 Michael Freilich webpage.", + "objectID": "external/ECCO_cloud_direct_access_s3.html", + "href": "external/ECCO_cloud_direct_access_s3.html", + "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich" + "ECCO", + "In-cloud Access" ] }, { - "objectID": "quarto_text/Sentinel6MF.html#data-resources-tutorials", - "href": "quarto_text/Sentinel6MF.html#data-resources-tutorials", - "title": "Sentinel-6 Michael Freilich", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nData Access\n\nAccess in Cloud\n\nAccess by Cycle/Pass\n\nAccess Near Real-Time Data\n\nOPeNDAP Access", + "objectID": "external/ECCO_cloud_direct_access_s3.html#getting-started", + "href": "external/ECCO_cloud_direct_access_s3.html#getting-started", + "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", + "section": "Getting Started", + "text": "Getting Started\nIn this notebook, we will access monthly sea surface height from ECCO V4r4 (10.5067/ECG5D-SSH44). The data are provided as a time series of monthly netCDFs on a 0.5-degree latitude/longitude grid.\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF datasets into a single xarray dataset. This approach leverages S3 native protocols for efficient access to the data.\n\n\nRequirements\n\nAWS\nThis notebook should be running in an EC2 instance in AWS region us-west-2, as previously mentioned. We recommend using an EC2 with at least 8GB of memory available.\nThe notebook was developed and tested using a t2.large instance (2 cpus; 8GB memory).\n\n\nPython 3\nMost of these imports are from the Python standard library. However, you will need to install these packages into your Python 3 environment if you have not already done so:\n\ns3fs\nrequests\npandas\nxarray\nmatplotlib\ncartopy\n\n\nimport s3fs\nimport requests\nimport numpy as np\nimport xarray as xr\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nimport cartopy\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeat\nfrom json import dumps\nfrom io import StringIO\nfrom os.path import dirname, join\nfrom IPython.display import HTML\n\nplt.rcParams.update({'font.size': 14})\n\nMake a folder to write some outputs, if needed:\n\n!mkdir -p outputs/\n\n\n\n\nInputs\nConfigure one input: the ShortName of the desired dataset from ECCO V4r4. In this case it’s the following string that unique identifies the collection of monthly, 0.5-degree sea surface height data.\n\nShortName = \"ECCO_L4_SSH_05DEG_MONTHLY_V4R4\"\n\n\n\nEarthdata Login\nYou should have a .netrc file set up like:\nmachine urs.earthdata.nasa.gov login <username> password <password>\n\n\nDirect access from S3\nSet up an s3fs session for authneticated access to ECCO netCDF files in s3:\n\ndef begin_s3_direct_access(url: str=\"https://archive.podaac.earthdata.nasa.gov/s3credentials\"):\n response = requests.get(url).json()\n return s3fs.S3FileSystem(key=response['accessKeyId'],\n secret=response['secretAccessKey'],\n token=response['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\nfs = begin_s3_direct_access()\n\ntype(fs)\n\ns3fs.core.S3FileSystem", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich" + "ECCO", + "In-cloud Access" ] }, { - "objectID": "quarto_text/Sentinel6MF.html#additional-resources", - "href": "quarto_text/Sentinel6MF.html#additional-resources", - "title": "Sentinel-6 Michael Freilich", - "section": "Additional Resources", - "text": "Additional Resources\nNASA Mission Page", + "objectID": "external/ECCO_cloud_direct_access_s3.html#datasets", + "href": "external/ECCO_cloud_direct_access_s3.html#datasets", + "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", + "section": "Datasets", + "text": "Datasets\n\nsea surface height (0.5-degree gridded, monthly)\nECCO_L4_SSH_05DEG_MONTHLY_V4R4\nGet a list of netCDF files located at the S3 path corresponding to the ECCO V4r4 monthly sea surface height dataset on the 0.5-degree latitude/longitude grid.\n\nssh_Files = fs.glob(join(\"podaac-ops-cumulus-protected/\", ShortName, \"*2015*.nc\"))\n\nlen(ssh_Files)\n\n12\n\n\nOpen with the netCDF files using the s3fs package, then load them all at once into a concatenated xarray dataset.\n\nssh_Dataset = xr.open_mfdataset(\n paths=[fs.open(f) for f in ssh_Files],\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 60, # These were chosen arbitrarily. You must specify \n 'longitude': 120, # chunking that is suitable to the data and target\n 'time': 100} # analysis.\n)\n\nssh = ssh_Dataset.SSH\n\nprint(ssh)\n\n<xarray.DataArray 'SSH' (time: 12, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(12, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2015-12-16T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: [-1.88057721]\n valid_max: [1.42077196]\n\n\n\n\nPlot the gridded sea surface height time series\nBut only the timesteps beginning in 2015:\n\nssh_after_201x = ssh[ssh['time.year']>=2015,:,:]\n\nprint(ssh_after_201x)\n\n<xarray.DataArray 'SSH' (time: 12, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(12, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2015-12-16T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: [-1.88057721]\n valid_max: [1.42077196]\n\n\nPlot the grid for the first time step using a Robinson projection. Define a helper function for consistency throughout the notebook:\n\ndef make_figure(proj):\n fig = plt.figure(figsize=(16,6))\n ax = fig.add_subplot(1, 1, 1, projection=proj)\n ax.add_feature(cfeat.LAND)\n ax.add_feature(cfeat.OCEAN)\n ax.add_feature(cfeat.COASTLINE)\n ax.add_feature(cfeat.BORDERS, linestyle='dotted')\n return fig, ax\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\nssh_after_201x.isel(time=0).plot(ax=ax, transform=ccrs.PlateCarree(), cmap='Spectral_r')\n\n\n\n\n\n\n\n\nNow plot the whole time series (post-2010) in an animation and write it to an mp4 file called ecco_monthly_ssh_grid_2015_to_x.mp4:\n\ndef get_animation(var, cmap: str=\"Spectral_r\"):\n \"\"\"Get time series animation for input xarray dataset\"\"\"\n\n def draw_map(i: int, add_colorbar: bool):\n data = var[i]\n m = data.plot(ax=ax, \n transform=ccrs.PlateCarree(),\n add_colorbar=add_colorbar,\n vmin=var.valid_min, \n vmax=var.valid_max,\n cmap=cmap)\n plt.title(str(data.time.values)[:7])\n return m\n\n def init():\n return draw_map(0, add_colorbar=True)\n \n def animate(i):\n return draw_map(i, add_colorbar=False)\n\n return init, animate\n\nNow make the animation using the function:\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\ninit, animate = get_animation(ssh_after_201x)\n\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=ssh_after_201x.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\n# Now save the animation to an MP4 file:\nani.save('outputs/ecco_monthly_ssh_grid_2015_to_x.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)\n\nRender the animation in the ipynb:\n\n#HTML(ani.to_html5_video())\n\n\n\ntflux (0.5-degree gridded, daily)\nNow we will do something similar to access daily, gridded (0.5-degree) ocean and sea-ice surface heat fluxes (10.5067/ECG5D-HEA44). Read more about the dataset and the rest of the ECCO V4r4 product suite on the PO.DAAC Web Portal.\nUse a “glob” pattern when listing the S3 bucket contents such that only netCDFs from January 2015 are represented in the resulting list of paths.\n\ntflux_Files = fs.glob(join(\"podaac-ops-cumulus-protected/\", \"ECCO_L4_HEAT_FLUX_05DEG_DAILY_V4R4\", \"*2015-01*.nc\"))\n\nlen(tflux_Files)\n\n31\n\n\nNow open them all as one xarray dataset just like before. Open and pass the 365 netCDF files to the xarray.open_mfdataset constructor so that we can operate on them as a single aggregated dataset.\n\ntflux_Dataset = xr.open_mfdataset(\n paths=[fs.open(f) for f in tflux_Files],\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 60, # These were chosen arbitrarily. You must specify \n 'longitude': 120, # chunking that is suitable to the data and target\n 'time': 100} # analysis.\n)\n\ntflux = tflux_Dataset.TFLUX\n\nprint(tflux)\n\n<xarray.DataArray 'TFLUX' (time: 31, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(31, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-01T12:00:00 ... 2015-01-31T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n direction: >0 increases potential temperature (THETA)\n long_name: Rate of change of ocean heat content per m2 accou...\n units: W m-2\n comment: The rate of change of ocean heat content due to h...\n valid_min: [-1713.51220703]\n valid_max: [870.31304932]\n\n\nSelect a region over the Gulf of Mexico and spatially subset it from the larger dataset by slicing on the latitude and longitude axes.\n\ntflux_gom = tflux.sel(latitude=slice(15, 40), \n longitude=slice(-105, -70))\n\nprint(tflux_gom.shape)\n\n(31, 50, 70)\n\n\n\ntflux_gom.isel(time=0).plot()\n\n\n\n\n\n\n\n\nPlot the Jan 2015 surface heat flux as a gridded time series animation over the GOM study region.\n\nfig, ax = make_figure(proj=ccrs.Mercator())\n\nax.coastlines()\nax.set_extent([tflux_gom.longitude.min(), \n tflux_gom.longitude.max(), \n tflux_gom.latitude.min(), \n tflux_gom.latitude.max()])\n\ninit, animate = get_animation(tflux_gom, cmap=\"RdBu\")\n\n# Plot a time series animation write it to an mp4 file:\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=tflux_gom.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\nani.save('outputs/ecco_daily_tflux_gom_2015.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich" + "ECCO", + "In-cloud Access" ] }, { - "objectID": "quarto_text/CloudOptimizedExamples.html", - "href": "quarto_text/CloudOptimizedExamples.html", - "title": "Cloud Optimized Examples", - "section": "", - "text": "Tutorials highlighting Cloud Optimized Formats.\n\nExample: Zarr Access for NetCDF4 Files\nThis tutorial teaches about the Zarr format and library for accessing data in the cloud, building on prior knowledge from CMR and Earthdata Login tutorials, working through an example of using the EOSDIS Zarr Store to access data using XArray.\nZarr Hackathon Tutorial\n\n\nExample: Zarr Dataset\nThis tutorial opens PO.DAAC MUR dataset in a zarr format.\nZarr-eosdid-store Library\n\n\nExample: Opening NetCDF’s in Zarr Format\nThis tutorial leverages the Zarr reformatter service (available through Harmony API) to access ocean bottom pressure (OBP) data from ECCO V4r4 in Zarr format (instead of native netCDF4 file format).\nZarr2netCDF Example", + "objectID": "external/access-local-opendap.html#opendap", + "href": "external/access-local-opendap.html#opendap", + "title": "How do I access Cloud Data from my Local Machine with OPeNDAP?", + "section": "OPeNDAP", + "text": "OPeNDAP\nOPeNDAP, or the Open-source Project for a Network Data Access Protocol, is a data server that allows for accessing scientific datasets through the public internet. OPeNDAP links can be acquired through dataset landing pages or the common metadata repository. Once you have the desired link(s), you can open them as follows:\n#Import packages\nimport xarray as xr\n\nds_https = xr.open_dataset(https://opendap.earthdata.nasa.gov/collections/C2532426483-ORNL_CLOUD/granules/Daymet_Daily_V4R1.daymet_v4_daily_hi_tmax_2010.nc)\n\n# For datasets that contain dap4 specific datatypes, such as `int64`, replace `https` with `dap4` at the beginning to open with xarray. For example:\nurl = https://opendap.earthdata.nasa.gov/collections/C2036881966-POCLOUD/granules/AQUA_MODIS.20220109_20220116.L3m.8D.SST4.sst4.4km\ndap4_url = url.replace(\"https://\", \"dap4://\")\n# dap4_url output: dap4://opendap.earthdata.nasa.gov/collections/C2036881966-POCLOUD/granules/AQUA_MODIS.20220109_20220116.L3m.8D.SST4.sst4.4km\nds_dap4 = xr.open_dataset(dap4_url)\n\n# Note: Some datasets have their variables organized in groups, so within the open_dataset function, you may need to specify 'group=' to access the dataset.\nFor more information, see the OPeNDAP Data Access Client Tutorials.", "crumbs": [ - "Tutorials", - "Cloud Optimized Examples" + "How To", + "Access Data", + "via OPeNDAP" ] }, { - "objectID": "external/Introduction_to_xarray.html", - "href": "external/Introduction_to_xarray.html", - "title": "Xarray", + "objectID": "external/ECCO_download_data.html", + "href": "external/ECCO_download_data.html", + "title": "Access to ECCO V4r4 Datasets on a Local Machine", "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository" - }, - { - "objectID": "external/Introduction_to_xarray.html#why-do-we-need-xarray", - "href": "external/Introduction_to_xarray.html#why-do-we-need-xarray", - "title": "Xarray", - "section": "Why do we need xarray?", - "text": "Why do we need xarray?\nAs Geoscientists, we often work with time series of data with two or more dimensions: a time series of calibrated, orthorectified satellite images; two-dimensional grids of surface air temperature from an atmospheric reanalysis; or three-dimensional (level, x, y) cubes of ocean salinity from an ocean model. These data are often provided in GeoTIFF, NetCDF or HDF format with rich and useful metadata that we want to retain, or even use in our analysis. Common analyses include calculating means, standard deviations and anomalies over time or one or more spatial dimensions (e.g. zonal means). Model output often includes multiple variables that you want to apply similar analyses to.\n\n\n\nA schematic of multi-dimensional data\n\n\nThe schematic above shows a typical data structure for multi-dimensional data. There are two data cubes, one for temperature and one for precipitation. Common coordinate variables, in this case latitude, longitude and time are associated with each variable. Each variable, including coordinate variables, will have a set of attributes: name, units, missing value, etc. The file containing the data may also have attributes: source of the data, model name coordinate reference system if the data are projected. Writing code using low-level packages such as netcdf4 and numpy to read the data, then perform analysis, and write the results to file is time consuming and prone to errors." - }, - { - "objectID": "external/Introduction_to_xarray.html#what-is-xarray", - "href": "external/Introduction_to_xarray.html#what-is-xarray", - "title": "Xarray", - "section": "What is xarray", - "text": "What is xarray\nxarray is an open-source project and python package to work with labelled multi-dimensional arrays. It is leverages numpy, pandas, matplotlib and dask to build Dataset and DataArray objects with built-in methods to subset, analyze, interpolate, and plot multi-dimensional data. It makes working with multi-dimensional data cubes efficient and fun. It will change your life for the better. You’ll be more attractive, more interesting, and better equiped to take on lifes challenges." - }, - { - "objectID": "external/Introduction_to_xarray.html#what-you-will-learn-from-this-tutorial", - "href": "external/Introduction_to_xarray.html#what-you-will-learn-from-this-tutorial", - "title": "Xarray", - "section": "What you will learn from this tutorial", - "text": "What you will learn from this tutorial\nIn this tutorial you will learn how to:\n\nload a netcdf file into xarray\ninterrogate the Dataset and understand the difference between DataArray and Dataset\nsubset a Dataset\ncalculate annual and monthly mean fields\ncalculate a time series of zonal means\nplot these results\n\nAs always, we’ll start by importing xarray. We’ll follow convention by giving the module the shortname xr\n\nimport xarray as xr\nxr.set_options(keep_attrs=True)\nimport hvplot.xarray\n\n\n\n\n\n\n\n\n\n\nI’m going to use one of xarray’s tutorial datasets. In this case, air temperature from the NCEP reanalysis. I’ll assign the result of the open_dataset to ds. I may change this to access a dataset directly\n\nds = xr.tutorial.open_dataset(\"air_temperature\")\n\nAs we are in an interactive environment, we can just type ds to see what we have.\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 25, time: 2920, lon: 53)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 ...\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 25time: 2920lon: 53Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (1)air(time, lat, lon)float32...long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ][3869000 values with dtype=float32]Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\nFirst thing to notice is that ds is an xarray.Dataset object. It has dimensions, lat, lon, and time. It also has coordinate variables with the same names as these dimensions. These coordinate variables are 1-dimensional. This is a NetCDF convention. The Dataset contains one data variable, air. This has dimensions (time, lat, lon).\nClicking on the document icon reveals attributes for each variable. Clicking on the disk icon reveals a representation of the data.\nEach of the data and coordinate variables can be accessed and examined using the variable name as a key.\n\nds.air\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 25, lon: 53)>\n[3869000 values with dtype=float32]\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degK\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 25lon: 53...[3869000 values with dtype=float32]Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\n\nds['air']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 25, lon: 53)>\n[3869000 values with dtype=float32]\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degK\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 25lon: 53...[3869000 values with dtype=float32]Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nThese are xarray.DataArray objects. This is the basic building block for xarray.\nVariables can also be accessed as attributes of ds.\n\nds.time\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'time' (time: 2920)>\narray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n standard_name: time\n long_name: Timexarray.DataArray'time'time: 29202013-01-01 2013-01-01T06:00:00 ... 2014-12-31T18:00:00array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Coordinates: (1)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (2)standard_name :timelong_name :Time\n\n\nA major difference between accessing a variable as an attribute versus using a key is that the attribute is read-only but the key method can be used to update the variable. For example, if I want to convert the units of air from Kelvin to degrees Celsius.\n\nds['air'] = ds.air - 273.15\n\nThis approach can also be used to add new variables\n\nds['air_kelvin'] = ds.air + 273.15\n\nIt is helpful to update attributes such as units, this saves time, confusion and mistakes, especially when you save the dataset.\n\nds['air'].attrs['units'] = 'degC'\n\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 25, time: 2920, lon: 53)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 -31.95 -30.65 -29.65 ... 23.04 22.54\n air_kelvin (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 25time: 2920lon: 53Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)air(time, lat, lon)float32-31.95 -30.65 ... 23.04 22.54long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 20.540009, 20.73999 , 22.23999 , ..., 21.940002,\n 21.540009, 21.140015],\n [ 23.140015, 24.040009, 24.440002, ..., 22.140015,\n 21.940002, 21.23999 ],\n [ 24.640015, 25.23999 , 25.339996, ..., 22.540009,\n 22.339996, 22.040009]],\n\n [[-28.059998, -28.86 , -29.86 , ..., -31.460007,\n -31.660004, -31.36 ],\n [-23.259995, -23.86 , -24.759995, ..., -33.559998,\n -32.86 , -31.460007],\n [-10.160004, -10.959991, -11.76001 , ..., -33.259995,\n -30.559998, -26.86 ],\n ...,\n [ 20.640015, 20.540009, 21.940002, ..., 22.140015,\n 21.940002, 21.540009],\n [ 22.940002, 23.73999 , 24.040009, ..., 22.540009,\n 22.540009, 22.040009],\n [ 24.540009, 24.940002, 24.940002, ..., 23.339996,\n 23.040009, 22.540009]]], dtype=float32)air_kelvin(time, lat, lon)float32241.2 242.5 243.5 ... 296.2 295.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[241.2 , 242.5 , 243.5 , ..., 232.79999, 235.5 ,\n 238.59999],\n [243.79999, 244.5 , 244.7 , ..., 232.79999, 235.29999,\n 239.29999],\n [250. , 249.79999, 248.89 , ..., 233.2 , 236.39 ,\n 241.7 ],\n ...,\n [296.6 , 296.19998, 296.4 , ..., 295.4 , 295.1 ,\n 294.69998],\n [295.9 , 296.19998, 296.79 , ..., 295.9 , 295.9 ,\n 295.19998],\n [296.29 , 296.79 , 297.1 , ..., 296.9 , 296.79 ,\n 296.6 ]],\n\n [[242.09999, 242.7 , 243.09999, ..., 232. , 233.59999,\n 235.79999],\n [243.59999, 244.09999, 244.2 , ..., 231. , 232.5 ,\n 235.7 ],\n [253.2 , 252.89 , 252.09999, ..., 230.79999, 233.39 ,\n 238.5 ],\n...\n [293.69 , 293.88998, 295.38998, ..., 295.09 , 294.69 ,\n 294.29 ],\n [296.29 , 297.19 , 297.59 , ..., 295.29 , 295.09 ,\n 294.38998],\n [297.79 , 298.38998, 298.49 , ..., 295.69 , 295.49 ,\n 295.19 ]],\n\n [[245.09 , 244.29 , 243.29 , ..., 241.68999, 241.48999,\n 241.79 ],\n [249.89 , 249.29 , 248.39 , ..., 239.59 , 240.29 ,\n 241.68999],\n [262.99 , 262.19 , 261.38998, ..., 239.89 , 242.59 ,\n 246.29 ],\n ...,\n [293.79 , 293.69 , 295.09 , ..., 295.29 , 295.09 ,\n 294.69 ],\n [296.09 , 296.88998, 297.19 , ..., 295.69 , 295.69 ,\n 295.19 ],\n [297.69 , 298.09 , 298.09 , ..., 296.49 , 296.19 ,\n 295.69 ]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" - }, - { - "objectID": "external/Introduction_to_xarray.html#subsetting-and-indexing", - "href": "external/Introduction_to_xarray.html#subsetting-and-indexing", - "title": "Xarray", - "section": "Subsetting and Indexing", - "text": "Subsetting and Indexing\nSubsetting and indexing methods depend on whether you are working with a Dataset or DataArray. A DataArray can be accessed using positional indexing just like a numpy array. To access the temperature field for the first time step, you do the following.\n\nds['air'][0,:,:]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (lat: 25, lon: 53)>\narray([[-31.949997, -30.649994, -29.649994, ..., -40.350006, -37.649994,\n -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006, -37.850006,\n -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997, -36.759995,\n -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 , 21.950012,\n 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 , 22.75 ,\n 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 , 23.640015,\n 23.450012]], dtype=float32)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n time datetime64[ns] 2013-01-01\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'lat: 25lon: 53-31.95 -30.65 -29.65 -29.15 -29.05 ... 24.64 24.45 23.75 23.64 23.45array([[-31.949997, -30.649994, -29.649994, ..., -40.350006, -37.649994,\n -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006, -37.850006,\n -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997, -36.759995,\n -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 , 21.950012,\n 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 , 22.75 ,\n 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 , 23.640015,\n 23.450012]], dtype=float32)Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time()datetime64[ns]2013-01-01standard_name :timelong_name :Timearray('2013-01-01T00:00:00.000000000', dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nNote this returns a DataArray with coordinates but not attributes.\nHowever, the real power is being able to access variables using coordinate variables. I can get the same subset using the following. (It’s also more explicit about what is being selected and robust in case I modify the DataArray and expect the same output.)\n\nds['air'].sel(time='2013-01-01').time\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'time' (time: 4)>\narray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\nAttributes:\n standard_name: time\n long_name: Timexarray.DataArray'time'time: 42013-01-01 2013-01-01T06:00:00 2013-01-01T12:00:00 2013-01-01T18:00:00array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Coordinates: (1)time(time)datetime64[ns]2013-01-01 ... 2013-01-01T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (2)standard_name :timelong_name :Time\n\n\n\nds.air.sel(time='2013-01-01')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 4, lat: 25, lon: 53)>\narray([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 22.450012, 22.25 , 22.25 , ..., 23.140015,\n 22.140015, 21.850006],\n [ 23.049988, 23.350006, 23.140015, ..., 23.25 ,\n 22.850006, 22.450012],\n [ 23.25 , 23.140015, 23.25 , ..., 23.850006,\n 23.850006, 23.640015]],\n\n [[-31.259995, -31.350006, -31.350006, ..., -38.759995,\n -37.649994, -35.550003],\n [-26.850006, -27.850006, -28.949997, ..., -42.259995,\n -41.649994, -38.649994],\n [-16.549988, -18.449997, -21.050003, ..., -42.449997,\n -41.350006, -37.050003],\n ...,\n [ 23.450012, 23.25 , 22.850006, ..., 23.350006,\n 22.640015, 22.140015],\n [ 23.850006, 24.350006, 23.950012, ..., 23.640015,\n 23.450012, 23.140015],\n [ 24.350006, 24.549988, 24.350006, ..., 24.640015,\n 24.850006, 24.75 ]]], dtype=float32)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 4lat: 25lon: 53-31.95 -30.65 -29.65 -29.15 -29.05 ... 25.45 25.05 24.64 24.85 24.75array([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 22.450012, 22.25 , 22.25 , ..., 23.140015,\n 22.140015, 21.850006],\n [ 23.049988, 23.350006, 23.140015, ..., 23.25 ,\n 22.850006, 22.450012],\n [ 23.25 , 23.140015, 23.25 , ..., 23.850006,\n 23.850006, 23.640015]],\n\n [[-31.259995, -31.350006, -31.350006, ..., -38.759995,\n -37.649994, -35.550003],\n [-26.850006, -27.850006, -28.949997, ..., -42.259995,\n -41.649994, -38.649994],\n [-16.549988, -18.449997, -21.050003, ..., -42.449997,\n -41.350006, -37.050003],\n ...,\n [ 23.450012, 23.25 , 22.850006, ..., 23.350006,\n 22.640015, 22.140015],\n [ 23.850006, 24.350006, 23.950012, ..., 23.640015,\n 23.450012, 23.140015],\n [ 24.350006, 24.549988, 24.350006, ..., 24.640015,\n 24.850006, 24.75 ]]], dtype=float32)Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2013-01-01T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nI can also do slices. I’ll extract temperatures for the state of Colorado. The bounding box for the state is [-109 E, -102 E, 37 N, 41 N].\nIn the code below, pay attention to both the order of the coordinates and the range of values. The first value of the lat coordinate variable is 41 N, the second value is 37 N. Unfortunately, xarray expects slices of coordinates to be in the same order as the coordinates. Note lon is 0 to 360 not -180 to 180, and I let python calculate it for me within the slice.\n\nds.air.sel(lat=slice(41.,37.), lon=slice(360-109,360-102))\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 2, lon: 3)>\narray([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)\nCoordinates:\n * lat (lat) float32 40.0 37.5\n * lon (lon) float32 252.5 255.0 257.5\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 2lon: 3-10.05 -9.25 -8.75 -6.25 -6.55 ... -15.36 -13.66 -13.76 -15.96 -14.46array([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)Coordinates: (3)lat(lat)float3240.0 37.5standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([40. , 37.5], dtype=float32)lon(lon)float32252.5 255.0 257.5standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([252.5, 255. , 257.5], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nWhat if we want temperature for a point, for example Denver, CO (39.72510678889283 N, -104.98785545855408 E). xarray can handle this! If we just want data from the nearest grid point, we can use sel and specify the method as “nearest”.\n\ndenver_lat, denver_lon = 39.72510678889283, -104.98785545855408\n\n\nds.air.sel(lat=denver_lat, lon=360+denver_lon, method='nearest').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nIf we want to interpolate, we can use interp(). In this case I use linear or bilinear interpolation.\ninterp() can also be used to resample data to a new grid and even reproject data\n\nds.air.interp(lat=denver_lat, lon=360+denver_lon, method='linear')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920)>\narray([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n lat float64 39.73\n lon float64 255.0\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920-8.951 -14.5 -18.44 -11.33 -8.942 ... -22.4 -27.79 -25.79 -15.42array([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])Coordinates: (3)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')lat()float6439.73standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray(39.72510679)lon()float64255.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray(255.01214454)Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nsel() and interp() can also be used on Dataset objects.\n\nds.sel(lat=slice(41,37), lon=slice(360-109,360-102))\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 2, time: 2920, lon: 3)\nCoordinates:\n * lat (lat) float32 40.0 37.5\n * lon (lon) float32 252.5 255.0 257.5\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 -10.05 -9.25 -8.75 ... -15.96 -14.46\n air_kelvin (time, lat, lon) float32 263.1 263.9 264.4 ... 259.4 257.2 258.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 2time: 2920lon: 3Coordinates: (3)lat(lat)float3240.0 37.5standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([40. , 37.5], dtype=float32)lon(lon)float32252.5 255.0 257.5standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([252.5, 255. , 257.5], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)air(time, lat, lon)float32-10.05 -9.25 ... -15.96 -14.46long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)air_kelvin(time, lat, lon)float32263.1 263.9 264.4 ... 257.2 258.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[263.1 , 263.9 , 264.4 ],\n [266.9 , 266.6 , 266.79 ]],\n\n [[255. , 258.19998, 263.19998],\n [259.5 , 262.1 , 265.9 ]],\n\n [[252.7 , 254.5 , 259.79 ],\n [253.79999, 256.19998, 261.9 ]],\n\n ...,\n\n [[248.68999, 244.89 , 247.39 ],\n [256.19 , 249.09 , 249.09 ]],\n\n [[248.79 , 246.98999, 249.68999],\n [257.19 , 250.29 , 250.18999]],\n\n [[255.59 , 257.79 , 259.49 ],\n [259.38998, 257.19 , 258.69 ]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\n\nds.interp(lat=denver_lat, lon=360+denver_lon, method='linear')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 2920)\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n lat float64 39.73\n lon float64 255.0\nData variables:\n air (time) float64 -8.951 -14.5 -18.44 ... -27.79 -25.79 -15.42\n air_kelvin (time) float64 264.2 258.7 254.7 261.8 ... 245.4 247.4 257.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:time: 2920Coordinates: (3)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')lat()float6439.73standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray(39.72510679)lon()float64255.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray(255.01214454)Data variables: (2)air(time)float64-8.951 -14.5 ... -25.79 -15.42long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])air_kelvin(time)float64264.2 258.7 254.7 ... 247.4 257.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([264.19914312, 258.65246598, 254.71284227, ..., 245.36262886,\n 247.36447002, 257.73218487])Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" - }, - { - "objectID": "external/Introduction_to_xarray.html#analysis", - "href": "external/Introduction_to_xarray.html#analysis", - "title": "Xarray", - "section": "Analysis", - "text": "Analysis\nAs a simple example, let’s try to calculate a mean field for the whole time range.\n\nds.mean(dim='time').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nWe can also calculate a zonal mean (averaging over longitude)\n\nds.mean(dim='lon').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nOther aggregation methods include min(), max(), std(), along with others.\n\nds.std(dim='time').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nThe data we have are in 6h timesteps. This can be resampled to daily or monthly. If you are familiar with pandas, xarray uses the same methods.\n\nds.resample(time='M').mean().hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\nds_mon = ds.resample(time='M').mean()\nds_mon\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 24, lat: 25, lon: 53)\nCoordinates:\n * time (time) datetime64[ns] 2013-01-31 2013-02-28 ... 2014-12-31\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\nData variables:\n air (time, lat, lon) float32 -28.68 -28.49 -28.48 ... 24.57 24.56\n air_kelvin (time, lat, lon) float32 244.5 244.7 244.7 ... 297.7 297.7 297.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:time: 24lat: 25lon: 53Coordinates: (3)time(time)datetime64[ns]2013-01-31 ... 2014-12-31array(['2013-01-31T00:00:00.000000000', '2013-02-28T00:00:00.000000000',\n '2013-03-31T00:00:00.000000000', '2013-04-30T00:00:00.000000000',\n '2013-05-31T00:00:00.000000000', '2013-06-30T00:00:00.000000000',\n '2013-07-31T00:00:00.000000000', '2013-08-31T00:00:00.000000000',\n '2013-09-30T00:00:00.000000000', '2013-10-31T00:00:00.000000000',\n '2013-11-30T00:00:00.000000000', '2013-12-31T00:00:00.000000000',\n '2014-01-31T00:00:00.000000000', '2014-02-28T00:00:00.000000000',\n '2014-03-31T00:00:00.000000000', '2014-04-30T00:00:00.000000000',\n '2014-05-31T00:00:00.000000000', '2014-06-30T00:00:00.000000000',\n '2014-07-31T00:00:00.000000000', '2014-08-31T00:00:00.000000000',\n '2014-09-30T00:00:00.000000000', '2014-10-31T00:00:00.000000000',\n '2014-11-30T00:00:00.000000000', '2014-12-31T00:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)Data variables: (2)air(time, lat, lon)float32-28.68 -28.49 ... 24.57 24.56long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-28.68323 , -28.486452 , -28.479755 , ..., -30.658554 ,\n -29.743628 , -28.474194 ],\n [-26.076784 , -26.127504 , -26.4225 , ..., -32.5679 ,\n -31.105167 , -28.442825 ],\n [-22.770565 , -23.31516 , -24.042498 , ..., -31.165657 ,\n -28.38291 , -24.144924 ],\n ...,\n [ 22.688152 , 22.00097 , 21.773153 , ..., 22.218397 ,\n 21.734531 , 21.118395 ],\n [ 23.31952 , 23.16702 , 22.698233 , ..., 22.43775 ,\n 22.190727 , 21.715578 ],\n [ 23.903486 , 23.89203 , 23.585333 , ..., 23.154608 ,\n 22.947426 , 22.889124 ]],\n\n [[-32.41607 , -32.44866 , -32.738483 , ..., -31.54482 ,\n -30.430185 , -29.205448 ],\n [-31.216885 , -31.08063 , -31.236965 , ..., -32.135708 ,\n -30.825186 , -28.42241 ],\n [-27.826433 , -28.123934 , -28.78045 , ..., -29.734114 ,\n -27.383936 , -23.491434 ],\n...\n [ 24.899088 , 24.200085 , 24.072004 , ..., 24.861843 ,\n 24.510258 , 23.995668 ],\n [ 25.815008 , 25.661922 , 25.121607 , ..., 24.954088 ,\n 25.071083 , 24.735588 ],\n [ 26.023424 , 26.06767 , 25.74576 , ..., 25.566338 ,\n 25.591848 , 25.630259 ]],\n\n [[-26.348473 , -26.260897 , -26.380894 , ..., -33.07903 ,\n -32.067986 , -30.868315 ],\n [-25.419994 , -24.849277 , -24.405483 , ..., -34.531376 ,\n -32.82783 , -30.179682 ],\n [-23.181051 , -23.56476 , -23.574757 , ..., -35.446938 ,\n -31.91259 , -26.923311 ],\n ...,\n [ 23.299198 , 22.541454 , 22.60839 , ..., 23.378307 ,\n 23.067505 , 22.662996 ],\n [ 24.295895 , 24.286139 , 24.031782 , ..., 23.80259 ,\n 23.908312 , 23.579037 ],\n [ 24.897346 , 25.076134 , 24.909689 , ..., 24.547583 ,\n 24.573233 , 24.560413 ]]], dtype=float32)air_kelvin(time, lat, lon)float32244.5 244.7 244.7 ... 297.7 297.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[244.4667 , 244.66354, 244.67027, ..., 242.49142, 243.40633,\n 244.67577],\n [247.07323, 247.02248, 246.7275 , ..., 240.58205, 242.04489,\n 244.70726],\n [250.37941, 249.83484, 249.10748, ..., 241.98434, 244.76712,\n 249.00505],\n ...,\n [295.83795, 295.15085, 294.9229 , ..., 295.36826, 294.88437,\n 294.26828],\n [296.46942, 296.31686, 295.84802, ..., 295.5876 , 295.34058,\n 294.86536],\n [297.05316, 297.0418 , 296.73517, ..., 296.30438, 296.09732,\n 296.0389 ]],\n\n [[240.73384, 240.7013 , 240.4115 , ..., 241.60518, 242.71988,\n 243.94455],\n [241.93309, 242.06935, 241.913 , ..., 241.01428, 242.32481,\n 244.72758],\n [245.32361, 245.0261 , 244.36955, ..., 243.41588, 245.7661 ,\n 249.65858],\n...\n [298.04895, 297.35007, 297.22195, ..., 298.01172, 297.66013,\n 297.14554],\n [298.96484, 298.81186, 298.27136, ..., 298.10403, 298.22104,\n 297.88547],\n [299.17334, 299.2175 , 298.89566, ..., 298.71625, 298.74167,\n 298.7802 ]],\n\n [[246.80156, 246.88907, 246.76907, ..., 240.07089, 241.08206,\n 242.2817 ],\n [247.72998, 248.30064, 248.74443, ..., 238.61859, 240.3222 ,\n 242.97026],\n [249.96893, 249.58516, 249.57521, ..., 237.70308, 241.23743,\n 246.22667],\n ...,\n [296.4491 , 295.6914 , 295.75824, ..., 296.52817, 296.21747,\n 295.8128 ],\n [297.44586, 297.43613, 297.1817 , ..., 296.95242, 297.05823,\n 296.72897],\n [298.0472 , 298.22598, 298.0595 , ..., 297.6975 , 297.72318,\n 297.71024]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\nThis is a really short time series but as an example, let’s calculate a monthly climatology (at least for 2 months). For this we can use groupby()\n\nds_clim = ds_mon.groupby(ds_mon.time.dt.month).mean()" - }, - { - "objectID": "external/Introduction_to_xarray.html#plot-results", - "href": "external/Introduction_to_xarray.html#plot-results", - "title": "Xarray", - "section": "Plot results", - "text": "Plot results\nFinally, let’s plot the results! This will plot the lat/lon axes of the original ds DataArray.\n\nds_clim.air.sel(month=10).plot()" - }, - { - "objectID": "external/find_data_programmatically.html#introduction", - "href": "external/find_data_programmatically.html#introduction", - "title": "How do I find data using code?", - "section": "Introduction", - "text": "Introduction\nHere are our recommended approaches for finding data with code, from the command line or a notebook.\n\nPythonRMatlabCommand Line\n\n\nIn Python we can use the earthaccess library (renamed, previously earthdata)\nTo install the package we’ll run this code from the command line. Note: you can run shell code directly from a Jupyter Notebook cell by adding a !, so it would be !conda install.\n## In the command line\n## Install earthaccess\nconda install -c conda-forge earthaccess\nThis example searches for data from the Land Processes DAAC with a spatial bounding box and temporal range.\n## In Python\n## Import packages\nfrom earthaccess import DataGranules, DataCollections\nfrom pprint import pprint \n\n\n## We'll get 4 collections that match with our keyword of interest\ncollections = DataCollections().keyword(\"REFLECTANCE\").cloud_hosted(True).get(4)\n\n## Let's print 2 collections\nfor collection in collections[0:2]:\n print(pprint(collection.summary()) , collection.abstract(), \"\\n\")\n \n## Search for files from the second dataset result over a small plot in Nebraska, USA for two weeks in September 2022\ngranules = DataGranules().concept_id(\"C2021957657-LPCLOUD\").temporal(\"2022-09-10\",\"2022-09-24\").bounding_box(-101.67271,41.04754,-101.65344,41.06213)\nprint(len(granules))\ngranules\n\n\nTo find data in R, we’ll also use the earthaccess python package - we can do so from R using the reticulate package (cheatsheet). Note below that we import the python library as an R object we name earthaccess, as well as the earthaccess$ syntax for accessing functions from the earthaccess library. The granules object has a list of JSON dictionaries with some extra dictionaries.\n## In R\n## load R libraries\nlibrary(tidyverse) # install.packages(\"tidyverse\") \nlibrary(reticulate) # install.packages(\"reticulate\")\n\n## load python library\nearthaccess <- reticulate::import(\"earthaccess\") \n\n## use earthaccess to access data # https://nsidc.github.io/earthaccess/tutorials/search-granules/\ngranules <- earthaccess$search_data(\n doi = \"10.5067/SLREF-CDRV3\",\n temporal = reticulate::tuple(\"2017-01\", \"2017-02\") # with an earthaccess update, this can be simply c() or list()\n)\n\n## Granules found: 72\n\n## exploring\ngranules # this is the result of the get request. \n\nclass(granules) # \"list\"\n## granules <- reticulate::py_to_r(granules) # Object to convert is not a Python object\n\n\nMatlab code coming soon!\n## In Matlab\n## Coming soon!\n\n\nWith wget and curl:\n## In the command line\n## Coming soon!", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.\nDuped+slightly modified version of the s3 access ipynb. Tested on JPL-issued macbook and my linux box. It starts by setting up a most trusted strategy for batch downloads behind URS ussing curl/wget. Will attempt to add line(s) to your netrc file if needed btw; then it writes your urs cookies to a local file that should effectively “pre-authenticate” future download sessions for those sub domains.", "crumbs": [ - "How To", - "Find Data", - "using Code" + "Tutorials", + "Dataset Specific", + "ECCO", + "Local Download Access" ] }, { - "objectID": "external/cof-zarr-reformat.html", - "href": "external/cof-zarr-reformat.html", - "title": "COF Zarr Access via Reformat", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.", + "objectID": "external/ECCO_download_data.html#quick-start", + "href": "external/ECCO_download_data.html#quick-start", + "title": "Access to ECCO V4r4 Datasets on a Local Machine", + "section": "Quick Start", + "text": "Quick Start\nA key takeaway in this notebook… follow these instructions on the Earthdata Wiki to authenticate and store your URS cookies in a local file. You can batch download really efficiently this way, effectively “pre-authenticated” through your previous session.\nAvoid lines that begin with % or %% in code cells. Those are IPython “magic functions” that tell a line or cell to evaluate in some special mode like by bash instead of py3.\n\nConfigure your .netrc file\nGood idea to back up your existing netrc file, if you have one. And while youre at it check for these entries because they might exist in there already:\n\n%cp ~/.netrc ~/bak.netrc\n\n%cat ~/.netrc | grep '.earthdata.nasa.gov' | cut -f-5 -d\" \"\n\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine uat.urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\n\n\n\nAdd entries to your netrc for these two earthdata.nasa.gov sub domains, at a minimum:\nmachine urs.earthdata.nasa.gov login jmcnelis password ***\nmachine opendap.earthdata.nasa.gov login jmcnelis password ***\nand replace jmcnelis and *** with your Earthdata Login username and password, respectively…\n\nReplace jmcnelis and *** with your Earthdata username and password, and then run the cell to append these two lines to your netrc file, if one exists. Otherwise write them to a new one. (all set up by -a)\n\n%%file -a ~/.netrc\nmachine urs.earthdata.nasa.gov login jmcnelis password ***\nmachine opendap.earthdata.nasa.gov login jmcnelis password ***\n\nAppending to /Users/jmcnelis/.netrc\n\n\nDump the netrc again sans passwords to confirm that it worked:\n\n!cat ~/.netrc | grep '.earthdata.nasa.gov' | cut -f-5 -d\" \"\n\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine uat.urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\n\n\nFinally, you need to make sure to limit access to the netrc file because it stores your plain text password. Simple on MacOS and Linux:\n\n!chmod 0600 ~/.netrc\n\nNo outputs expected.\n\n\nDownload a sample data file, get your URS cookies, and write them to a local file\nNow I’ll download a random file that’s protected by URS/Earthdata Login authentication so that I can grab my URS cookies.\nI chose to download a file containing ECCO grid geometries for the 0.5-degree latitude/longitude grid. It’s small and it may prove useful for downstream analysis of the SSH data. (Again, any protected data file will work.)\n\n%%bash\nwget --no-verbose \\\n --no-clobber \\\n --load-cookies ~/.urs_cookies \\\n --save-cookies ~/.urs_cookies \\\n --keep-session-cookies \\\n https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ECCO_L4_GEOMETRY_05DEG_V4R4/GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc\n\nI used –quiet mode so wget would not dump tons of garbage into the notebook. Confirm that the cookies file exists in your home directory:\n\n!ls ~/.urs_cookies\n\n/Users/jmcnelis/.urs_cookies\n\n\nAnd see if the file downloaded successfully to double-confirm it worked as expected (and be aware that the ncdump output is truncated to the first 50 lines):\n\n!ncdump -h GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc | head -25\n\nnetcdf GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg {\ndimensions:\n Z = 50 ;\n latitude = 360 ;\n longitude = 720 ;\n nv = 2 ;\nvariables:\n float Z(Z) ;\n Z:axis = \"Z\" ;\n Z:bounds = \"Z_bnds\" ;\n Z:comment = \"Non-uniform vertical spacing.\" ;\n Z:coverage_content_type = \"coordinate\" ;\n Z:long_name = \"depth of grid cell center\" ;\n Z:positive = \"up\" ;\n Z:standard_name = \"depth\" ;\n Z:units = \"m\" ;\n float latitude(latitude) ;\n latitude:axis = \"Y\" ;\n latitude:bounds = \"latitude_bnds\" ;\n latitude:comment = \"uniform grid spacing from -89.75 to 89.75 by 0.5\" ;\n latitude:coverage_content_type = \"coordinate\" ;\n latitude:long_name = \"latitude at grid cell center\" ;\n latitude:standard_name = \"latitude\" ;\n latitude:units = \"degrees_north\" ;\n float longitude(longitude) ;\n\n\nAnd that’s it! You should now be able to use wget and curl to download URS-protected data from PODAAC cloud without providing your creds each time.\n\n\nPrepare a list of files to download\nNow the only step that remains is to get a list of URLs to pass to wget or curl for downloading. There’s a lot of ways to do this – even more so for ECCO V4r4 data because the files/datasets follow well-structured naming conventions – but we will rely on Earthdata Search to do this from the browser for the sake of simplicity.\n1. Find the collection/dataset of interest in Earthdata Search.\nStart from this complete list of ECCO collections in Earthdata Search (79 in total), and refine the results until you see your dataset of interest. In this case we want monthly sea surface height grids provided at 0.5-degree cell resolution on an interpolated latitude/longitude grid.\n2. Pick your collection, then click the green Download All button on the next page.\nClick the big green button identified by the red arrow/box in the screenshot below.\n\nThat will add all the granules in the collection to your “shopping cart” and then redirect you straight there and present you with the available options for customizing the data prior to download. We will ignore those because they’re mostly in active development and because we want to download all data in the collection.\n\n\nThe screenshot above shows the download customization interface (i.e. “shopping cart”)\n\n3. Click Download Data to get your list of download urls (bottom-left, another green button)\nThe Download Data button takes you to one final page that provides the list of urls from which to download the files matching your search parameters and any customization options that you selected in the steps that followed. This page will be retained in your User History in case you need to return to it later.\n\nThere are several ways that you could get the list of urls into a text file that’s accessible from Jupyter or your local shell. I simply clicked the save button in my browser and downloaded them as a text file to a subdirectory called resources inside this workspace. (You could also copy them into a new notebook cell and write them to a file like we did with the netrc file above.)\n\n\nDownload files in a batch with GNU Wget\nI find wget options to be convenient and easy to remember. There are only a handful that I use with any regularity.\nThe most important wget option for our purpose is set by the -i argument, which takes a path to the input text file containing our download urls. Another nice feature of wget is the ability to continue downloads where you left of during a previously-interuppted download session. That option is turned on by passing the -c argument.\nNow run wget against a list of files retrieve from Earthdata Search and see what happens.\n\n!ls resources/*.txt\n\nresources/5237392644-download.txt\n\n\nGo ahead and create a data/ directory to keep the downloaded files, and then start the downloads into that location by including the -P argument:\n\n%%bash\n\nmkdir -p data\n\nwget --no-verbose \\\n --no-clobber \\\n --continue \\\n -i resources/5237392644-download.txt -P data/\n\nWait a long time if you have to… then count the number of netCDF files in the data directory:\n\n!ls -1 data/*.nc | wc -l\n\n 312\n\n\nAdd a folder for outputs, if needed:\n\n!mkdir -p outputs/\n\nGet a list of netCDF files at the data directory and print the count + the first filename in the list:\n\nfiles = !ls data/*.nc\n\nlen(files), files[0]\n\n(312, 'data/SEA_SURFACE_HEIGHT_mon_mean_1992-01_ECCO_V4r4_latlon_0p50deg.nc')\n\n\nThis is the first time you’ll need any Python in this notebook… Install Python 3 requirements (I am on version 3.8.)\n\n#!conda install -c conda-forge numpy dask netCDF4 xarray, cartopy, ffmpeg\nimport xarray as xr\nimport matplotlib.animation as animation\nimport matplotlib.pyplot as plt\nimport cartopy.feature as cfeat\nimport cartopy.crs as ccrs\nimport cartopy\n\nOpen the netCDFs as one multi-file dataset with xarray:\n\nds = xr.open_mfdataset(\n paths=files,\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 360, 'longitude': 720, 'time': 5}\n)\n\nssh = ds.SSH\n\nprint(ssh)\n\n<xarray.DataArray 'SSH' (time: 312, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(312, 360, 720), dtype=float32, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 1992-01-16T18:00:00 ... 2017-12-16T06:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: -1.8805772066116333\n valid_max: 1.4207719564437866\n\n\n\n\nPlot gridded sea surface height time series\nBut only the timesteps beginning in 2015:\n\nssh_after_201x = ssh[ssh['time.year']>=2015,:,:]\nprint(ssh_after_201x)\n\n<xarray.DataArray 'SSH' (time: 36, latitude: 360, longitude: 720)>\ndask.array<getitem, shape=(36, 360, 720), dtype=float32, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2017-12-16T06:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: -1.8805772066116333\n valid_max: 1.4207719564437866\n\n\nPlot the grid for the first time step using a Robinson projection. Define a helper function for consistency throughout the notebook:\n\ndef make_figure(proj):\n fig = plt.figure(figsize=(16,6))\n ax = fig.add_subplot(1, 1, 1, projection=proj)\n ax.add_feature(cfeat.LAND)\n ax.add_feature(cfeat.OCEAN)\n ax.add_feature(cfeat.COASTLINE)\n ax.add_feature(cfeat.BORDERS, linestyle='dotted')\n return fig, ax\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\nssh_after_201x.isel(time=0).plot(ax=ax, transform=ccrs.PlateCarree(), cmap='Spectral_r')\n\n\n\n\n\n\n\n\nNow plot the whole time series (post-2010) in an animation and write it to an mp4 file called ecco_monthly_ssh_grid_2015_to_x.mp4:\n\ndef get_animation(var, cmap: str=\"Spectral_r\"):\n \"\"\"Get time series animation for input xarray dataset\"\"\"\n\n def draw_map(i: int, add_colorbar: bool):\n data = var[i]\n m = data.plot(ax=ax, \n transform=ccrs.PlateCarree(),\n add_colorbar=add_colorbar,\n vmin=var.valid_min, \n vmax=var.valid_max,\n cmap=cmap)\n plt.title(str(data.time.values)[:7])\n return m\n\n def init():\n return draw_map(0, add_colorbar=True)\n \n def animate(i):\n return draw_map(i, add_colorbar=False)\n\n return init, animate\n\nNow make the animation using the function:\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\ninit, animate = get_animation(ssh_after_201x)\n\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=ssh_after_201x.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\n# Now save the animation to an MP4 file:\nani.save('outputs/ecco_monthly_ssh_grid_2015_to_x.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)\n\nRender the animation in the ipynb:\n\n#HTML(ani.to_html5_video())", "crumbs": [ "Tutorials", - "Cloud Optimized Examples", - "zarr2netCDF" + "Dataset Specific", + "ECCO", + "Local Download Access" ] }, { - "objectID": "external/cof-zarr-reformat.html#getting-started", - "href": "external/cof-zarr-reformat.html#getting-started", - "title": "COF Zarr Access via Reformat", - "section": "Getting Started", - "text": "Getting Started\nWe will access monthly ocean bottom pressure (OBP) data from ECCO V4r4 (10.5067/ECG5M-OBP44), which are provided as a monthly time series on a 0.5-degree latitude/longitude grid.\nThe data are archived in netCDF format. However, this notebook demonstration will request conversion to Zarr format for files covering the period between 2010 and 2018. Upon receiving our request, Harmony’s backend will convert the files and stage them in S3 for native access in AWS (us-west-2 region, specifically). We will access the new Zarr datasets as an aggregated dataset using xarray, and leverage the S3 native protocols for direct access to the data in an efficient manner.\n\n\nRequirements\n\nAWS\nThis notebook should be running in an EC2 instance in AWS region us-west-2, as previously mentioned. We recommend using an EC2 with at least 8GB of memory available.\nThe notebook was developed and tested using a t2.large instance (2 cpus; 8GB memory).\n\n\nPython 3\nMost of these imports are from the Python standard library. However, you will need to install these packages into your Python 3 environment if you have not already done so:\n\ns3fs\nrequests\npandas\nxarray\nmatplotlib\n\n\n\n\nRequirements\n\nimport matplotlib.pyplot as plt\nimport xarray as xr\nimport pandas as pd\nimport numpy as np\nimport requests\nimport json\nimport time\nimport s3fs\n\nShortName = \"ECCO_L4_OBP_05DEG_MONTHLY_V4R4\"\n\n\n\nStudy period\nSet some “master” inputs to define the time and place contexts for our case studies in the ipynb. This example will be requesting time subsets and receiving global data back from the Harmony API.\n\nstart_date = \"2010-01-01\"\nend_date = \"2018-12-31\"\n\n\n\nData Access\nSome features in the Harmony API require us to identify the target dataset/collection by its concept-id (which uniquely idenfifies it among the other datasets in the Common Metadata Repository). Support for selection by the dataset ShortName will be added in a future release.\n\nCommon Metadata Repository (CMR)\nFor now, we will need to get the concept-id that corresponds to our dataset by accessing its metadata from the CMR. Read more about the CMR at: https://cmr.earthdata.nasa.gov/\nRequest the UMM Collection metadata (i.e. metadata about the dataset) from the CMR and select the concept-id as a new variable ccid.\n\nresponse = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': ShortName,\n 'page_size': 1}\n)\n\nummc = response.json()['items'][0]\n\nccid = ummc['meta']['concept-id']\n\nccid\n\n'C1990404791-POCLOUD'\n\n\n\n\nHarmony API\nAnd get the Harmony API endpoint and zarr parameter like we did for SMAP before:\n\nbase = f\"https://harmony.earthdata.nasa.gov/{ccid}\"\nhreq = f\"{base}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset\"\nrurl = f\"{hreq}?format=application/x-zarr\"\n\nprint(rurl)\n\nhttps://harmony.earthdata.nasa.gov/C1990404791-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr\n\n\nECCO monthly collections have 312 granules in V4r4 (you can confirm with the granule listing from CMR Search API) so we can get the entire time series for 2010 to 2018 with one request to the Harmony API.\nFormat a string of query parameters to limit the processing to the desired time period. Then, append the string of time subset parameters to the variable rurl.\n\nsubs = '&'.join([f'subset=time(\"{start_date}T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")'])\n\nrurl = f\"{rurl}&{subs}\"\n\nprint(rurl)\n\nhttps://harmony.earthdata.nasa.gov/C1990404791-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr&subset=time(\"2010-01-01T00:00:00.000Z\":\"2018-12-31T23:59:59.999Z\")\n\n\nSubmit the request and monitor the processing status in a while loop, breaking it on completion of the request job:\n\nresponse = requests.get(url=rurl).json()\n\n# Monitor status in a while loop. Wait 10 seconds for each check.\nwait = 10\nwhile True:\n response = requests.get(url=response['links'][0]['href']).json()\n if response['status']!='running':\n break\n print(f\"Job in progress ({response['progress']}%)\")\n time.sleep(wait)\n\nprint(\"DONE!\")\n\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nDONE!\n\n\nAccess the staged cloud datasets over native AWS interfaces\nCheck the message field in the response for clues about how to proceed:\n\nprint(response['message'])\n\nThe job has completed successfully. Contains results in AWS S3. Access from AWS us-west-2 with keys from https://harmony.earthdata.nasa.gov/cloud-access.sh\n\n\nThe third item in the list of links contains the shell script from the job status message printed above. Let’s download the same information in JSON format. It should be the fourth item; check to be sure:\n\nlen(response['links'])\n\n102\n\n\nSelect the url and download the json, then load to Python dictionary and print the keys:\n\nwith requests.get(response['links'][3]['href']) as r:\n creds = r.json()\n\nprint(creds.keys())\n\ndict_keys(['AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration'])\n\n\nCheck the expiration timestamp for the temporary credentials:\n\ncreds['Expiration']\n\n'2021-06-11T02:36:29.000Z'\n\n\nOpen zarr datasets with s3fs and xarray\nGet the s3 output directory and list of zarr datasets from the list of links. The s3 directory should be the fifth item; the urls are from item six onward:\n\ns3_dir = response['links'][4]['href']\n\nprint(s3_dir)\n\ns3://harmony-prod-staging/public/harmony/netcdf-to-zarr/2295236b-8086-4543-9482-f524a9f2d0c3/\n\n\nNow select the URLs for the staged files and print the first one:\n\ns3_urls = [u['href'] for u in response['links'][5:]]\n\nprint(s3_urls[0])\n\ns3://harmony-prod-staging/public/harmony/netcdf-to-zarr/2295236b-8086-4543-9482-f524a9f2d0c3/OCEAN_BOTTOM_PRESSURE_mon_mean_2009-12_ECCO_V4r4_latlon_0p50deg.zarr\n\n\nUse the AWS s3fs package and your temporary aws_creds to open the zarr directory storage:\n\ns3 = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\n\nlen(s3.ls(s3_dir))\n\n97\n\n\nPlot the first Ocean Bottom Pressure dataset\nCheck out the documentation for xarray’s open_zarr method at this link. Open the first dataset and plot the OBP variable:\n\nds0 = xr.open_zarr(s3.get_mapper(s3_urls[0]), decode_cf=True, mask_and_scale=True)\n\n# Mask the dataset where OBP is not within the bounds of the variable's valid min/max:\nds0_masked = ds0.where((ds0.OBP>=ds0.OBP.valid_min) & (ds0.OBP<=ds0.OBP.valid_max))\n\n# Plot the masked dataset\nds0_masked.OBP.isel(time=0).plot.imshow(size=10)\n\n\n\n\n\n\n\n\nLoad the zarr datasets into one large xarray dataset\nLoad all the datasets in a loop and concatenate them:\n\nzds = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls], dim=\"time\")\n\nprint(zds)\n\n<xarray.Dataset>\nDimensions: (latitude: 360, longitude: 720, nv: 2, time: 97)\nCoordinates:\n * latitude (latitude) float64 -89.75 -89.25 -88.75 ... 89.25 89.75\n latitude_bnds (latitude, nv) float64 -90.0 -89.5 -89.5 ... 89.5 89.5 90.0\n * longitude (longitude) float64 -179.8 -179.2 -178.8 ... 179.2 179.8\n longitude_bnds (longitude, nv) float64 -180.0 -179.5 -179.5 ... 179.5 180.0\n * time (time) datetime64[ns] 2009-12-16T12:00:00 ... 2017-12-16T...\n time_bnds (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>\nDimensions without coordinates: nv\nData variables:\n OBP (time, latitude, longitude) float64 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>\n OBPGMAP (time, latitude, longitude) float64 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>\nAttributes: (12/57)\n Conventions: CF-1.8, ACDD-1.3\n acknowledgement: This research was carried out by the Jet Pr...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon grid. ...\n coordinates_comment: Note: the global 'coordinates' attribute de...\n ... ...\n time_coverage_duration: P1M\n time_coverage_end: 2010-01-01T00:00:00\n time_coverage_resolution: P1M\n time_coverage_start: 2009-12-01T00:00:00\n title: ECCO Ocean Bottom Pressure - Monthly Mean 0...\n uuid: 297c8df0-4158-11eb-b208-0cc47a3f687b\n\n\nReference OBP and mask the dataset according to the valid minimum and maximum:\n\nobp = zds.OBP\n\nprint(obp)\n\n<xarray.DataArray 'OBP' (time: 97, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(97, 360, 720), dtype=float64, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * latitude (latitude) float64 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\n * time (time) datetime64[ns] 2009-12-16T12:00:00 ... 2017-12-16T06:00:00\nAttributes:\n comment: OBP excludes the contribution from global mean at...\n coverage_content_type: modelResult\n long_name: Ocean bottom pressure given as equivalent water t...\n units: m\n valid_max: 72.07011413574219\n valid_min: -1.7899188995361328\n\n\nGet the valid min and max from the corresponding CF attributes:\n\nobp_vmin, obp_vmax = obp.valid_min, obp.valid_max\n\nobp_vmin, obp_vmax\n\n(-1.7899188995361328, 72.07011413574219)\n\n\nMask the dataset according to the OBP min and max and plot a series:\n\n# Mask dataset where not inside OBP variable valid min/max:\nzds_masked = zds.where((obp>=obp_vmin)&(obp<=obp_vmax))\n\n# Plot SSH again for the first 12 time slices:\nobpp = zds_masked.OBP.isel(time=slice(0, 6)).plot(\n x=\"longitude\", \n y=\"latitude\", \n col=\"time\",\n levels=8,\n col_wrap=3, \n add_colorbar=False,\n figsize=(14, 8)\n)\n\n# Plot a colorbar on a secondary axis\nmappable = obpp.axes[0][0].collections[0]\ncax = plt.axes([0.05, -0.04, 0.95, 0.04])\ncbar1 = plt.colorbar(mappable, cax=cax, orientation='horizontal')", + "objectID": "external/zarr-eosdis-store.html", + "href": "external/zarr-eosdis-store.html", + "title": "Zarr Example", + "section": "", + "text": "imported on: 2024-07-24\n\nThis notebook is from NASA’s Zarr EOSDIS store notebook\n\n\nThe original source for this document is https://github.com/nasa/zarr-eosdis-store/blob/main/presentation/example.ipynb\n\n\nzarr-eosdis-store example\nInstall dependencies\n\nimport sys\n\n# zarr and zarr-eosdis-store, the main libraries being demoed\n!{sys.executable} -m pip install zarr zarr-eosdis-store\n\n# Notebook-specific libraries\n!{sys.executable} -m pip install matplotlib\n\nImportant: To run this, you must first create an Earthdata Login account (https://urs.earthdata.nasa.gov) and place your credentials in ~/.netrc e.g.:\n machine urs.earthdata.nasa.gov login YOUR_USER password YOUR_PASSWORD\nNever share or commit your password / .netrc file!\nBasic usage. After these lines, we work with ds as though it were a normal Zarr dataset\n\nimport zarr\nfrom eosdis_store import EosdisStore\n\nurl = 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210715090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'\n\nds = zarr.open(EosdisStore(url))\n\nView the file’s variable structure\n\nprint(ds.tree())\n\n/\n ├── analysed_sst (1, 17999, 36000) int16\n ├── analysis_error (1, 17999, 36000) int16\n ├── dt_1km_data (1, 17999, 36000) int16\n ├── lat (17999,) float32\n ├── lon (36000,) float32\n ├── mask (1, 17999, 36000) int16\n ├── sea_ice_fraction (1, 17999, 36000) int16\n ├── sst_anomaly (1, 17999, 36000) int16\n └── time (1,) int32\n\n\nFetch the latitude and longitude arrays and determine start and end indices for our area of interest. In this case, we’re looking at the Great Lakes, which have a nice, recognizeable shape. Latitudes 41 to 49, longitudes -93 to 76.\n\nlats = ds['lat'][:]\nlons = ds['lon'][:]\nlat_range = slice(lats.searchsorted(41), lats.searchsorted(49))\nlon_range = slice(lons.searchsorted(-93), lons.searchsorted(-76))\n\nGet the analysed sea surface temperature variable over our area of interest and apply scale factor and offset from the file metadata. In a future release, scale factor and add offset will be automatically applied.\n\nvar = ds['analysed_sst']\nanalysed_sst = var[0, lat_range, lon_range] * var.attrs['scale_factor'] + var.attrs['add_offset']\n\nDraw a pretty picture\n\nfrom matplotlib import pyplot as plt\n\nplt.rcParams[\"figure.figsize\"] = [16, 8]\nplt.imshow(analysed_sst[::-1, :])\nNone\n\n\n\n\n\n\n\n\nIn a dozen lines of code and a few seconds, we have managed to fetch and visualize the 3.2 megabyte we needed from a 732 megabyte file using the original archive URL and no processing services", "crumbs": [ "Tutorials", "Cloud Optimized Examples", - "zarr2netCDF" + "zarr-eosdis-store library" ] }, { - "objectID": "external/SWOT_SSH_dashboard.html", - "href": "external/SWOT_SSH_dashboard.html", - "title": "Integrating Dask, Kerchunk, Zarr and Xarray", + "objectID": "external/insitu_dataviz_demo.html", + "href": "external/insitu_dataviz_demo.html", + "title": "S-MODE Workshop: Science Case Study In Situ", "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop\nimport glob\nfrom netCDF4 import Dataset\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimport gsw", "crumbs": [ - "Advanced Cloud", - "Dask, Kerchunk, & Zarr" + "Tutorials", + "Dataset Specific", + "S-MODE", + "Case Study In Situ" ] }, { - "objectID": "external/SWOT_SSH_dashboard.html#background", - "href": "external/SWOT_SSH_dashboard.html#background", - "title": "Integrating Dask, Kerchunk, Zarr and Xarray", - "section": "Background", - "text": "Background\n\nThis notebook allows you to visualize large amounts of SWOT data in an interactive dashboard\nConnects to PO.DAAC s3 SWOT collection\nReads data as zarr cloud-optimized data store\nAccess to terabytes of data in milliseconds\nTo run this notebook the SWOT_L2_LR_SSH_Expert_2.0.json file is needed.", + "objectID": "external/insitu_dataviz_demo.html#compare-saildrone-adcp-data-with-rv-oceanus-data", + "href": "external/insitu_dataviz_demo.html#compare-saildrone-adcp-data-with-rv-oceanus-data", + "title": "S-MODE Workshop: Science Case Study In Situ", + "section": "Compare saildrone ADCP data with R/V Oceanus data", + "text": "Compare saildrone ADCP data with R/V Oceanus data\nA major goal of the S-MODE Pilot was to compare saildrone ADCP data. Here’s one example of a simple saildrone-Oceanus velocity comparison.\n\n# this is not working for the Oceanus ADCP\nstart_time = '2021-10-20T00:00:00Z'\nstart_time = '2021-08-01T00:00:00Z'\nend_time = '2021-11-08T00:00:00Z'\n\nshort_name = 'SMODE_LX_SHIPBOARD_ADCP_V1'\n!podaac-data-downloader -c $short_name -d data/$short_name --start-date $start_time --end-date $end_time -e .nc4\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (5.0.0)/charset_normalizer (2.0.4) doesn't match a supported version!\n warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n[2022-11-28 19:46:35,848] {podaac_data_downloader.py:243} INFO - Found 2 total files to download\n[2022-11-28 19:46:35,885] {podaac_data_downloader.py:268} INFO - 2022-11-28 19:46:35.885322 SKIPPED: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_os75nb.nc4\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:268} INFO - 2022-11-28 19:46:35.967540 SKIPPED: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:287} INFO - Downloaded Files: 0\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:288} INFO - Failed Files: 0\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:289} INFO - Skipped Files: 2\n[2022-11-28 19:46:36,245] {podaac_access.py:122} INFO - CMR token successfully deleted\n[2022-11-28 19:46:36,245] {podaac_data_downloader.py:299} INFO - END\n\n\n\n\n\nds = xr.open_dataset('data/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4',drop_variables='depth').isel(trajectory=0)\nds['depth'] = Dataset('data/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4')['depth'][0]\n\n\nsubset_oceanus = ds.where((ds.time>=t0)&(ds.time<=t1),drop=True) \n\n\n# interpolate to subset72 time\n# TODO: try to resample with averaging to 5 minutes before interpolating (e.g., subset_oceanus.resample(time='5min').mean())\nsubset_oceanus = subset_oceanus.interp({'time': subset72.time})\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:562: FutureWarning: Passing method to DatetimeIndex.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imin = index.get_loc(minval, method=\"nearest\")\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:563: FutureWarning: Passing method to DatetimeIndex.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imax = index.get_loc(maxval, method=\"nearest\")\n\n\n\n# interpolate to saildrone depth to oceanus depth\nsubset72['depth'] = subset72.cell_depth + 1.9 # add depth of the instrument 1.9\nsubset72 = subset72.swap_dims({'cell_depth': 'depth'})\nsubset72 = subset72.interp({'depth': subset_oceanus.depth})\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:562: FutureWarning: Passing method to Float64Index.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imin = index.get_loc(minval, method=\"nearest\")\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:563: FutureWarning: Passing method to Float64Index.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imax = index.get_loc(maxval, method=\"nearest\")\n\n\n\nVisual comparison\n\ndepth_bin = 1\nsc = 6\n\nfig, ax = plt.subplots(figsize=(12,8))\n\nq1 = plt.quiver(\n subset72.longitude,\n subset72.latitude,\n subset72.vel_east.isel(depth=depth_bin),\n subset72.vel_north.isel(depth=depth_bin),\n color='C00',scale=sc\n)\n\n\nq2 = plt.quiver(\n subset_oceanus.longitude,\n subset_oceanus.latitude,\n subset_oceanus.zonal_velocity_component.isel(depth=depth_bin),\n subset_oceanus.meridional_velocity_component.isel(depth=depth_bin),\n color='C02', scale=sc\n)\n\nplt.quiverkey(q1, .1, 0.815, .5, 'SD-1072',)\nplt.quiverkey(q2, .1, 0.620, .5, 'R/V Oceanus',)\n\nax.set_ylim(37.18,37.26)\nax.set_aspect(np.cos(37.22*np.pi/180))\n\n\n\n\n\n\n\n\n\nfig, axs = plt.subplots(2,1,figsize=(12,14))\n\nkw = {'vmin': -.4,'vmax': +.4,'cmap': 'RdBu_r'}\n\nsubset_oceanus.zonal_velocity_component.plot(x='time',y='depth',ax=axs[0],**kw)\nsubset72.vel_east.plot(x='time',y='depth',ax=axs[1])\n\naxs[0].set_title('R/V Oceanus')\naxs[1].set_title('SD-1072')\n\n[ax.set_ylim(80,0) for ax in axs]\n\n\n\n\n\n\n\n\n\n\nQuantitative comparison: calculate and plot velocity differences\n\nsubset_oceanus = subset_oceanus.where(subset_oceanus.depth<=70)\nsubset72 = subset72.where(subset_oceanus.depth<=70)\n\n\ndu = subset_oceanus.zonal_velocity_component-subset72.vel_east\ndv = subset_oceanus.meridional_velocity_component-subset72.vel_north\n\n\n_ = plt.hist(dv.values.flatten(),bins=np.arange(-.15,.156,.01))\n\n\n\n\n\n\n\n\n\ndu.mean().values, dv.mean().values\n\n(array(-0.01207606), array(0.00744287))\n\n\n\ndu.std().values, dv.std().values\n\n(array(0.03616049), array(0.04748247))", "crumbs": [ - "Advanced Cloud", - "Dask, Kerchunk, & Zarr" + "Tutorials", + "Dataset Specific", + "S-MODE", + "Case Study In Situ" ] }, { - "objectID": "external/SWOT_SSH_dashboard.html#instructions", - "href": "external/SWOT_SSH_dashboard.html#instructions", - "title": "Integrating Dask, Kerchunk, Zarr and Xarray", - "section": "Instructions", - "text": "Instructions\n\nLoad this notebook into a JupyterHub cloud environment\nCreate a .netrc file (NASA Earthdata account)\n\ncd ~\ntouch .netrc\necho \"machine urs.earthdata.nasa.gov login [USERNAME] password [PASSWORD]\" > .netrc\n\nGet the SWOT swaths shapefile for fast spatial and temporal subsetting\n\nwget https://www.aviso.altimetry.fr/fileadmin/documents/missions/Swot/sph_science_swath.zip\nunzip sph_science_swath.zip\n\nGet the combined metadata file SWOT_L2_LR_SSH_Expert_2.0.json\n\n\nNASA VEDA JupyterHub users: The notebook already has code to read the json from VEDA s3\n\n\nimport s3fs\nimport glob\nimport dask\nimport ujson\nimport cartopy\nimport requests\nimport earthaccess\nimport hvplot.dask\nimport hvplot.pandas\nimport hvplot.xarray\n\nimport numpy as np\nimport panel as pn\nimport pandas as pd\nimport xarray as xr\nimport holoviews as hv\nimport geopandas as gpd\nimport cartopy.crs as ccrs\nimport panel.widgets as pnw\nimport matplotlib.pyplot as plt\n\nfrom tqdm.notebook import tqdm\nfrom dask.distributed import Client\nfrom shapely.geometry import Polygon\n\nhv.extension('bokeh')\nhv.renderer('bokeh').webgl = True\npn.param.ParamMethod.loading_indicator = True", + "objectID": "external/read_data.html#netcdf", + "href": "external/read_data.html#netcdf", + "title": "Read Data", + "section": "netCDF", + "text": "netCDF\n\nPythonRMATLAB\n\n\nWe recommend using xarray’s open_dataset\n\nFor a single file\nimport xarray as xr\nds = xr.open_dataset(filename)\n\n\nFor multiple files\nimport xarray as xr\nds = xr.open_mfdataset(list_of_filenames)\n\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides graphical import tools and two programmatic interfaces for interacting with netCDF files.\nThe high-level interface is made of eight high-level functions for getting information about netCDF files and their content, creating variables, writing and reading variables and attributes, and adding schema definitions to netCDF files.\nfilename = \"example.nc\";\nncdisp(filename); % Display file content\nvarname = \"peaks\";\npeaksData = ncread(filename,varname);\nsurf(peaksData);\nThe low-level interface is a thin wrapper around the underlying netCDF C library.\nfilename = \"example.nc\";\nvarname = \"peaks\";\nncID = netcdf.open(filename,\"NC_NOWRITE\");\nvarID = netcdf.inqVarID(ncID,varname);\npeaksData = netcdf.getVar(ncID,varID);\nnetcdf.close(ncID);\nsurf(peaksData);\nNotes\n\nUnlike MATLAB HDF5 interfaces, netCDF interfaces are not cloud enabled (yet).\nAs HDF5 interfaces support reading netCDF 4 files, users must currently use these interfaces for accessing netCDF 4 files stored on the cloud (see tutorial MATLAB Access Single NASA EarthData L2 NetCDF in this Cookbook).\nMATLAB netCDF interfaces support OPeNDAP and byte-range for reading data.", "crumbs": [ - "Advanced Cloud", - "Dask, Kerchunk, & Zarr" + "How To", + "Read Data" ] }, { - "objectID": "external/SWOT_SSH_dashboard.html#start-dask-cluster", - "href": "external/SWOT_SSH_dashboard.html#start-dask-cluster", - "title": "Integrating Dask, Kerchunk, Zarr and Xarray", - "section": "Start Dask cluster", + "objectID": "external/read_data.html#hdf5", + "href": "external/read_data.html#hdf5", + "title": "Read Data", + "section": "HDF5", + "text": "HDF5\n\nPythonRMATLAB\n\n\nFor HDF5 files, there are two methods we can use: xarray’s open_dataset and h5py\nimport xarray as xr\nds = xr.open_dataset(filename,\n group=path_to_H5netCDF_group)\n# add in directions for h5py\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides low- and high-level programmatic interfaces for interacting with HDF5 and HDF4 files.\nFocusing on HDF5, which is currently more prevalent, the high-level interface is made of seven high-level functions for getting information about HDF5 files and their content, creating datasets, and reading and writing datasets and attributes.\nfilename = \"example.h5\";\nh5disp(filename); % Display file content\nds = \"/g4/lat\";\nlat = h5read(filename,ds);\nThe low-level interface is a thin wrapper around the underlying HDF5 C library. It is made of more than 300 functions organized in packages (H5F for file management, H5D for dataset management, etc.).\nfilename = \"example.h5\";\nds = \"/g4/lat\";\nfID = H5F.open(filename); \ndsID = H5D.open(fID,ds);\nlat = H5D.read(dsID);\nH5D.close(dsID);\nH5F.close(fID);", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#geotiff", + "href": "external/read_data.html#geotiff", + "title": "Read Data", + "section": "GeoTIFF", + "text": "GeoTIFF\n\nPythonRMATLAB\n\n\nFor GeoTIFF files, we recommend using rioxarray’s open_rasterio\nimport rioxarray\nxds = rioxarray.open_rasterio(\"my.tif\")\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB Mapping Toolbox supports interacting with GeoTIFF files through a series of functions for handling raster data (under Raster Data), and the function geotiffread althrough not recommended but for a few edge cases.\n[A,R] = readgeoraster(\"myGeoTiffFile.tif\");\nmapshow(A,R);", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#shapefiles-geojson", + "href": "external/read_data.html#shapefiles-geojson", + "title": "Read Data", + "section": "Shapefiles & GeoJSON", + "text": "Shapefiles & GeoJSON\n\nPythonRMATLAB\n\n\nTo open shapefiles or GeoJSON, we recommend using geopandas’s read_file.\nimport geopandas as gpd\ngdf = gpd.read_file(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB Mapping Toolbox supports interacting with shapefiles and GeoJSON files through a series of functions for handling vector data (under Vector Data), in particular readgeotable, shapeinfo, shaperead, and shapewrite.\n% Read shapefile of countries specifying the name of the attributes to read.\nS = shaperead(\"Countries.shp\",\"Attributes\",[\"ISO_2DIGIT\",\"CNTRY_NAME\"]);\n\n% Read GeoJSON data from a website and save it in the file storms.geojson.\nwebsave(\"storms.geojson\",\"https://www.spc.noaa.gov/products/outlook/day1otlk_cat.lyr.geojson\");\nGT = readgeotable(\"storms.geojson\");", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#csv", + "href": "external/read_data.html#csv", + "title": "Read Data", + "section": "CSV", + "text": "CSV\n\nPythonRMATLAB\n\n\nTo open CSV files, we recommend using pandas’s read_csv.\nimport pandas as pd\ndf = pd.read_csv(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB supports interacting with CSV files and other tabular file formats through functions readtable, readtimetable, readcell, and readmatrix, as well as their counterparts for writing to files.\n% Read time table and display summary\nTT = readtimetable(\"myTimeTable.csv\");\nsummary(TT)\nAdvanced workflows can be implemented using detectImportOptions and functions referenced in its documentation.\n% Read variables \"TaxiIn\" and \"TaxiOut\" from airlines dataset\nfilename = \"airlinesmall.csv\";\nopts = detectImportOptions(filename);\nopts.SelectedVariableNames = [\"TaxiIn\",\"TaxiOut\"];\nT = readtable(filename, opts);\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nA general list of functions and workflows for interacting with deliimited and formatted text files is provided here.", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#excel", + "href": "external/read_data.html#excel", + "title": "Read Data", + "section": "Excel", + "text": "Excel\n\nPythonRMATLAB\n\n\nTo open Excel files, we recommend using pandas’s read_excel\nimport pandas as pd\ndf = pd.read_excel(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nSee section about CSV files.", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#mat-files-.mat", + "href": "external/read_data.html#mat-files-.mat", + "title": "Read Data", + "section": "MAT-Files (.mat)", + "text": "MAT-Files (.mat)\n\nPythonRMATLAB\n\n\n#coming soon! scipy & .mat\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB can interact with MAT-Files (.mat) using functions load, save, and through matfile objects.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nMultiple versions of the MAT-File format have been released. The latest, MAT-File v7.3, is based on the HDF5 file format.", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#text-data-files", + "href": "external/read_data.html#text-data-files", + "title": "Read Data", + "section": "Text Data Files", + "text": "Text Data Files\n\nPythonRMATLAB\n\n\n# Coming soon!\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides a series of functions for interacting with text files. In addition to functions listed in sections about CSV and Binary files, MATLAB provides functions fileread for reading the content of a whole file as text, and readlines and writelines for reading/writing lines to text files.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nMATLAB patterns and regular expressions are useful for processing unstructured text data.", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/read_data.html#binary-files", + "href": "external/read_data.html#binary-files", + "title": "Read Data", + "section": "Binary Files", + "text": "Binary Files\n\nPythonRMATLAB\n\n\nTo open binary files, we recommend using numpy’s from_file. You will need to know the dimensions and data type of the binary file and if there is an offset or header information in the binary file.\nimport numpy as np\narr = np.from_file(filepath, dtype=data_type).reshape(nrows, ncols)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB supports interacting with binary files through low-level IO functions fopen, fclose, ferror, fseek, ftell, feof, fscanf, fprintf, fread, fwrite, and frewind.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nIt is rare that ones must implement custom binary data file readers/writers, because MATLAB and its toolboxes provide functions for reading and writing a large number of data file formats.", + "crumbs": [ + "How To", + "Read Data" + ] + }, + { + "objectID": "external/Introduction_to_xarray.html", + "href": "external/Introduction_to_xarray.html", + "title": "Xarray", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository" + }, + { + "objectID": "external/Introduction_to_xarray.html#why-do-we-need-xarray", + "href": "external/Introduction_to_xarray.html#why-do-we-need-xarray", + "title": "Xarray", + "section": "Why do we need xarray?", + "text": "Why do we need xarray?\nAs Geoscientists, we often work with time series of data with two or more dimensions: a time series of calibrated, orthorectified satellite images; two-dimensional grids of surface air temperature from an atmospheric reanalysis; or three-dimensional (level, x, y) cubes of ocean salinity from an ocean model. These data are often provided in GeoTIFF, NetCDF or HDF format with rich and useful metadata that we want to retain, or even use in our analysis. Common analyses include calculating means, standard deviations and anomalies over time or one or more spatial dimensions (e.g. zonal means). Model output often includes multiple variables that you want to apply similar analyses to.\n\n\n\nA schematic of multi-dimensional data\n\n\nThe schematic above shows a typical data structure for multi-dimensional data. There are two data cubes, one for temperature and one for precipitation. Common coordinate variables, in this case latitude, longitude and time are associated with each variable. Each variable, including coordinate variables, will have a set of attributes: name, units, missing value, etc. The file containing the data may also have attributes: source of the data, model name coordinate reference system if the data are projected. Writing code using low-level packages such as netcdf4 and numpy to read the data, then perform analysis, and write the results to file is time consuming and prone to errors." + }, + { + "objectID": "external/Introduction_to_xarray.html#what-is-xarray", + "href": "external/Introduction_to_xarray.html#what-is-xarray", + "title": "Xarray", + "section": "What is xarray", + "text": "What is xarray\nxarray is an open-source project and python package to work with labelled multi-dimensional arrays. It is leverages numpy, pandas, matplotlib and dask to build Dataset and DataArray objects with built-in methods to subset, analyze, interpolate, and plot multi-dimensional data. It makes working with multi-dimensional data cubes efficient and fun. It will change your life for the better. You’ll be more attractive, more interesting, and better equiped to take on lifes challenges." + }, + { + "objectID": "external/Introduction_to_xarray.html#what-you-will-learn-from-this-tutorial", + "href": "external/Introduction_to_xarray.html#what-you-will-learn-from-this-tutorial", + "title": "Xarray", + "section": "What you will learn from this tutorial", + "text": "What you will learn from this tutorial\nIn this tutorial you will learn how to:\n\nload a netcdf file into xarray\ninterrogate the Dataset and understand the difference between DataArray and Dataset\nsubset a Dataset\ncalculate annual and monthly mean fields\ncalculate a time series of zonal means\nplot these results\n\nAs always, we’ll start by importing xarray. We’ll follow convention by giving the module the shortname xr\n\nimport xarray as xr\nxr.set_options(keep_attrs=True)\nimport hvplot.xarray\n\n\n\n\n\n\n\n\n\n\nI’m going to use one of xarray’s tutorial datasets. In this case, air temperature from the NCEP reanalysis. I’ll assign the result of the open_dataset to ds. I may change this to access a dataset directly\n\nds = xr.tutorial.open_dataset(\"air_temperature\")\n\nAs we are in an interactive environment, we can just type ds to see what we have.\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 25, time: 2920, lon: 53)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 ...\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 25time: 2920lon: 53Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (1)air(time, lat, lon)float32...long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ][3869000 values with dtype=float32]Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\nFirst thing to notice is that ds is an xarray.Dataset object. It has dimensions, lat, lon, and time. It also has coordinate variables with the same names as these dimensions. These coordinate variables are 1-dimensional. This is a NetCDF convention. The Dataset contains one data variable, air. This has dimensions (time, lat, lon).\nClicking on the document icon reveals attributes for each variable. Clicking on the disk icon reveals a representation of the data.\nEach of the data and coordinate variables can be accessed and examined using the variable name as a key.\n\nds.air\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 25, lon: 53)>\n[3869000 values with dtype=float32]\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degK\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 25lon: 53...[3869000 values with dtype=float32]Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\n\nds['air']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 25, lon: 53)>\n[3869000 values with dtype=float32]\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degK\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 25lon: 53...[3869000 values with dtype=float32]Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nThese are xarray.DataArray objects. This is the basic building block for xarray.\nVariables can also be accessed as attributes of ds.\n\nds.time\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'time' (time: 2920)>\narray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n standard_name: time\n long_name: Timexarray.DataArray'time'time: 29202013-01-01 2013-01-01T06:00:00 ... 2014-12-31T18:00:00array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Coordinates: (1)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (2)standard_name :timelong_name :Time\n\n\nA major difference between accessing a variable as an attribute versus using a key is that the attribute is read-only but the key method can be used to update the variable. For example, if I want to convert the units of air from Kelvin to degrees Celsius.\n\nds['air'] = ds.air - 273.15\n\nThis approach can also be used to add new variables\n\nds['air_kelvin'] = ds.air + 273.15\n\nIt is helpful to update attributes such as units, this saves time, confusion and mistakes, especially when you save the dataset.\n\nds['air'].attrs['units'] = 'degC'\n\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 25, time: 2920, lon: 53)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 -31.95 -30.65 -29.65 ... 23.04 22.54\n air_kelvin (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 25time: 2920lon: 53Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)air(time, lat, lon)float32-31.95 -30.65 ... 23.04 22.54long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 20.540009, 20.73999 , 22.23999 , ..., 21.940002,\n 21.540009, 21.140015],\n [ 23.140015, 24.040009, 24.440002, ..., 22.140015,\n 21.940002, 21.23999 ],\n [ 24.640015, 25.23999 , 25.339996, ..., 22.540009,\n 22.339996, 22.040009]],\n\n [[-28.059998, -28.86 , -29.86 , ..., -31.460007,\n -31.660004, -31.36 ],\n [-23.259995, -23.86 , -24.759995, ..., -33.559998,\n -32.86 , -31.460007],\n [-10.160004, -10.959991, -11.76001 , ..., -33.259995,\n -30.559998, -26.86 ],\n ...,\n [ 20.640015, 20.540009, 21.940002, ..., 22.140015,\n 21.940002, 21.540009],\n [ 22.940002, 23.73999 , 24.040009, ..., 22.540009,\n 22.540009, 22.040009],\n [ 24.540009, 24.940002, 24.940002, ..., 23.339996,\n 23.040009, 22.540009]]], dtype=float32)air_kelvin(time, lat, lon)float32241.2 242.5 243.5 ... 296.2 295.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[241.2 , 242.5 , 243.5 , ..., 232.79999, 235.5 ,\n 238.59999],\n [243.79999, 244.5 , 244.7 , ..., 232.79999, 235.29999,\n 239.29999],\n [250. , 249.79999, 248.89 , ..., 233.2 , 236.39 ,\n 241.7 ],\n ...,\n [296.6 , 296.19998, 296.4 , ..., 295.4 , 295.1 ,\n 294.69998],\n [295.9 , 296.19998, 296.79 , ..., 295.9 , 295.9 ,\n 295.19998],\n [296.29 , 296.79 , 297.1 , ..., 296.9 , 296.79 ,\n 296.6 ]],\n\n [[242.09999, 242.7 , 243.09999, ..., 232. , 233.59999,\n 235.79999],\n [243.59999, 244.09999, 244.2 , ..., 231. , 232.5 ,\n 235.7 ],\n [253.2 , 252.89 , 252.09999, ..., 230.79999, 233.39 ,\n 238.5 ],\n...\n [293.69 , 293.88998, 295.38998, ..., 295.09 , 294.69 ,\n 294.29 ],\n [296.29 , 297.19 , 297.59 , ..., 295.29 , 295.09 ,\n 294.38998],\n [297.79 , 298.38998, 298.49 , ..., 295.69 , 295.49 ,\n 295.19 ]],\n\n [[245.09 , 244.29 , 243.29 , ..., 241.68999, 241.48999,\n 241.79 ],\n [249.89 , 249.29 , 248.39 , ..., 239.59 , 240.29 ,\n 241.68999],\n [262.99 , 262.19 , 261.38998, ..., 239.89 , 242.59 ,\n 246.29 ],\n ...,\n [293.79 , 293.69 , 295.09 , ..., 295.29 , 295.09 ,\n 294.69 ],\n [296.09 , 296.88998, 297.19 , ..., 295.69 , 295.69 ,\n 295.19 ],\n [297.69 , 298.09 , 298.09 , ..., 296.49 , 296.19 ,\n 295.69 ]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" + }, + { + "objectID": "external/Introduction_to_xarray.html#subsetting-and-indexing", + "href": "external/Introduction_to_xarray.html#subsetting-and-indexing", + "title": "Xarray", + "section": "Subsetting and Indexing", + "text": "Subsetting and Indexing\nSubsetting and indexing methods depend on whether you are working with a Dataset or DataArray. A DataArray can be accessed using positional indexing just like a numpy array. To access the temperature field for the first time step, you do the following.\n\nds['air'][0,:,:]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (lat: 25, lon: 53)>\narray([[-31.949997, -30.649994, -29.649994, ..., -40.350006, -37.649994,\n -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006, -37.850006,\n -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997, -36.759995,\n -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 , 21.950012,\n 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 , 22.75 ,\n 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 , 23.640015,\n 23.450012]], dtype=float32)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n time datetime64[ns] 2013-01-01\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'lat: 25lon: 53-31.95 -30.65 -29.65 -29.15 -29.05 ... 24.64 24.45 23.75 23.64 23.45array([[-31.949997, -30.649994, -29.649994, ..., -40.350006, -37.649994,\n -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006, -37.850006,\n -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997, -36.759995,\n -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 , 21.950012,\n 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 , 22.75 ,\n 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 , 23.640015,\n 23.450012]], dtype=float32)Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time()datetime64[ns]2013-01-01standard_name :timelong_name :Timearray('2013-01-01T00:00:00.000000000', dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nNote this returns a DataArray with coordinates but not attributes.\nHowever, the real power is being able to access variables using coordinate variables. I can get the same subset using the following. (It’s also more explicit about what is being selected and robust in case I modify the DataArray and expect the same output.)\n\nds['air'].sel(time='2013-01-01').time\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'time' (time: 4)>\narray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\nAttributes:\n standard_name: time\n long_name: Timexarray.DataArray'time'time: 42013-01-01 2013-01-01T06:00:00 2013-01-01T12:00:00 2013-01-01T18:00:00array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Coordinates: (1)time(time)datetime64[ns]2013-01-01 ... 2013-01-01T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (2)standard_name :timelong_name :Time\n\n\n\nds.air.sel(time='2013-01-01')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 4, lat: 25, lon: 53)>\narray([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 22.450012, 22.25 , 22.25 , ..., 23.140015,\n 22.140015, 21.850006],\n [ 23.049988, 23.350006, 23.140015, ..., 23.25 ,\n 22.850006, 22.450012],\n [ 23.25 , 23.140015, 23.25 , ..., 23.850006,\n 23.850006, 23.640015]],\n\n [[-31.259995, -31.350006, -31.350006, ..., -38.759995,\n -37.649994, -35.550003],\n [-26.850006, -27.850006, -28.949997, ..., -42.259995,\n -41.649994, -38.649994],\n [-16.549988, -18.449997, -21.050003, ..., -42.449997,\n -41.350006, -37.050003],\n ...,\n [ 23.450012, 23.25 , 22.850006, ..., 23.350006,\n 22.640015, 22.140015],\n [ 23.850006, 24.350006, 23.950012, ..., 23.640015,\n 23.450012, 23.140015],\n [ 24.350006, 24.549988, 24.350006, ..., 24.640015,\n 24.850006, 24.75 ]]], dtype=float32)\nCoordinates:\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n * time (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 4lat: 25lon: 53-31.95 -30.65 -29.65 -29.15 -29.05 ... 25.45 25.05 24.64 24.85 24.75array([[[-31.949997, -30.649994, -29.649994, ..., -40.350006,\n -37.649994, -34.550003],\n [-29.350006, -28.649994, -28.449997, ..., -40.350006,\n -37.850006, -33.850006],\n [-23.149994, -23.350006, -24.259995, ..., -39.949997,\n -36.759995, -31.449997],\n ...,\n [ 23.450012, 23.049988, 23.25 , ..., 22.25 ,\n 21.950012, 21.549988],\n [ 22.75 , 23.049988, 23.640015, ..., 22.75 ,\n 22.75 , 22.049988],\n [ 23.140015, 23.640015, 23.950012, ..., 23.75 ,\n 23.640015, 23.450012]],\n\n [[-31.050003, -30.449997, -30.050003, ..., -41.149994,\n -39.550003, -37.350006],\n [-29.550003, -29.050003, -28.949997, ..., -42.149994,\n -40.649994, -37.449997],\n [-19.949997, -20.259995, -21.050003, ..., -42.350006,\n -39.759995, -34.649994],\n...\n [ 22.450012, 22.25 , 22.25 , ..., 23.140015,\n 22.140015, 21.850006],\n [ 23.049988, 23.350006, 23.140015, ..., 23.25 ,\n 22.850006, 22.450012],\n [ 23.25 , 23.140015, 23.25 , ..., 23.850006,\n 23.850006, 23.640015]],\n\n [[-31.259995, -31.350006, -31.350006, ..., -38.759995,\n -37.649994, -35.550003],\n [-26.850006, -27.850006, -28.949997, ..., -42.259995,\n -41.649994, -38.649994],\n [-16.549988, -18.449997, -21.050003, ..., -42.449997,\n -41.350006, -37.050003],\n ...,\n [ 23.450012, 23.25 , 22.850006, ..., 23.350006,\n 22.640015, 22.140015],\n [ 23.850006, 24.350006, 23.950012, ..., 23.640015,\n 23.450012, 23.140015],\n [ 24.350006, 24.549988, 24.350006, ..., 24.640015,\n 24.850006, 24.75 ]]], dtype=float32)Coordinates: (3)lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2013-01-01T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', '2013-01-01T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nI can also do slices. I’ll extract temperatures for the state of Colorado. The bounding box for the state is [-109 E, -102 E, 37 N, 41 N].\nIn the code below, pay attention to both the order of the coordinates and the range of values. The first value of the lat coordinate variable is 41 N, the second value is 37 N. Unfortunately, xarray expects slices of coordinates to be in the same order as the coordinates. Note lon is 0 to 360 not -180 to 180, and I let python calculate it for me within the slice.\n\nds.air.sel(lat=slice(41.,37.), lon=slice(360-109,360-102))\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920, lat: 2, lon: 3)>\narray([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)\nCoordinates:\n * lat (lat) float32 40.0 37.5\n * lon (lon) float32 252.5 255.0 257.5\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920lat: 2lon: 3-10.05 -9.25 -8.75 -6.25 -6.55 ... -15.36 -13.66 -13.76 -15.96 -14.46array([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)Coordinates: (3)lat(lat)float3240.0 37.5standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([40. , 37.5], dtype=float32)lon(lon)float32252.5 255.0 257.5standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([252.5, 255. , 257.5], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nWhat if we want temperature for a point, for example Denver, CO (39.72510678889283 N, -104.98785545855408 E). xarray can handle this! If we just want data from the nearest grid point, we can use sel and specify the method as “nearest”.\n\ndenver_lat, denver_lon = 39.72510678889283, -104.98785545855408\n\n\nds.air.sel(lat=denver_lat, lon=360+denver_lon, method='nearest').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nIf we want to interpolate, we can use interp(). In this case I use linear or bilinear interpolation.\ninterp() can also be used to resample data to a new grid and even reproject data\n\nds.air.interp(lat=denver_lat, lon=360+denver_lon, method='linear')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'air' (time: 2920)>\narray([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n lat float64 39.73\n lon float64 255.0\nAttributes:\n long_name: 4xDaily Air temperature at sigma level 995\n units: degC\n precision: 2\n GRIB_id: 11\n GRIB_name: TMP\n var_desc: Air temperature\n dataset: NMC Reanalysis\n level_desc: Surface\n statistic: Individual Obs\n parent_stat: Other\n actual_range: [185.16 322.1 ]xarray.DataArray'air'time: 2920-8.951 -14.5 -18.44 -11.33 -8.942 ... -22.4 -27.79 -25.79 -15.42array([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])Coordinates: (3)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')lat()float6439.73standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray(39.72510679)lon()float64255.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray(255.01214454)Attributes: (11)long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]\n\n\nsel() and interp() can also be used on Dataset objects.\n\nds.sel(lat=slice(41,37), lon=slice(360-109,360-102))\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 2, time: 2920, lon: 3)\nCoordinates:\n * lat (lat) float32 40.0 37.5\n * lon (lon) float32 252.5 255.0 257.5\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\nData variables:\n air (time, lat, lon) float32 -10.05 -9.25 -8.75 ... -15.96 -14.46\n air_kelvin (time, lat, lon) float32 263.1 263.9 264.4 ... 259.4 257.2 258.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:lat: 2time: 2920lon: 3Coordinates: (3)lat(lat)float3240.0 37.5standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([40. , 37.5], dtype=float32)lon(lon)float32252.5 255.0 257.5standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([252.5, 255. , 257.5], dtype=float32)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)air(time, lat, lon)float32-10.05 -9.25 ... -15.96 -14.46long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-10.049988 , -9.25 , -8.75 ],\n [ -6.25 , -6.549988 , -6.3599854]],\n\n [[-18.149994 , -14.950012 , -9.950012 ],\n [-13.649994 , -11.049988 , -7.25 ]],\n\n [[-20.449997 , -18.649994 , -13.359985 ],\n [-19.350006 , -16.950012 , -11.25 ]],\n\n ...,\n\n [[-24.460007 , -28.259995 , -25.759995 ],\n [-16.959991 , -24.059998 , -24.059998 ]],\n\n [[-24.36 , -26.160004 , -23.460007 ],\n [-15.959991 , -22.86 , -22.960007 ]],\n\n [[-17.559998 , -15.359985 , -13.660004 ],\n [-13.76001 , -15.959991 , -14.459991 ]]], dtype=float32)air_kelvin(time, lat, lon)float32263.1 263.9 264.4 ... 257.2 258.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[263.1 , 263.9 , 264.4 ],\n [266.9 , 266.6 , 266.79 ]],\n\n [[255. , 258.19998, 263.19998],\n [259.5 , 262.1 , 265.9 ]],\n\n [[252.7 , 254.5 , 259.79 ],\n [253.79999, 256.19998, 261.9 ]],\n\n ...,\n\n [[248.68999, 244.89 , 247.39 ],\n [256.19 , 249.09 , 249.09 ]],\n\n [[248.79 , 246.98999, 249.68999],\n [257.19 , 250.29 , 250.18999]],\n\n [[255.59 , 257.79 , 259.49 ],\n [259.38998, 257.19 , 258.69 ]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\n\nds.interp(lat=denver_lat, lon=360+denver_lon, method='linear')\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 2920)\nCoordinates:\n * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n lat float64 39.73\n lon float64 255.0\nData variables:\n air (time) float64 -8.951 -14.5 -18.44 ... -27.79 -25.79 -15.42\n air_kelvin (time) float64 264.2 258.7 254.7 261.8 ... 245.4 247.4 257.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:time: 2920Coordinates: (3)time(time)datetime64[ns]2013-01-01 ... 2014-12-31T18:00:00standard_name :timelong_name :Timearray(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n dtype='datetime64[ns]')lat()float6439.73standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray(39.72510679)lon()float64255.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray(255.01214454)Data variables: (2)air(time)float64-8.951 -14.5 ... -25.79 -15.42long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([ -8.95085077, -14.49752791, -18.43715163, ..., -27.78736503,\n -25.78552388, -15.41780902])air_kelvin(time)float64264.2 258.7 254.7 ... 247.4 257.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([264.19914312, 258.65246598, 254.71284227, ..., 245.36262886,\n 247.36447002, 257.73218487])Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html" + }, + { + "objectID": "external/Introduction_to_xarray.html#analysis", + "href": "external/Introduction_to_xarray.html#analysis", + "title": "Xarray", + "section": "Analysis", + "text": "Analysis\nAs a simple example, let’s try to calculate a mean field for the whole time range.\n\nds.mean(dim='time').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nWe can also calculate a zonal mean (averaging over longitude)\n\nds.mean(dim='lon').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nOther aggregation methods include min(), max(), std(), along with others.\n\nds.std(dim='time').hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\nThe data we have are in 6h timesteps. This can be resampled to daily or monthly. If you are familiar with pandas, xarray uses the same methods.\n\nds.resample(time='M').mean().hvplot()\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\nds_mon = ds.resample(time='M').mean()\nds_mon\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 24, lat: 25, lon: 53)\nCoordinates:\n * time (time) datetime64[ns] 2013-01-31 2013-02-28 ... 2014-12-31\n * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n * lon (lon) float32 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\nData variables:\n air (time, lat, lon) float32 -28.68 -28.49 -28.48 ... 24.57 24.56\n air_kelvin (time, lat, lon) float32 244.5 244.7 244.7 ... 297.7 297.7 297.7\nAttributes:\n Conventions: COARDS\n title: 4x daily NMC reanalysis (1948)\n description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n platform: Model\n references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...xarray.DatasetDimensions:time: 24lat: 25lon: 53Coordinates: (3)time(time)datetime64[ns]2013-01-31 ... 2014-12-31array(['2013-01-31T00:00:00.000000000', '2013-02-28T00:00:00.000000000',\n '2013-03-31T00:00:00.000000000', '2013-04-30T00:00:00.000000000',\n '2013-05-31T00:00:00.000000000', '2013-06-30T00:00:00.000000000',\n '2013-07-31T00:00:00.000000000', '2013-08-31T00:00:00.000000000',\n '2013-09-30T00:00:00.000000000', '2013-10-31T00:00:00.000000000',\n '2013-11-30T00:00:00.000000000', '2013-12-31T00:00:00.000000000',\n '2014-01-31T00:00:00.000000000', '2014-02-28T00:00:00.000000000',\n '2014-03-31T00:00:00.000000000', '2014-04-30T00:00:00.000000000',\n '2014-05-31T00:00:00.000000000', '2014-06-30T00:00:00.000000000',\n '2014-07-31T00:00:00.000000000', '2014-08-31T00:00:00.000000000',\n '2014-09-30T00:00:00.000000000', '2014-10-31T00:00:00.000000000',\n '2014-11-30T00:00:00.000000000', '2014-12-31T00:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float3275.0 72.5 70.0 ... 20.0 17.5 15.0standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yarray([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n 15. ], dtype=float32)lon(lon)float32200.0 202.5 205.0 ... 327.5 330.0standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xarray([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n 325. , 327.5, 330. ], dtype=float32)Data variables: (2)air(time, lat, lon)float32-28.68 -28.49 ... 24.57 24.56long_name :4xDaily Air temperature at sigma level 995units :degCprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[-28.68323 , -28.486452 , -28.479755 , ..., -30.658554 ,\n -29.743628 , -28.474194 ],\n [-26.076784 , -26.127504 , -26.4225 , ..., -32.5679 ,\n -31.105167 , -28.442825 ],\n [-22.770565 , -23.31516 , -24.042498 , ..., -31.165657 ,\n -28.38291 , -24.144924 ],\n ...,\n [ 22.688152 , 22.00097 , 21.773153 , ..., 22.218397 ,\n 21.734531 , 21.118395 ],\n [ 23.31952 , 23.16702 , 22.698233 , ..., 22.43775 ,\n 22.190727 , 21.715578 ],\n [ 23.903486 , 23.89203 , 23.585333 , ..., 23.154608 ,\n 22.947426 , 22.889124 ]],\n\n [[-32.41607 , -32.44866 , -32.738483 , ..., -31.54482 ,\n -30.430185 , -29.205448 ],\n [-31.216885 , -31.08063 , -31.236965 , ..., -32.135708 ,\n -30.825186 , -28.42241 ],\n [-27.826433 , -28.123934 , -28.78045 , ..., -29.734114 ,\n -27.383936 , -23.491434 ],\n...\n [ 24.899088 , 24.200085 , 24.072004 , ..., 24.861843 ,\n 24.510258 , 23.995668 ],\n [ 25.815008 , 25.661922 , 25.121607 , ..., 24.954088 ,\n 25.071083 , 24.735588 ],\n [ 26.023424 , 26.06767 , 25.74576 , ..., 25.566338 ,\n 25.591848 , 25.630259 ]],\n\n [[-26.348473 , -26.260897 , -26.380894 , ..., -33.07903 ,\n -32.067986 , -30.868315 ],\n [-25.419994 , -24.849277 , -24.405483 , ..., -34.531376 ,\n -32.82783 , -30.179682 ],\n [-23.181051 , -23.56476 , -23.574757 , ..., -35.446938 ,\n -31.91259 , -26.923311 ],\n ...,\n [ 23.299198 , 22.541454 , 22.60839 , ..., 23.378307 ,\n 23.067505 , 22.662996 ],\n [ 24.295895 , 24.286139 , 24.031782 , ..., 23.80259 ,\n 23.908312 , 23.579037 ],\n [ 24.897346 , 25.076134 , 24.909689 , ..., 24.547583 ,\n 24.573233 , 24.560413 ]]], dtype=float32)air_kelvin(time, lat, lon)float32244.5 244.7 244.7 ... 297.7 297.7long_name :4xDaily Air temperature at sigma level 995units :degKprecision :2GRIB_id :11GRIB_name :TMPvar_desc :Air temperaturedataset :NMC Reanalysislevel_desc :Surfacestatistic :Individual Obsparent_stat :Otheractual_range :[185.16 322.1 ]array([[[244.4667 , 244.66354, 244.67027, ..., 242.49142, 243.40633,\n 244.67577],\n [247.07323, 247.02248, 246.7275 , ..., 240.58205, 242.04489,\n 244.70726],\n [250.37941, 249.83484, 249.10748, ..., 241.98434, 244.76712,\n 249.00505],\n ...,\n [295.83795, 295.15085, 294.9229 , ..., 295.36826, 294.88437,\n 294.26828],\n [296.46942, 296.31686, 295.84802, ..., 295.5876 , 295.34058,\n 294.86536],\n [297.05316, 297.0418 , 296.73517, ..., 296.30438, 296.09732,\n 296.0389 ]],\n\n [[240.73384, 240.7013 , 240.4115 , ..., 241.60518, 242.71988,\n 243.94455],\n [241.93309, 242.06935, 241.913 , ..., 241.01428, 242.32481,\n 244.72758],\n [245.32361, 245.0261 , 244.36955, ..., 243.41588, 245.7661 ,\n 249.65858],\n...\n [298.04895, 297.35007, 297.22195, ..., 298.01172, 297.66013,\n 297.14554],\n [298.96484, 298.81186, 298.27136, ..., 298.10403, 298.22104,\n 297.88547],\n [299.17334, 299.2175 , 298.89566, ..., 298.71625, 298.74167,\n 298.7802 ]],\n\n [[246.80156, 246.88907, 246.76907, ..., 240.07089, 241.08206,\n 242.2817 ],\n [247.72998, 248.30064, 248.74443, ..., 238.61859, 240.3222 ,\n 242.97026],\n [249.96893, 249.58516, 249.57521, ..., 237.70308, 241.23743,\n 246.22667],\n ...,\n [296.4491 , 295.6914 , 295.75824, ..., 296.52817, 296.21747,\n 295.8128 ],\n [297.44586, 297.43613, 297.1817 , ..., 296.95242, 297.05823,\n 296.72897],\n [298.0472 , 298.22598, 298.0595 , ..., 297.6975 , 297.72318,\n 297.71024]]], dtype=float32)Attributes: (5)Conventions :COARDStitle :4x daily NMC reanalysis (1948)description :Data is from NMC initialized reanalysis\n(4x/day). These are the 0.9950 sigma level values.platform :Modelreferences :http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html\n\n\nThis is a really short time series but as an example, let’s calculate a monthly climatology (at least for 2 months). For this we can use groupby()\n\nds_clim = ds_mon.groupby(ds_mon.time.dt.month).mean()" + }, + { + "objectID": "external/Introduction_to_xarray.html#plot-results", + "href": "external/Introduction_to_xarray.html#plot-results", + "title": "Xarray", + "section": "Plot results", + "text": "Plot results\nFinally, let’s plot the results! This will plot the lat/lon axes of the original ds DataArray.\n\nds_clim.air.sel(month=10).plot()" + }, + { + "objectID": "external/VisualizeDopplerScattData.html", + "href": "external/VisualizeDopplerScattData.html", + "title": "S-MODE Workshop: Science Case Study Airborne Part 2", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop\n%load_ext autoreload\n%autoreload 2\nimport sys\nsys.path.append('../src')\nfrom matplotlib import pyplot as plt\n%matplotlib inline\nfrom pathlib import Path\nimport numpy as np\nimport rioxarray\nimport xarray as xr\nfrom plot_dopplerscatt_data import make_streamplot_image\nimport warnings\nwarnings.simplefilter('ignore')", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "S-MODE", + "Case Study Airborne Part 2" + ] + }, + { + "objectID": "external/VisualizeDopplerScattData.html#apply-the-good-data-mask-for-all-current-observations", + "href": "external/VisualizeDopplerScattData.html#apply-the-good-data-mask-for-all-current-observations", + "title": "S-MODE Workshop: Science Case Study Airborne Part 2", + "section": "Apply the good data mask for all current observations", + "text": "Apply the good data mask for all current observations\nOnly accept estimates that use a minimum number of observations. The current recommended number is 4. Use the variable nobs_all_lines to make a mask and then mask all variables\n\ndef mask_velocity_all_lines(ds, minobs, data_vars, vthresh=0.1):\n \"\"\"Mask all measurements with fewer than minobs observations.\"\"\"\n bad = ( (ds.nobs_all_lines.data < minobs) |\n (ds.u_current_error_all_lines.data > vthresh) |\n (ds.v_current_error_all_lines.data > vthresh) )\n for v in data_vars:\n if np.issubdtype(ds[v].dtype, np.floating):\n ds[v].data[bad] = np.nan\n return ds\n\n\nminobs = 4\nvthresh =0.1\ndata_vars = [\n 'u_current_all_lines',\n 'v_current_all_lines',\n 'u_current_error_all_lines',\n 'v_current_error_all_lines']\nds_all = mask_velocity_all_lines(ds_all, minobs, data_vars, vthresh)", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "S-MODE", + "Case Study Airborne Part 2" + ] + }, + { + "objectID": "external/cof-zarr-reformat.html", + "href": "external/cof-zarr-reformat.html", + "title": "COF Zarr Access via Reformat", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.", + "crumbs": [ + "Tutorials", + "Cloud Optimized Examples", + "zarr2netCDF" + ] + }, + { + "objectID": "external/cof-zarr-reformat.html#getting-started", + "href": "external/cof-zarr-reformat.html#getting-started", + "title": "COF Zarr Access via Reformat", + "section": "Getting Started", + "text": "Getting Started\nWe will access monthly ocean bottom pressure (OBP) data from ECCO V4r4 (10.5067/ECG5M-OBP44), which are provided as a monthly time series on a 0.5-degree latitude/longitude grid.\nThe data are archived in netCDF format. However, this notebook demonstration will request conversion to Zarr format for files covering the period between 2010 and 2018. Upon receiving our request, Harmony’s backend will convert the files and stage them in S3 for native access in AWS (us-west-2 region, specifically). We will access the new Zarr datasets as an aggregated dataset using xarray, and leverage the S3 native protocols for direct access to the data in an efficient manner.\n\n\nRequirements\n\nAWS\nThis notebook should be running in an EC2 instance in AWS region us-west-2, as previously mentioned. We recommend using an EC2 with at least 8GB of memory available.\nThe notebook was developed and tested using a t2.large instance (2 cpus; 8GB memory).\n\n\nPython 3\nMost of these imports are from the Python standard library. However, you will need to install these packages into your Python 3 environment if you have not already done so:\n\ns3fs\nrequests\npandas\nxarray\nmatplotlib\n\n\n\n\nRequirements\n\nimport matplotlib.pyplot as plt\nimport xarray as xr\nimport pandas as pd\nimport numpy as np\nimport requests\nimport json\nimport time\nimport s3fs\n\nShortName = \"ECCO_L4_OBP_05DEG_MONTHLY_V4R4\"\n\n\n\nStudy period\nSet some “master” inputs to define the time and place contexts for our case studies in the ipynb. This example will be requesting time subsets and receiving global data back from the Harmony API.\n\nstart_date = \"2010-01-01\"\nend_date = \"2018-12-31\"\n\n\n\nData Access\nSome features in the Harmony API require us to identify the target dataset/collection by its concept-id (which uniquely idenfifies it among the other datasets in the Common Metadata Repository). Support for selection by the dataset ShortName will be added in a future release.\n\nCommon Metadata Repository (CMR)\nFor now, we will need to get the concept-id that corresponds to our dataset by accessing its metadata from the CMR. Read more about the CMR at: https://cmr.earthdata.nasa.gov/\nRequest the UMM Collection metadata (i.e. metadata about the dataset) from the CMR and select the concept-id as a new variable ccid.\n\nresponse = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': ShortName,\n 'page_size': 1}\n)\n\nummc = response.json()['items'][0]\n\nccid = ummc['meta']['concept-id']\n\nccid\n\n'C1990404791-POCLOUD'\n\n\n\n\nHarmony API\nAnd get the Harmony API endpoint and zarr parameter like we did for SMAP before:\n\nbase = f\"https://harmony.earthdata.nasa.gov/{ccid}\"\nhreq = f\"{base}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset\"\nrurl = f\"{hreq}?format=application/x-zarr\"\n\nprint(rurl)\n\nhttps://harmony.earthdata.nasa.gov/C1990404791-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr\n\n\nECCO monthly collections have 312 granules in V4r4 (you can confirm with the granule listing from CMR Search API) so we can get the entire time series for 2010 to 2018 with one request to the Harmony API.\nFormat a string of query parameters to limit the processing to the desired time period. Then, append the string of time subset parameters to the variable rurl.\n\nsubs = '&'.join([f'subset=time(\"{start_date}T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")'])\n\nrurl = f\"{rurl}&{subs}\"\n\nprint(rurl)\n\nhttps://harmony.earthdata.nasa.gov/C1990404791-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr&subset=time(\"2010-01-01T00:00:00.000Z\":\"2018-12-31T23:59:59.999Z\")\n\n\nSubmit the request and monitor the processing status in a while loop, breaking it on completion of the request job:\n\nresponse = requests.get(url=rurl).json()\n\n# Monitor status in a while loop. Wait 10 seconds for each check.\nwait = 10\nwhile True:\n response = requests.get(url=response['links'][0]['href']).json()\n if response['status']!='running':\n break\n print(f\"Job in progress ({response['progress']}%)\")\n time.sleep(wait)\n\nprint(\"DONE!\")\n\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nJob in progress (0%)\nDONE!\n\n\nAccess the staged cloud datasets over native AWS interfaces\nCheck the message field in the response for clues about how to proceed:\n\nprint(response['message'])\n\nThe job has completed successfully. Contains results in AWS S3. Access from AWS us-west-2 with keys from https://harmony.earthdata.nasa.gov/cloud-access.sh\n\n\nThe third item in the list of links contains the shell script from the job status message printed above. Let’s download the same information in JSON format. It should be the fourth item; check to be sure:\n\nlen(response['links'])\n\n102\n\n\nSelect the url and download the json, then load to Python dictionary and print the keys:\n\nwith requests.get(response['links'][3]['href']) as r:\n creds = r.json()\n\nprint(creds.keys())\n\ndict_keys(['AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration'])\n\n\nCheck the expiration timestamp for the temporary credentials:\n\ncreds['Expiration']\n\n'2021-06-11T02:36:29.000Z'\n\n\nOpen zarr datasets with s3fs and xarray\nGet the s3 output directory and list of zarr datasets from the list of links. The s3 directory should be the fifth item; the urls are from item six onward:\n\ns3_dir = response['links'][4]['href']\n\nprint(s3_dir)\n\ns3://harmony-prod-staging/public/harmony/netcdf-to-zarr/2295236b-8086-4543-9482-f524a9f2d0c3/\n\n\nNow select the URLs for the staged files and print the first one:\n\ns3_urls = [u['href'] for u in response['links'][5:]]\n\nprint(s3_urls[0])\n\ns3://harmony-prod-staging/public/harmony/netcdf-to-zarr/2295236b-8086-4543-9482-f524a9f2d0c3/OCEAN_BOTTOM_PRESSURE_mon_mean_2009-12_ECCO_V4r4_latlon_0p50deg.zarr\n\n\nUse the AWS s3fs package and your temporary aws_creds to open the zarr directory storage:\n\ns3 = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\n\nlen(s3.ls(s3_dir))\n\n97\n\n\nPlot the first Ocean Bottom Pressure dataset\nCheck out the documentation for xarray’s open_zarr method at this link. Open the first dataset and plot the OBP variable:\n\nds0 = xr.open_zarr(s3.get_mapper(s3_urls[0]), decode_cf=True, mask_and_scale=True)\n\n# Mask the dataset where OBP is not within the bounds of the variable's valid min/max:\nds0_masked = ds0.where((ds0.OBP>=ds0.OBP.valid_min) & (ds0.OBP<=ds0.OBP.valid_max))\n\n# Plot the masked dataset\nds0_masked.OBP.isel(time=0).plot.imshow(size=10)\n\n\n\n\n\n\n\n\nLoad the zarr datasets into one large xarray dataset\nLoad all the datasets in a loop and concatenate them:\n\nzds = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls], dim=\"time\")\n\nprint(zds)\n\n<xarray.Dataset>\nDimensions: (latitude: 360, longitude: 720, nv: 2, time: 97)\nCoordinates:\n * latitude (latitude) float64 -89.75 -89.25 -88.75 ... 89.25 89.75\n latitude_bnds (latitude, nv) float64 -90.0 -89.5 -89.5 ... 89.5 89.5 90.0\n * longitude (longitude) float64 -179.8 -179.2 -178.8 ... 179.2 179.8\n longitude_bnds (longitude, nv) float64 -180.0 -179.5 -179.5 ... 179.5 180.0\n * time (time) datetime64[ns] 2009-12-16T12:00:00 ... 2017-12-16T...\n time_bnds (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>\nDimensions without coordinates: nv\nData variables:\n OBP (time, latitude, longitude) float64 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>\n OBPGMAP (time, latitude, longitude) float64 dask.array<chunksize=(1, 360, 720), meta=np.ndarray>\nAttributes: (12/57)\n Conventions: CF-1.8, ACDD-1.3\n acknowledgement: This research was carried out by the Jet Pr...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon grid. ...\n coordinates_comment: Note: the global 'coordinates' attribute de...\n ... ...\n time_coverage_duration: P1M\n time_coverage_end: 2010-01-01T00:00:00\n time_coverage_resolution: P1M\n time_coverage_start: 2009-12-01T00:00:00\n title: ECCO Ocean Bottom Pressure - Monthly Mean 0...\n uuid: 297c8df0-4158-11eb-b208-0cc47a3f687b\n\n\nReference OBP and mask the dataset according to the valid minimum and maximum:\n\nobp = zds.OBP\n\nprint(obp)\n\n<xarray.DataArray 'OBP' (time: 97, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(97, 360, 720), dtype=float64, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * latitude (latitude) float64 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\n * time (time) datetime64[ns] 2009-12-16T12:00:00 ... 2017-12-16T06:00:00\nAttributes:\n comment: OBP excludes the contribution from global mean at...\n coverage_content_type: modelResult\n long_name: Ocean bottom pressure given as equivalent water t...\n units: m\n valid_max: 72.07011413574219\n valid_min: -1.7899188995361328\n\n\nGet the valid min and max from the corresponding CF attributes:\n\nobp_vmin, obp_vmax = obp.valid_min, obp.valid_max\n\nobp_vmin, obp_vmax\n\n(-1.7899188995361328, 72.07011413574219)\n\n\nMask the dataset according to the OBP min and max and plot a series:\n\n# Mask dataset where not inside OBP variable valid min/max:\nzds_masked = zds.where((obp>=obp_vmin)&(obp<=obp_vmax))\n\n# Plot SSH again for the first 12 time slices:\nobpp = zds_masked.OBP.isel(time=slice(0, 6)).plot(\n x=\"longitude\", \n y=\"latitude\", \n col=\"time\",\n levels=8,\n col_wrap=3, \n add_colorbar=False,\n figsize=(14, 8)\n)\n\n# Plot a colorbar on a secondary axis\nmappable = obpp.axes[0][0].collections[0]\ncax = plt.axes([0.05, -0.04, 0.95, 0.04])\ncbar1 = plt.colorbar(mappable, cax=cax, orientation='horizontal')", + "crumbs": [ + "Tutorials", + "Cloud Optimized Examples", + "zarr2netCDF" + ] + }, + { + "objectID": "external/SWOT_SSH_dashboard.html", + "href": "external/SWOT_SSH_dashboard.html", + "title": "Integrating Dask, Kerchunk, Zarr and Xarray", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.", + "crumbs": [ + "Advanced Cloud", + "Dask, Kerchunk, & Zarr" + ] + }, + { + "objectID": "external/SWOT_SSH_dashboard.html#background", + "href": "external/SWOT_SSH_dashboard.html#background", + "title": "Integrating Dask, Kerchunk, Zarr and Xarray", + "section": "Background", + "text": "Background\n\nThis notebook allows you to visualize large amounts of SWOT data in an interactive dashboard\nConnects to PO.DAAC s3 SWOT collection\nReads data as zarr cloud-optimized data store\nAccess to terabytes of data in milliseconds\nTo run this notebook the SWOT_L2_LR_SSH_Expert_2.0.json file is needed.", + "crumbs": [ + "Advanced Cloud", + "Dask, Kerchunk, & Zarr" + ] + }, + { + "objectID": "external/SWOT_SSH_dashboard.html#instructions", + "href": "external/SWOT_SSH_dashboard.html#instructions", + "title": "Integrating Dask, Kerchunk, Zarr and Xarray", + "section": "Instructions", + "text": "Instructions\n\nLoad this notebook into a JupyterHub cloud environment\nCreate a .netrc file (NASA Earthdata account)\n\ncd ~\ntouch .netrc\necho \"machine urs.earthdata.nasa.gov login [USERNAME] password [PASSWORD]\" > .netrc\n\nGet the SWOT swaths shapefile for fast spatial and temporal subsetting\n\nwget https://www.aviso.altimetry.fr/fileadmin/documents/missions/Swot/sph_science_swath.zip\nunzip sph_science_swath.zip\n\nGet the combined metadata file SWOT_L2_LR_SSH_Expert_2.0.json\n\n\nNASA VEDA JupyterHub users: The notebook already has code to read the json from VEDA s3\n\n\nimport s3fs\nimport glob\nimport dask\nimport ujson\nimport cartopy\nimport requests\nimport earthaccess\nimport hvplot.dask\nimport hvplot.pandas\nimport hvplot.xarray\n\nimport numpy as np\nimport panel as pn\nimport pandas as pd\nimport xarray as xr\nimport holoviews as hv\nimport geopandas as gpd\nimport cartopy.crs as ccrs\nimport panel.widgets as pnw\nimport matplotlib.pyplot as plt\n\nfrom tqdm.notebook import tqdm\nfrom dask.distributed import Client\nfrom shapely.geometry import Polygon\n\nhv.extension('bokeh')\nhv.renderer('bokeh').webgl = True\npn.param.ParamMethod.loading_indicator = True", + "crumbs": [ + "Advanced Cloud", + "Dask, Kerchunk, & Zarr" + ] + }, + { + "objectID": "external/SWOT_SSH_dashboard.html#start-dask-cluster", + "href": "external/SWOT_SSH_dashboard.html#start-dask-cluster", + "title": "Integrating Dask, Kerchunk, Zarr and Xarray", + "section": "Start Dask cluster", "text": "Start Dask cluster\n\nData can be read from s3 in parallel and used by hvplot\n\n\nclient = Client()\nclient\n\n\n \n \n Client\n Client-a98b3e17-0bf6-11ef-a03f-026f296dd6e0\n \n\n\n\nConnection method: Cluster object\nCluster type: distributed.LocalCluster\n\n\nDashboard: /user/ayushnag/proxy/8787/status\n\n\n\n\n\n\n \n \n Launch dashboard in JupyterLab\n \n \n\n \n \n Cluster Info\n \n \n \n \n LocalCluster\n b2c50b04\n \n\n\n\nDashboard: /user/ayushnag/proxy/8787/status\nWorkers: 4\n\n\nTotal threads: 4\nTotal memory: 29.67 GiB\n\n\nStatus: running\nUsing processes: True\n\n\n\n\n\n \n \n Scheduler Info\n \n\n \n \n \n \n Scheduler\n Scheduler-fbf59411-ff23-476d-8aee-b7db54450a06\n \n\n\n\nComm: tcp://127.0.0.1:42863\nWorkers: 4\n\n\nDashboard: /user/ayushnag/proxy/8787/status\nTotal threads: 4\n\n\nStarted: Just now\nTotal memory: 29.67 GiB\n\n\n\n\n \n \n\n \n \n Workers\n \n\n \n \n \n \n \n \n Worker: 0\n \n \n\n\n\nComm: tcp://127.0.0.1:40817\nTotal threads: 1\n\n\nDashboard: /user/ayushnag/proxy/45049/status\nMemory: 7.42 GiB\n\n\nNanny: tcp://127.0.0.1:33155\n\n\n\nLocal directory: /tmp/dask-scratch-space/worker-64j5i085\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 1\n \n \n\n\n\nComm: tcp://127.0.0.1:46235\nTotal threads: 1\n\n\nDashboard: /user/ayushnag/proxy/42525/status\nMemory: 7.42 GiB\n\n\nNanny: tcp://127.0.0.1:43931\n\n\n\nLocal directory: /tmp/dask-scratch-space/worker-hzb_4wkm\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 2\n \n \n\n\n\nComm: tcp://127.0.0.1:40923\nTotal threads: 1\n\n\nDashboard: /user/ayushnag/proxy/33679/status\nMemory: 7.42 GiB\n\n\nNanny: tcp://127.0.0.1:39777\n\n\n\nLocal directory: /tmp/dask-scratch-space/worker-a25pb2cm\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 3\n \n \n\n\n\nComm: tcp://127.0.0.1:36187\nTotal threads: 1\n\n\nDashboard: /user/ayushnag/proxy/43963/status\nMemory: 7.42 GiB\n\n\nNanny: tcp://127.0.0.1:43461\n\n\n\nLocal directory: /tmp/dask-scratch-space/worker-w4sayfiy", "crumbs": [ "Advanced Cloud", @@ -2832,306 +3124,224 @@ ] }, { - "objectID": "external/read_data.html#netcdf", - "href": "external/read_data.html#netcdf", - "title": "Read Data", - "section": "netCDF", - "text": "netCDF\n\nPythonRMATLAB\n\n\nWe recommend using xarray’s open_dataset\n\nFor a single file\nimport xarray as xr\nds = xr.open_dataset(filename)\n\n\nFor multiple files\nimport xarray as xr\nds = xr.open_mfdataset(list_of_filenames)\n\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides graphical import tools and two programmatic interfaces for interacting with netCDF files.\nThe high-level interface is made of eight high-level functions for getting information about netCDF files and their content, creating variables, writing and reading variables and attributes, and adding schema definitions to netCDF files.\nfilename = \"example.nc\";\nncdisp(filename); % Display file content\nvarname = \"peaks\";\npeaksData = ncread(filename,varname);\nsurf(peaksData);\nThe low-level interface is a thin wrapper around the underlying netCDF C library.\nfilename = \"example.nc\";\nvarname = \"peaks\";\nncID = netcdf.open(filename,\"NC_NOWRITE\");\nvarID = netcdf.inqVarID(ncID,varname);\npeaksData = netcdf.getVar(ncID,varID);\nnetcdf.close(ncID);\nsurf(peaksData);\nNotes\n\nUnlike MATLAB HDF5 interfaces, netCDF interfaces are not cloud enabled (yet).\nAs HDF5 interfaces support reading netCDF 4 files, users must currently use these interfaces for accessing netCDF 4 files stored on the cloud (see tutorial MATLAB Access Single NASA EarthData L2 NetCDF in this Cookbook).\nMATLAB netCDF interfaces support OPeNDAP and byte-range for reading data.", + "objectID": "external/SWOT_to_kerchunk.html", + "href": "external/SWOT_to_kerchunk.html", + "title": "Kerchunk JSON Generation", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#hdf5", - "href": "external/read_data.html#hdf5", - "title": "Read Data", - "section": "HDF5", - "text": "HDF5\n\nPythonRMATLAB\n\n\nFor HDF5 files, there are two methods we can use: xarray’s open_dataset and h5py\nimport xarray as xr\nds = xr.open_dataset(filename,\n group=path_to_H5netCDF_group)\n# add in directions for h5py\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides low- and high-level programmatic interfaces for interacting with HDF5 and HDF4 files.\nFocusing on HDF5, which is currently more prevalent, the high-level interface is made of seven high-level functions for getting information about HDF5 files and their content, creating datasets, and reading and writing datasets and attributes.\nfilename = \"example.h5\";\nh5disp(filename); % Display file content\nds = \"/g4/lat\";\nlat = h5read(filename,ds);\nThe low-level interface is a thin wrapper around the underlying HDF5 C library. It is made of more than 300 functions organized in packages (H5F for file management, H5D for dataset management, etc.).\nfilename = \"example.h5\";\nds = \"/g4/lat\";\nfID = H5F.open(filename); \ndsID = H5D.open(fID,ds);\nlat = H5D.read(dsID);\nH5D.close(dsID);\nH5F.close(fID);", + "objectID": "external/SWOT_to_kerchunk.html#background", + "href": "external/SWOT_to_kerchunk.html#background", + "title": "Kerchunk JSON Generation", + "section": "Background", + "text": "Background\nKerchunk is a library that provides a unified way to represent a variety of chunked, compressed data formats (e.g. NetCDF/HDF5, GRIB2, TIFF, …), allowing efficient access to the data from traditional file systems or cloud object storage. It also provides a flexible way to create virtual datasets from multiple files. It does this by extracting the byte ranges, compression information and other information about the data and storing this metadata in a new, separate object. This means that you can create a virtual aggregate dataset over potentially many source files, for efficient, parallel and cloud-friendly in-situ access without having to copy or translate the originals. It is a gateway to in-the-cloud massive data processing for legacy data archival formats. (description from Kerchunk documentation)\n ## Objectives - Generate a Kerchunk JSON file for a PODAAC SWOT Collection - Create individual JSON’s for each netCDF. Then, combine into one file using MultiZarrToZarr. - Allows data to be read from PODAAC s3 as a Zarr combined data store - output file: SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_kerchunk_DEMO.json\n\nimport os\nimport re\nimport s3fs\nimport glob\nimport zarr\nimport dask\nimport ujson\nimport fsspec\nimport requests\nimport numpy as np\nimport xarray as xr\nimport xml.etree.ElementTree as ET\n\nfrom tqdm.notebook import tqdm\nfrom dask import delayed, compute\nfrom dask.distributed import Client\n# from kerchunk.combine import auto_dask\nfrom kerchunk.hdf import SingleHdf5ToZarr\nfrom kerchunk.combine import MultiZarrToZarr", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#geotiff", - "href": "external/read_data.html#geotiff", - "title": "Read Data", - "section": "GeoTIFF", - "text": "GeoTIFF\n\nPythonRMATLAB\n\n\nFor GeoTIFF files, we recommend using rioxarray’s open_rasterio\nimport rioxarray\nxds = rioxarray.open_rasterio(\"my.tif\")\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB Mapping Toolbox supports interacting with GeoTIFF files through a series of functions for handling raster data (under Raster Data), and the function geotiffread althrough not recommended but for a few edge cases.\n[A,R] = readgeoraster(\"myGeoTiffFile.tif\");\nmapshow(A,R);", - "crumbs": [ - "How To", - "Read Data" - ] + "objectID": "external/SWOT_to_kerchunk.html#start-dask-cluster", + "href": "external/SWOT_to_kerchunk.html#start-dask-cluster", + "title": "Kerchunk JSON Generation", + "section": "Start Dask cluster", + "text": "Start Dask cluster\n\nData can be read via s3 in parallel and used by Kerchunk\nNOTE: Performance is greatly improved by more CPU’s/threads. 4 hours can become 1 hour, 90 mins can become 20 mins, etc.\nFor over 10,000 granules at least 4 threads is recommended\n\n\nclient = Client()\nclient\n\n\n \n \n Client\n Client-28f1d48e-41d3-11ee-8aca-c62ddac59d68\n \n\n\n\nConnection method: Cluster object\nCluster type: distributed.LocalCluster\n\n\nDashboard: http://127.0.0.1:8787/status\n\n\n\n\n\n\n \n \n Cluster Info\n \n \n \n \n LocalCluster\n f1696fda\n \n\n\n\nDashboard: http://127.0.0.1:8787/status\nWorkers: 4\n\n\nTotal threads: 4\nTotal memory: 8.00 GiB\n\n\nStatus: running\nUsing processes: True\n\n\n\n\n\n \n \n Scheduler Info\n \n\n \n \n \n \n Scheduler\n Scheduler-d99eecbb-b5ff-4e92-80e3-e03e51977918\n \n\n\n\nComm: tcp://127.0.0.1:33331\nWorkers: 4\n\n\nDashboard: http://127.0.0.1:8787/status\nTotal threads: 4\n\n\nStarted: Just now\nTotal memory: 8.00 GiB\n\n\n\n\n \n \n\n \n \n Workers\n \n\n \n \n \n \n \n \n Worker: 0\n \n \n\n\n\nComm: tcp://127.0.0.1:34527\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:45957/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:37945\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-yycevmql\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 1\n \n \n\n\n\nComm: tcp://127.0.0.1:36915\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:41499/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:39355\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-ivjiyl7u\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 2\n \n \n\n\n\nComm: tcp://127.0.0.1:35757\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:33523/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:44603\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-qggrwd45\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 3\n \n \n\n\n\nComm: tcp://127.0.0.1:36783\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:39605/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:34001\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-qgfewoy7", + "crumbs": [ + "Advanced Cloud", + "Kerchunk" + ] }, { - "objectID": "external/read_data.html#shapefiles-geojson", - "href": "external/read_data.html#shapefiles-geojson", - "title": "Read Data", - "section": "Shapefiles & GeoJSON", - "text": "Shapefiles & GeoJSON\n\nPythonRMATLAB\n\n\nTo open shapefiles or GeoJSON, we recommend using geopandas’s read_file.\nimport geopandas as gpd\ngdf = gpd.read_file(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB Mapping Toolbox supports interacting with shapefiles and GeoJSON files through a series of functions for handling vector data (under Vector Data), in particular readgeotable, shapeinfo, shaperead, and shapewrite.\n% Read shapefile of countries specifying the name of the attributes to read.\nS = shaperead(\"Countries.shp\",\"Attributes\",[\"ISO_2DIGIT\",\"CNTRY_NAME\"]);\n\n% Read GeoJSON data from a website and save it in the file storms.geojson.\nwebsave(\"storms.geojson\",\"https://www.spc.noaa.gov/products/outlook/day1otlk_cat.lyr.geojson\");\nGT = readgeotable(\"storms.geojson\");", + "objectID": "external/SWOT_to_kerchunk.html#request-po.daac-s3-credentials", + "href": "external/SWOT_to_kerchunk.html#request-po.daac-s3-credentials", + "title": "Kerchunk JSON Generation", + "section": "Request PO.DAAC s3 credentials", + "text": "Request PO.DAAC s3 credentials\n\n%%time\ncollection = \"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1\"\nurl = \"https://archive.podaac.earthdata.nasa.gov/s3credentials\"\ncreds = requests.get(url).json()\n\nCPU times: user 205 ms, sys: 31.1 ms, total: 236 ms\nWall time: 4.98 s", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#csv", - "href": "external/read_data.html#csv", - "title": "Read Data", - "section": "CSV", - "text": "CSV\n\nPythonRMATLAB\n\n\nTo open CSV files, we recommend using pandas’s read_csv.\nimport pandas as pd\ndf = pd.read_csv(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB supports interacting with CSV files and other tabular file formats through functions readtable, readtimetable, readcell, and readmatrix, as well as their counterparts for writing to files.\n% Read time table and display summary\nTT = readtimetable(\"myTimeTable.csv\");\nsummary(TT)\nAdvanced workflows can be implemented using detectImportOptions and functions referenced in its documentation.\n% Read variables \"TaxiIn\" and \"TaxiOut\" from airlines dataset\nfilename = \"airlinesmall.csv\";\nopts = detectImportOptions(filename);\nopts.SelectedVariableNames = [\"TaxiIn\",\"TaxiOut\"];\nT = readtable(filename, opts);\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nA general list of functions and workflows for interacting with deliimited and formatted text files is provided here.", + "objectID": "external/SWOT_to_kerchunk.html#option-1-get-list-of-remote-netcdf-files-by-collection-s3-endpoints", + "href": "external/SWOT_to_kerchunk.html#option-1-get-list-of-remote-netcdf-files-by-collection-s3-endpoints", + "title": "Kerchunk JSON Generation", + "section": "Option 1: Get list of remote netCDF files by collection (s3 endpoints)", + "text": "Option 1: Get list of remote netCDF files by collection (s3 endpoints)\n\n%%time\ns3 = s3fs.S3FileSystem(anon=False, key=creds[\"accessKeyId\"], secret=creds[\"secretAccessKey\"], token=creds[\"sessionToken\"])\ns3path = f\"s3://podaac-ops-cumulus-protected/{collection}/*.nc\"\nremote_urls = s3.glob(s3path)\nremote_urls = ['s3://' + f for f in remote_urls]\nprint(len(remote_urls))\n\n17564\nCPU times: user 6.94 s, sys: 214 ms, total: 7.15 s\nWall time: 9.96 s", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#excel", - "href": "external/read_data.html#excel", - "title": "Read Data", - "section": "Excel", - "text": "Excel\n\nPythonRMATLAB\n\n\nTo open Excel files, we recommend using pandas’s read_excel\nimport pandas as pd\ndf = pd.read_excel(filename)\n\n\nR code coming soon!\n# Coming soon!\n\n\nSee section about CSV files.", + "objectID": "external/SWOT_to_kerchunk.html#option-2-find-and-filter-s3-urls-using-nasa-cmr-search", + "href": "external/SWOT_to_kerchunk.html#option-2-find-and-filter-s3-urls-using-nasa-cmr-search", + "title": "Kerchunk JSON Generation", + "section": "Option 2: Find and filter s3 urls using NASA CMR Search", + "text": "Option 2: Find and filter s3 urls using NASA CMR Search\n\nIf you would like a certain cycle number, datetime, etc. You can choose the granules to cloud optimize using the powerful CMR search tool\nNASA CMR API Documentiation\nPO.DAAC Cookbook CMR Tutorial", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#mat-files-.mat", - "href": "external/read_data.html#mat-files-.mat", - "title": "Read Data", - "section": "MAT-Files (.mat)", - "text": "MAT-Files (.mat)\n\nPythonRMATLAB\n\n\n#coming soon! scipy & .mat\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB can interact with MAT-Files (.mat) using functions load, save, and through matfile objects.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nMultiple versions of the MAT-File format have been released. The latest, MAT-File v7.3, is based on the HDF5 file format.", + "objectID": "external/SWOT_to_kerchunk.html#open-files-with-s3fs", + "href": "external/SWOT_to_kerchunk.html#open-files-with-s3fs", + "title": "Kerchunk JSON Generation", + "section": "Open files with s3fs", + "text": "Open files with s3fs\n\n%%time\nremote_files = [s3.open(file) for file in tqdm(remote_urls)]\n\n ## Large amount of s3 netCDF’s to individual JSON’s (dask) - The PODAAC SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1 collection has 17564 granules! - Recommended to test with a smaller dataset such as remote_files[:20] - Single threaded - 625 granules = ~25 mins - 13680 granules = ~540 mins - 4 threads/workers - 625 granules = ~8 mins - 13680 granules = ~180 mins\n\ndef remaining_jsons(remote_urls: list, directory: str):\n \"\"\"\n Find set difference between remote_urls and JSONS already made in directory.\n Extracts granule name from remote url path and JSON file name\n \"\"\"\n # Extract granule names from s3 endpoints list and jsons list\n remote_granules = np.asarray([path.split('/')[-1] for path in remote_urls])\n done_granules = np.asarray([path[:-5] for path in os.listdir(directory)])\n # Find remaining files (set difference: s3 endpoints - json directory)\n remaining_indices = np.where(~np.isin(remote_granules, done_granules))[0]\n new_remote_urls = [remote_urls[idx] for idx in remaining_indices]\n print(f\"{len(remote_urls)}/{len(new_remote_urls)} files already done\")\n return remote_urls\n\n\n%%time\nout_dir = f\"{collection}_kerchunk_DEMO\"\nif not os.path.exists(out_dir):\n os.makedirs(out_dir)\n\n# If session expired, only re-run on remote_urls we don't have a JSON for\nremaining_urls = remaining_jsons(remote_urls, f\"{collection}_kerchunk_DEMO\")\n \n@dask.delayed\ndef gen_json(u: str):\n \"Generate JSON reference file for one netCDF\"\n with fsspec.open(u, mode=\"rb\", anon=False, key=creds['accessKeyId'], secret=creds['secretAccessKey'], token=creds[\"sessionToken\"]) as inf:\n single = SingleHdf5ToZarr(inf, u, inline_threshold=0)\n # Extract granule name from s3 URL\n granule = re.search(r'[^/]+$', u).group(0)\n full_filename = f'{out_dir}/{granule}.json'\n # Generate single kerchunk reference\n s = single.translate()\n if len(s) == 0:\n warnings.warn(f\"{granule} JSON generation failed\")\n # Write JSON to folder\n with open(full_filename, 'w') as f:\n ujson.dump(s, f)\n return full_filename\n \n# Define delayed list of jsons \njsons = [dask.delayed(gen_json)(file) for file in remaining_urls]\n\n# Run kerchunk single netcdf to JSON conversion in parallel\nfull_filenames = dask.compute(jsons)\n\n1066/1368 files remaining\nCPU times: user 3min 33s, sys: 22.4 s, total: 3min 55s\nWall time: 19min 36s", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#text-data-files", - "href": "external/read_data.html#text-data-files", - "title": "Read Data", - "section": "Text Data Files", - "text": "Text Data Files\n\nPythonRMATLAB\n\n\n# Coming soon!\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB provides a series of functions for interacting with text files. In addition to functions listed in sections about CSV and Binary files, MATLAB provides functions fileread for reading the content of a whole file as text, and readlines and writelines for reading/writing lines to text files.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nMATLAB patterns and regular expressions are useful for processing unstructured text data.", + "objectID": "external/SWOT_to_kerchunk.html#create-combined-kerchunk", + "href": "external/SWOT_to_kerchunk.html#create-combined-kerchunk", + "title": "Kerchunk JSON Generation", + "section": "Create combined kerchunk", + "text": "Create combined kerchunk\n\n%%time\nout_dir = f\"{collection}_kerchunk_DEMO\"\njson_files = os.listdir(out_dir)\njson_files = [f\"{out_dir}/{f}\" for f in json_files if f.endswith(\".json\")]\nmzz = MultiZarrToZarr(json_files,\n remote_protocol='s3',\n remote_options={\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]},\n coo_map={\"cycle_num\": \"attr:cycle_number\", \"pass_num\": \"attr:pass_number\"},\n concat_dims=[\"cycle_num\", \"pass_num\"]\n)\n\nout = mzz.translate()\n\nCPU times: user 1min 50s, sys: 14.3 s, total: 2min 4s\nWall time: 15min 47s\n\n\nThe args passed to SingleHdf5ToZarr and MultiZarrToZarr define how the data is read and concatenated. These parameters will need to be modified depending on how you want to concat the datasets (time, cycles). The documentation for those functions is linked above. Linked in this cell is more resources for understanding and how to use Kerchunk.\n\n%%time\njson_file = f'{collection}_kerchunk_DEMO.json'\nwith open(json_file, 'wb') as f:\n f.write(ujson.dumps(out).encode())\n\nCPU times: user 141 ms, sys: 44.4 ms, total: 185 ms\nWall time: 181 ms", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/read_data.html#binary-files", - "href": "external/read_data.html#binary-files", - "title": "Read Data", - "section": "Binary Files", - "text": "Binary Files\n\nPythonRMATLAB\n\n\nTo open binary files, we recommend using numpy’s from_file. You will need to know the dimensions and data type of the binary file and if there is an offset or header information in the binary file.\nimport numpy as np\narr = np.from_file(filepath, dtype=data_type).reshape(nrows, ncols)\n\n\nR code coming soon!\n# Coming soon!\n\n\nMATLAB supports interacting with binary files through low-level IO functions fopen, fclose, ferror, fseek, ftell, feof, fscanf, fprintf, fread, fwrite, and frewind.\nNotes\n\nMATLAB provides higher-level mechanisms form importing data files through the function importdata and the Import Tool.\nIt is rare that ones must implement custom binary data file readers/writers, because MATLAB and its toolboxes provide functions for reading and writing a large number of data file formats.", + "objectID": "external/SWOT_to_kerchunk.html#check-by-opening-dataset", + "href": "external/SWOT_to_kerchunk.html#check-by-opening-dataset", + "title": "Kerchunk JSON Generation", + "section": "Check by opening dataset", + "text": "Check by opening dataset\n\ndata = xr.open_dataset(\n \"reference://\", engine=\"zarr\", chunks={}, decode_times=False,\n backend_kwargs={\n \"storage_options\": {\n \"fo\": f'{collection}_kerchunk_DEMO.json',\n \"remote_protocol\": \"s3\",\n \"remote_options\": {\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]}\n },\n \"consolidated\": False\n }\n)\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (cycle_num: 3, pass_num: 456,\n num_lines: 9866, num_pixels: 71,\n num_sides: 2)\nCoordinates:\n * cycle_num (cycle_num) float64 3.0 4.0 5.0\n latitude (cycle_num, pass_num, num_lines, num_pixels) float64 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n latitude_nadir (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n longitude (cycle_num, pass_num, num_lines, num_pixels) float64 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n longitude_nadir (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n * pass_num (pass_num) float64 1.0 2.0 ... 583.0\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/91)\n ancillary_surface_classification_flag (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n correction_flag (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n cross_track_angle (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n cross_track_distance (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n dac (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n depth_or_elevation (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n ... ...\n wind_speed_karin (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_karin_2 (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_model_u (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_model_v (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_rad (cycle_num, pass_num, num_lines, num_sides) float32 dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>\n x_factor (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\nAttributes: (12/32)\n Conventions: CF-1.7\n contact: CNES aviso@altimetry.fr, JPL podaac@podaac.jp...\n cycle_number: 5\n ellipsoid_flattening: 0.003352810664781205\n ellipsoid_semi_major_axis: 6378137.0\n equator_longitude: 206.06188772087626\n ... ...\n right_last_longitude: 289.6585533138908\n source: Simulate product\n time_coverage_end: 2014-07-24T10:18:18.533147Z\n time_coverage_start: 2014-07-24T09:26:52.109265Z\n title: Level 2 Low Rate Sea Surface Height Data Prod...\n wavelength: 0.008385803020979xarray.DatasetDimensions:cycle_num: 3pass_num: 456num_lines: 9866num_pixels: 71num_sides: 2Coordinates: (6)cycle_num(cycle_num)float643.0 4.0 5.0array([3., 4., 5.])latitude(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlatitude_nadir(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nlongitude(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Longitude of measurement. East longitude relative to Greenwich meridian.long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlongitude_nadir(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\npass_num(pass_num)float641.0 2.0 3.0 ... 579.0 580.0 583.0array([ 1., 2., 3., ..., 579., 580., 583.])Data variables: (91)ancillary_surface_classification_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.flag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0, 1, 2, 3, 4, 5, 6]institution :European Space Agencylong_name :surface classificationsource :MODIS/GlobCoverstandard_name :status_flagvalid_max :6valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ncorrection_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for corrections.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for correctionsstandard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ncross_track_angle(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.long_name :cross-track angle from true northunits :degreesvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\ncross_track_distance(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.long_name :cross track distanceunits :mvalid_max :75000.0valid_min :-75000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndac(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.institution :LEGOS/CNES/CLSlong_name :dynamic atmospheric correctionsource :MOG2Dunits :mvalid_max :12000valid_min :-12000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndepth_or_elevation(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.institution :European Space Agencylong_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2units :mvalid_max :10000valid_min :-12000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndistance_to_coast(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Approximate distance to the nearest coast point along the Earth surface.institution :European Space Agencylong_name :distance to coastsource :MODIS/GlobCoverunits :mvalid_max :21000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndoppler_centroid(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.long_name :doppler centroid estimated by KaRInunits :1/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\ndynamic_ice_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Dynamic ice flag for the location of the KaRIn measurement.flag_meanings :no_ice probable_ice iceflag_values :[0, 1, 2]institution :EUMETSATlong_name :dynamic ice flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilitystandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ngeoid(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).long_name :geoid heightsource :EGM2008 (Pavlis et al., 2012)standard_name :geoid_height_above_reference_ellipsoidunits :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nheading_to_coast(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.long_name :heading to coastunits :degreesvalid_max :35999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nheight_cor_xover(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height correction from KaRIn crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.long_name :height correction from KaRIn crossoversunits :mvalid_max :100000valid_min :-100000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nice_conc(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Concentration of sea ice from model.institution :EUMETSATlong_name :concentration of sea icesource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilitystandard_name :sea_ice_area_fractionunits :%valid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninternal_tide_hret(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninternal_tide_sol2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Coherent internal tide.long_name :coherent internal tide (Model 2)source :TBDunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninv_bar_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.long_name :static inverse barometer effect on sea surface heightunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\niono_cor_gim_ka(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.institution :JPLlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsunits :mvalid_max :0valid_min :-5000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlatitude_avg_ssh(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nload_tide_fes(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).institution :LEGOS/CNESlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nload_tide_got(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).institution :GSFClong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlongitude_avg_ssh(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_dynamic_topography(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean dynamic topography above the geoid.institution :CNES/CLSlong_name :mean dynamic topographysource :CNES_CLS_18units :mvalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_dynamic_topography_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean dynamic topography.institution :CNES/CLSlong_name :mean dynamic topography accuracysource :CNES_CLS_18units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_cnescls(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).institution :CNES/CLSlong_name :mean sea surface height (CNES/CLS)source :CNES_CLS_15units :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_cnescls_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).institution :CNES/CLSlong_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_15units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_dtu(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).institution :DTUlong_name :mean sea surface height (DTU)source :DTU18units :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_dtu_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)institution :DTUlong_name :mean sea surface height accuracy (DTU)source :DTU18units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_wave_direction(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface wave direction.institution :Meteo Francelong_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)units :degreevalid_max :36000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_wave_period_t02(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface wind wave mean period from model spectral density second moment.institution :Meteo Francelong_name :sea surface wind wave mean periodsource :Meteo France Wave Model (MF-WAM)standard_name :sea_surface_wave_significant_periodunits :svalid_max :100valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmodel_dry_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.institution :ECMWFlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsunits :mvalid_max :-15000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmodel_wet_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.institution :ECMWFlong_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsunits :mvalid_max :0valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nnum_pt_avg(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.long_name :number of samples averagedunits :1valid_max :289valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nobp_ref_surface(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.long_name :height of reference surface used by on-board-processorunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_eq(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).long_name :equilibrium long-period ocean tide heightunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_fes(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).institution :LEGOS/CNESlong_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)units :mvalid_max :300000valid_min :-300000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_got(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).institution :GSFClong_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)units :mvalid_max :300000valid_min :-300000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_non_eq(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.institution :LEGOS/CNESlong_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\norbit_alt_rate(cycle_num, pass_num, num_lines)float32dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Orbital altitude rate with respect to the mean sea surface.long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_max :3500valid_min :-3500\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.49 MiB\n38.54 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\norbit_qual(cycle_num, pass_num, num_lines)float32dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Orbit quality flag.long_name :orbit quality flag standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.49 MiB\n38.54 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nphase_bias_ref_surface(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.long_name :height of reference surface used for phase bias calculationunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\npolarization_karin(cycle_num, pass_num, num_lines, num_sides)objectdask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.long_name :polarization for each side of the KaRIn swath\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n205.94 MiB\n154.16 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nobject\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\npole_tide(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrad_cloud_liquid_water(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Integrated cloud liquid water content from radiometer measurements.long_name :liquid water content from radiometersource :Advanced Microwave Radiometerstandard_name :atmosphere_cloud_liquid_water_content units :kg/m^2valid_max :2000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_surface_type_flag(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.flag_meanings :open_ocean coastal_ocean landflag_values :[0, 1, 2]long_name :radiometer surface type flagsource :Advanced Microwave Radiometerstandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_187(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 18.7 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :25000valid_min :13000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_238(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 23.8 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :25000valid_min :13000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_340(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 34.0 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :28000valid_min :15000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_water_vapor(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Integrated water vapor content from radiometer measurements.long_name :water vapor content from radiometersource :Advanced Microwave Radiometerstandard_name :atmosphere_water_vapor_content units :kg/m^2valid_max :15000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_wet_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mvalid_max :0valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrain_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Flag indicates that signal is attenuated, probably from rain.flag_meanings :no_rain probable_rain rainflag_values :[0, 1, 2]long_name :rain flagstandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrain_rate(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Rain rate from weather model.institution :ECMWFlong_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsunits :mm/hrvalid_max :200valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsc_altitude(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Altitude of the KMSF origin.long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mvalid_max :2000000000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_pitch(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_roll(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude roll angle; positive values move the +y antenna down.long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_yaw(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsea_state_bias_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea state bias correction to ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.long_name :sea state bias correction to heightsource :TBDunits :mvalid_max :0valid_min :-6000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsea_state_bias_cor_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea state bias correction to ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.long_name :sea state bias correction to heightsource :TBDunits :mvalid_max :0valid_min :-6000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_cor_atmos_model(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.institution :ECMWFlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsunits :1valid_max :10.0valid_min :1.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_cor_atmos_rad(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1valid_max :10.0valid_min :1.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1valid_max :10000000.0valid_min :-1000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1valid_max :10000000.0valid_min :-1000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for sigma0 from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on sigma0 from KaRIn.long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_max :1000.0valid_min :0.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_baseline_dilation(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to baseline mast dilationunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :KaRIn errorunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_orbital(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to orbital perturbationsunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_phase(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to phaseunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_roll(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to rollunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_timing(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Timing errorunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_true_ssh_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height of the sea surface free of measurement errors.long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsolid_earth_tide(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_max :10000valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin_2(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.long_name :sea surface height anomaly uncertaintyunits :mvalid_max :60000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.long_name :sea surface height anomalyunits :mvalid_max :1000000valid_min :-1000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin_2(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.long_name :sea surface height anomalyunits :mvalid_max :1000000valid_min :-1000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for the SSHA from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :sea surface height quality flagstandard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height from KaRIn volumetric correlation.long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for significant wave height from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on significant wave height from KaRIn.long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_model(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height from model.institution :ECMWFlong_name :significant wave height from wave modelsource :European Centre for Medium-Range Weather Forecastsstandard_name :sea_surface_wave_significant_heightunits :mvalid_max :30000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_sea_state_bias(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height used in sea state bias correction.long_name :SWH used in sea state bias correctionunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ntime(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>calendar :gregoriancomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.leap_second :YYYY-MM-DDThh:mm:ssZlong_name :time in UTCstandard_name :timetai_utc_difference :35.0units :seconds since 2000-01-01 00:00:00.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\ntime_tai(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>calendar :gregoriancomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].long_name :time in TAIstandard_name :timetai_utc_difference :[Value of TAI-UTC at time of first record]units :seconds since 2000-01-01 00:00:00.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nvelocity_heading(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nwind_speed_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Wind speed from KaRIn computed from sig0_karin.long_name :wind speed from KaRIn source :TBDstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_karin_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Wind speed from KaRIn computed from sig0_karin_2.long_name :wind speed from KaRIn source :TBDstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_model_u(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Eastward component of the atmospheric model wind vector at 10 meters.institution :ECMWFlong_name :u component of model windsource :European Centre for Medium-Range Weather Forecastsstandard_name :eastward_windunits :m/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_model_v(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Northward component of the atmospheric model wind vector at 10 meters.institution :ECMWFlong_name :v component of model windsource :European Centre for Medium-Range Weather Forecastsstandard_name :northward_windunits :m/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_rad(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Wind speed from radiometer measurements.long_name :wind speed from radiometersource :Advanced Microwave Radiometerstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nx_factor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Radiometric calibration X factor as a linear power ratio.long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_max :1.0000000200408773e+20valid_min :0.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nAttributes: (32)Conventions :CF-1.7contact :CNES aviso@altimetry.fr, JPL podaac@podaac.jpl.nasa.govcycle_number :5ellipsoid_flattening :0.003352810664781205ellipsoid_semi_major_axis :6378137.0equator_longitude :206.06188772087626equator_time :2014-07-24T09:52:36.962185Zgeospatial_lat_max :78.29189230598696geospatial_lat_min :-78.29203183241484geospatial_lon_max :289.6585533138908geospatial_lon_min :122.7028213028531history :2021-09-10 10:00:06Z : Creationinstitution :CNES/JPLleft_first_latitude :-77.032982418125left_first_longitude :122.7028213028531left_last_latitude :78.29189230598696left_last_longitude :289.65746162390826orbit_solution :POEpass_number :545platform :SWOTproduct_version :1.1.0.dev33reference_document :D-56407_SWOT_Product_Description_L2_LR_SSHreferences :Gaultier, L., C. Ubelmann, and L.-L. Fu, 2016: The Challenge of Using Future SWOT Data for Oceanic Field Reconstruction. J. Atmos. Oceanic Technol., 33, 119-126, doi:10.1175/jtech-d-15-0160.1. http://dx.doi.org/10.1175/JTECH-D-15-0160.1.right_first_latitude :-78.29203183241484right_first_longitude :122.70935482261133right_last_latitude :77.03284214129418right_last_longitude :289.6585533138908source :Simulate producttime_coverage_end :2014-07-24T10:18:18.533147Ztime_coverage_start :2014-07-24T09:26:52.109265Ztitle :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Wavewavelength :0.008385803020979", "crumbs": [ - "How To", - "Read Data" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/earthdata_search.html", - "href": "external/earthdata_search.html", - "title": "How do I find data using Earthdata Search?", - "section": "", - "text": "The original source for this document is https://nasa-openscapes.github.io/2021-Cloud-Workshop-AGU/tutorials/01_Earthdata_Search.html\nThis tutorial guides you through how to use Earthdata Search for NASA Earth observations search and discovery, and how to connect the search output (e.g. download or access links) to a programmatic workflow (locally or from within the cloud).\n\nStep 1. Go to Earthdata Search and Login\nGo to Earthdata Search https://search.earthdata.nasa.gov and use your Earthdata login credentials to log in. If you do not have an Earthdata account, please see the Workshop Prerequisites for guidance.\n\n\nStep 2. Search for dataset of interest\nUse the search box in the upper left to type key words. In this example we are interested in the ECCO dataset, hosted by the PO.DAAC. This dataset is available from the NASA Earthdata Cloud archive hosted in AWS cloud.\nClick on the “Available from AWS Cloud” filter option on the left. Here, 104 matching collections were found with the basic ECCO search.\n\n\n\nFigure caption: Search for ECCO data available in AWS cloud in Earthdata Search portal\n\n\nLet’s refine our search further. Let’s search for ECCO monthly SSH in the search box (which will produce 39 matching collections), and for the time period for year 2015. The latter can be done using the calendar icon on the left under the search box.\nScroll down the list of returned matches until we see the dataset of interest, in this case ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4).\nWe can click on the (i) icon for the dataset to read more details, including the dataset shortname (helpful for programmatic workflows) just below the dataset name; here ECCO_L4_SSH_05DEG_MONTHLY_V4R4.\n\n\n\nFigure caption: Refine search, set temporal bounds, get more information\n\n\n\n\nStep 3. Explore the dataset details, including Cloud Access information\nOnce we clicked the (i), scrolling down the info page for the dataset we will see Cloud Access information, such as:\n\nwhether the dataset is available in the cloud\nthe cloud Region (all NASA Earthdata Cloud data is/will be in us-west-2 region)\nthe S3 storage bucket and object prefix where this data is located\nlink that generates AWS S3 Credentials for in-cloud data access (we will cover this in the Direct Data Access Tutorials)\nlink to documentation describing the In-region Direct S3 Access to Buckets. Note: these will be unique depending on the DAAC where the data is archived. (We will show examples of direct in-region access in Tutorial 3.)\n\n\n\n\nFigure caption: Cloud access info in EDS\n\n\n\n\n\nFigure caption: Documentation describing the In-region Direct S3 Access to Buckets\n\n\nPro Tip: Clicking on “For Developers” to exapnd will provide programmatic endpoints such as those for the CMR API, and more. CMR API and CMR STAC API tutorials can be found on the 2021 Cloud Hackathon website.\nFor now, let’s say we are intersted in getting download link(s) or access link(s) for specific data files (granules) within this collection.\nAt the top of the dataset info section, click on Search Results, which will take us back to the list of datasets matching our search parameters. Clicking on the dataset (here again it’s the same ECCO Sea Surface Height - Monthly Mean 0.5 Degree (Version 4 Release 4)) we now see a list of files (granules) that are part of the dataset (collection).\n\n\nStep 4. Customize the download or data access\nClick on the green + symbol to add a few files to our project. Here we added the first 3 listed for 2015. Then click on the green button towards the bottom that says “Download”. This will take us to another page with options to customize our download or access link(s).\n\n\n\nFigure caption: Select granules and click download\n\n\n\n4.a. Entire file content\nLet’s stay we are interested in the entire file content, so we select the “Direct Download” option (as opposed to other options to subset or transform the data):\n\n\n\nFigure caption: Customize your download or access\n\n\nClicking the green Download Data button again, will take us to the final page for instructions to download and links for data access in the cloud. You should see three tabs: Download Files, AWS S3 Access, Download Script:\n \nThe Download Files tab provides the https:// links for downloading the files locally. E.g.: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc\nThe AWS S3 Access tab provides the S3:// links, which is what we would use to access the data directly in-region (us-west-2) within the AWS cloud (an example will be shown in Tutorial 3). E.g.: s3://podaac-ops-cumulus-protected/ECCO_L4_SSH_05DEG_MONTHLY_V4R4/SEA_SURFACE_HEIGHT_mon_mean_2015-09_ECCO_V4r4_latlon_0p50deg.nc where s3 indicates data is stored in AWS S3 storage, podaac-ops-cumulus-protected is the bucket, and ECCO_L4_SSH_05DEG_MONTHLY_V4R4 is the object prefix (the latter two are also listed in the dataset collection information under Cloud Access (step 3 above)).\nTip: Another quicker way to find the bucket and object prefix is from the list of data files the search returns. Next to the + green button is a grey donwload symbol. Click on that to see the Download Files https:// links or on the AWS S3 Access to get the direct S3:// access links, which contain the bucket and object prefix where data is stored.\n\n\n4.b. Subset or transform before download or access\nDAAC tools and services are also being migrated or developed in the cloud, next to that data. These include the Harmony API and OPeNDAP in the cloud, as a few examples.\nWe can leverage these cloud-based services on cloud-archived data to reduce or transform the data (depending on need) before getting the access links regardless of whether we prefer to download the data and work on a local machine or whether we want to access the data in the cloud (from a cloud workspace). These can be useful data reduction services that support a faster time to science.\nHarmony\nHarmony allows you to seamlessly analyze Earth observation data from different NASA data centers. These services (API endpoints) provide data reduction (e.g. subsetting) and transfromation services (e.g. convert netCDF data to Zarr cloud optimized format).\n\n\n\nFigure caption: Leverage Harmony cloud-based data transformation services\n\n\nWhen you click the final green Download button, the links provided are to data that had been transformed based on our selections on the previous screen (here chosing to use the Harmony service to reformat the data to Zarr). These data are staged for us in an S3 bucket in AWS, and we can use the s3:// links to access those specific data. This service also provides STAC access links. This particular example is applicable if your workflow is in the AWS us-west-2 region.\n\n\n\nFigure caption: Harmony-staged data in S3\n\n\n\n\n\nStep 5. Integrate file links into programmatic workflow, locally or in the AWS cloud.\nIn tutorial 3 Direct Data Access, we will work programmatically in the cloud to access datasets of interest, to get us set up for further scientific analysis of choice. There are several ways to do this. One way to connect the search part of the workflow we just did in Earthdata Search to our next steps working in the cloud is to simply copy/paste the s3:// links provides in Step 4 above into a JupyterHub notebook or script in our cloud workspace, and continue the data analysis from there.\nOne could also copy/paste the s3:// links and save them in a text file, then open and read the text file in the notebook or script in the JupyterHub in the cloud.\nTutorial 3 will pick up from here and cover these next steps in more detail.", + "objectID": "external/SWOT_to_kerchunk.html#alternate-large-amount-of-s3-netcdfs-to-combined-kerchunk-json-auto_dask", + "href": "external/SWOT_to_kerchunk.html#alternate-large-amount-of-s3-netcdfs-to-combined-kerchunk-json-auto_dask", + "title": "Kerchunk JSON Generation", + "section": "Alternate: Large amount of s3 netCDF’s to combined kerchunk JSON (auto_dask)", + "text": "Alternate: Large amount of s3 netCDF’s to combined kerchunk JSON (auto_dask)\n\n%%time\n# Create combined kerchunk/zarr reference. Reads cycle_number and pass_number from attributes of each netCDF\n# Concats along new dimensions cycle_number and pass_number\nout_dir = f\"{collection}_kerchunk_DEMO\"\njson_files = os.listdir(out_dir)\njson_files = [f\"{out_dir}/{f}\" for f in json_files if f.endswith(\".json\")]\nauto_dask(urls=json_files,\n n_batches=4,\n single_driver=JustLoad,\n single_kwargs={},\n mzz_kwargs={\"coo_map\": {\"cycle_num\": \"attr:cycle_number\", \"pass_num\": \"attr:pass_number\"}, \"concat_dims\": [\"cycle_num\", \"pass_num\"]},\n remote_protocol=\"s3\",\n remote_options={\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]},\n filename=f'{collection}_kerchunk_CYCLE_3.json'\n )", "crumbs": [ - "How To", - "Find Data", - "using Earthdata Search" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/ECCO_cloud_direct_access_s3.html", - "href": "external/ECCO_cloud_direct_access_s3.html", - "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.", + "objectID": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules-faster-metadata-approach", + "href": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules-faster-metadata-approach", + "title": "Kerchunk JSON Generation", + "section": "Generate list of matching size granules (faster metadata approach)", + "text": "Generate list of matching size granules (faster metadata approach)\n\ns3 = s3fs.S3FileSystem(anon=False)\ns3path = 's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/*.dmrpp'\nremote_files = s3.glob(s3path)\nprint(len(remote_files))\n\n17564\n\n\nRead DMR++ metadata to get granule dimensions\n\nmatches = []\npbar = tqdm(remote_files, desc=\"Found 0 matches\")\nfor file in pbar:\n with s3.open(file, 'r') as f:\n xml_str: str = f.read()\n xml = ET.fromstring(xml_str)\n if xml[0].attrib['size'] == \"9866\" and xml[1].attrib['size'] == \"71\":\n matches.append(file)\n pbar.set_description(f\"Found {len(matches)} matches\")\n\n\nflist = ['s3://' + f.removesuffix(\".dmrpp\") for f in tqdm(matches)]\nprint(flist[0])\n\n\n\n\ns3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_paths.txt','w')\nfor item in tqdm(flist):\n file.write(item + \"\\n\")\nfile.close()", "crumbs": [ - "Tutorials", - "Dataset Specific", - "ECCO", - "In-cloud Access" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/ECCO_cloud_direct_access_s3.html#getting-started", - "href": "external/ECCO_cloud_direct_access_s3.html#getting-started", - "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", - "section": "Getting Started", - "text": "Getting Started\nIn this notebook, we will access monthly sea surface height from ECCO V4r4 (10.5067/ECG5D-SSH44). The data are provided as a time series of monthly netCDFs on a 0.5-degree latitude/longitude grid.\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF datasets into a single xarray dataset. This approach leverages S3 native protocols for efficient access to the data.\n\n\nRequirements\n\nAWS\nThis notebook should be running in an EC2 instance in AWS region us-west-2, as previously mentioned. We recommend using an EC2 with at least 8GB of memory available.\nThe notebook was developed and tested using a t2.large instance (2 cpus; 8GB memory).\n\n\nPython 3\nMost of these imports are from the Python standard library. However, you will need to install these packages into your Python 3 environment if you have not already done so:\n\ns3fs\nrequests\npandas\nxarray\nmatplotlib\ncartopy\n\n\nimport s3fs\nimport requests\nimport numpy as np\nimport xarray as xr\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nimport cartopy\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeat\nfrom json import dumps\nfrom io import StringIO\nfrom os.path import dirname, join\nfrom IPython.display import HTML\n\nplt.rcParams.update({'font.size': 14})\n\nMake a folder to write some outputs, if needed:\n\n!mkdir -p outputs/\n\n\n\n\nInputs\nConfigure one input: the ShortName of the desired dataset from ECCO V4r4. In this case it’s the following string that unique identifies the collection of monthly, 0.5-degree sea surface height data.\n\nShortName = \"ECCO_L4_SSH_05DEG_MONTHLY_V4R4\"\n\n\n\nEarthdata Login\nYou should have a .netrc file set up like:\nmachine urs.earthdata.nasa.gov login <username> password <password>\n\n\nDirect access from S3\nSet up an s3fs session for authneticated access to ECCO netCDF files in s3:\n\ndef begin_s3_direct_access(url: str=\"https://archive.podaac.earthdata.nasa.gov/s3credentials\"):\n response = requests.get(url).json()\n return s3fs.S3FileSystem(key=response['accessKeyId'],\n secret=response['secretAccessKey'],\n token=response['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\nfs = begin_s3_direct_access()\n\ntype(fs)\n\ns3fs.core.S3FileSystem", + "objectID": "external/SWOT_to_kerchunk.html#find-the-cycles-with-the-most-passes-size-9866-swath", + "href": "external/SWOT_to_kerchunk.html#find-the-cycles-with-the-most-passes-size-9866-swath", + "title": "Kerchunk JSON Generation", + "section": "Find the cycles with the most passes (size 9866 swath)", + "text": "Find the cycles with the most passes (size 9866 swath)\n\ncycles = {}\nz = glob.glob(\"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_kerchunk_CYCLE_3/*Expert_003_*\")\nlen(z)\n\n456\n\n\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_CYCLE_3.txt','w')\nfor item in tqdm(all_urls):\n file.write(\"%s\\n\" % item)", "crumbs": [ - "Tutorials", - "Dataset Specific", - "ECCO", - "In-cloud Access" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/ECCO_cloud_direct_access_s3.html#datasets", - "href": "external/ECCO_cloud_direct_access_s3.html#datasets", - "title": "Direct Access to ECCO V4r4 Datasets in the Cloud", - "section": "Datasets", - "text": "Datasets\n\nsea surface height (0.5-degree gridded, monthly)\nECCO_L4_SSH_05DEG_MONTHLY_V4R4\nGet a list of netCDF files located at the S3 path corresponding to the ECCO V4r4 monthly sea surface height dataset on the 0.5-degree latitude/longitude grid.\n\nssh_Files = fs.glob(join(\"podaac-ops-cumulus-protected/\", ShortName, \"*2015*.nc\"))\n\nlen(ssh_Files)\n\n12\n\n\nOpen with the netCDF files using the s3fs package, then load them all at once into a concatenated xarray dataset.\n\nssh_Dataset = xr.open_mfdataset(\n paths=[fs.open(f) for f in ssh_Files],\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 60, # These were chosen arbitrarily. You must specify \n 'longitude': 120, # chunking that is suitable to the data and target\n 'time': 100} # analysis.\n)\n\nssh = ssh_Dataset.SSH\n\nprint(ssh)\n\n<xarray.DataArray 'SSH' (time: 12, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(12, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2015-12-16T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: [-1.88057721]\n valid_max: [1.42077196]\n\n\n\n\nPlot the gridded sea surface height time series\nBut only the timesteps beginning in 2015:\n\nssh_after_201x = ssh[ssh['time.year']>=2015,:,:]\n\nprint(ssh_after_201x)\n\n<xarray.DataArray 'SSH' (time: 12, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(12, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2015-12-16T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: [-1.88057721]\n valid_max: [1.42077196]\n\n\nPlot the grid for the first time step using a Robinson projection. Define a helper function for consistency throughout the notebook:\n\ndef make_figure(proj):\n fig = plt.figure(figsize=(16,6))\n ax = fig.add_subplot(1, 1, 1, projection=proj)\n ax.add_feature(cfeat.LAND)\n ax.add_feature(cfeat.OCEAN)\n ax.add_feature(cfeat.COASTLINE)\n ax.add_feature(cfeat.BORDERS, linestyle='dotted')\n return fig, ax\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\nssh_after_201x.isel(time=0).plot(ax=ax, transform=ccrs.PlateCarree(), cmap='Spectral_r')\n\n\n\n\n\n\n\n\nNow plot the whole time series (post-2010) in an animation and write it to an mp4 file called ecco_monthly_ssh_grid_2015_to_x.mp4:\n\ndef get_animation(var, cmap: str=\"Spectral_r\"):\n \"\"\"Get time series animation for input xarray dataset\"\"\"\n\n def draw_map(i: int, add_colorbar: bool):\n data = var[i]\n m = data.plot(ax=ax, \n transform=ccrs.PlateCarree(),\n add_colorbar=add_colorbar,\n vmin=var.valid_min, \n vmax=var.valid_max,\n cmap=cmap)\n plt.title(str(data.time.values)[:7])\n return m\n\n def init():\n return draw_map(0, add_colorbar=True)\n \n def animate(i):\n return draw_map(i, add_colorbar=False)\n\n return init, animate\n\nNow make the animation using the function:\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\ninit, animate = get_animation(ssh_after_201x)\n\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=ssh_after_201x.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\n# Now save the animation to an MP4 file:\nani.save('outputs/ecco_monthly_ssh_grid_2015_to_x.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)\n\nRender the animation in the ipynb:\n\n#HTML(ani.to_html5_video())\n\n\n\ntflux (0.5-degree gridded, daily)\nNow we will do something similar to access daily, gridded (0.5-degree) ocean and sea-ice surface heat fluxes (10.5067/ECG5D-HEA44). Read more about the dataset and the rest of the ECCO V4r4 product suite on the PO.DAAC Web Portal.\nUse a “glob” pattern when listing the S3 bucket contents such that only netCDFs from January 2015 are represented in the resulting list of paths.\n\ntflux_Files = fs.glob(join(\"podaac-ops-cumulus-protected/\", \"ECCO_L4_HEAT_FLUX_05DEG_DAILY_V4R4\", \"*2015-01*.nc\"))\n\nlen(tflux_Files)\n\n31\n\n\nNow open them all as one xarray dataset just like before. Open and pass the 365 netCDF files to the xarray.open_mfdataset constructor so that we can operate on them as a single aggregated dataset.\n\ntflux_Dataset = xr.open_mfdataset(\n paths=[fs.open(f) for f in tflux_Files],\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 60, # These were chosen arbitrarily. You must specify \n 'longitude': 120, # chunking that is suitable to the data and target\n 'time': 100} # analysis.\n)\n\ntflux = tflux_Dataset.TFLUX\n\nprint(tflux)\n\n<xarray.DataArray 'TFLUX' (time: 31, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(31, 360, 720), dtype=float32, chunksize=(1, 60, 120), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-01T12:00:00 ... 2015-01-31T12:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n direction: >0 increases potential temperature (THETA)\n long_name: Rate of change of ocean heat content per m2 accou...\n units: W m-2\n comment: The rate of change of ocean heat content due to h...\n valid_min: [-1713.51220703]\n valid_max: [870.31304932]\n\n\nSelect a region over the Gulf of Mexico and spatially subset it from the larger dataset by slicing on the latitude and longitude axes.\n\ntflux_gom = tflux.sel(latitude=slice(15, 40), \n longitude=slice(-105, -70))\n\nprint(tflux_gom.shape)\n\n(31, 50, 70)\n\n\n\ntflux_gom.isel(time=0).plot()\n\n\n\n\n\n\n\n\nPlot the Jan 2015 surface heat flux as a gridded time series animation over the GOM study region.\n\nfig, ax = make_figure(proj=ccrs.Mercator())\n\nax.coastlines()\nax.set_extent([tflux_gom.longitude.min(), \n tflux_gom.longitude.max(), \n tflux_gom.latitude.min(), \n tflux_gom.latitude.max()])\n\ninit, animate = get_animation(tflux_gom, cmap=\"RdBu\")\n\n# Plot a time series animation write it to an mp4 file:\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=tflux_gom.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\nani.save('outputs/ecco_daily_tflux_gom_2015.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)", + "objectID": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules", + "href": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules", + "title": "Kerchunk JSON Generation", + "section": "Generate list of matching size granules", + "text": "Generate list of matching size granules\n\ns3 = s3fs.S3FileSystem(anon=False)\ns3path = 's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/*.nc'\nremote_files = s3.glob(s3path)\nprint(len(remote_files))\n\n17564", "crumbs": [ - "Tutorials", - "Dataset Specific", - "ECCO", - "In-cloud Access" + "Advanced Cloud", + "Kerchunk" ] }, { - "objectID": "external/Downloader.html#step-2-run-the-script", - "href": "external/Downloader.html#step-2-run-the-script", - "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", - "section": "Step 2: Run the Script", - "text": "Step 2: Run the Script\nUsage:\nusage: PO.DAAC bulk-data downloader [-h] -c COLLECTION -d OUTPUTDIRECTORY [--cycle SEARCH_CYCLES] [-sd STARTDATE] [-ed ENDDATE] [-f] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-e EXTENSIONS] [-gr GRANULENAME] [--process PROCESS_CMD] [--version] [--verbose]\n [-p PROVIDER] [--limit LIMIT] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n--cycle SEARCH_CYCLES\n Cycle number for determining downloads. can be repeated for multiple cycles \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --cycle must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the downloader.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nUnlike the ‘subscriber’, no ‘state’ is maintained for the downloader. if you re-run the downloader you’ll re-download all of the files again, unlike the subscriber which will download newly ingested data since the last run." + "objectID": "external/SWOT_to_kerchunk.html#connect-to-s3-netcdfs", + "href": "external/SWOT_to_kerchunk.html#connect-to-s3-netcdfs", + "title": "Kerchunk JSON Generation", + "section": "Connect to s3 netCDF’s", + "text": "Connect to s3 netCDF’s\n\n17564 granules takes around 5 mins\n\n\n%%time\nfileset = [s3.open(file) for file in remote_files]", + "crumbs": [ + "Advanced Cloud", + "Kerchunk" + ] }, { - "objectID": "external/Downloader.html#note-netrc-file", - "href": "external/Downloader.html#note-netrc-file", - "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", - "section": "Note: netrc file", - "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" + "objectID": "external/SWOT_to_kerchunk.html#find-matching-size-granules-dask", + "href": "external/SWOT_to_kerchunk.html#find-matching-size-granules-dask", + "title": "Kerchunk JSON Generation", + "section": "Find matching size granules (dask)", + "text": "Find matching size granules (dask)\n\n# Define a function to check the condition and return remote_files if condition is met\ndef is_match(f):\n ds = xr.open_dataset(f, engine=\"h5netcdf\")\n if ds['simulated_true_ssh_karin'].encoding['chunksizes'] == (9866, 71):\n return f.path\n return None\n\n# Create a Dask bag from the fileset\nfileset_bag = dask.bag.from_sequence(fileset)\n\n# Use Dask to parallelize the processing and filter matches\nwith dask.diagnostics.ProgressBar():\n matches_bag = fileset_bag.map(is_match).filter(lambda x: x is not None)\n matches = matches_bag.compute()\n\nprint(f\"{len(matches)} matches found\")", + "crumbs": [ + "Advanced Cloud", + "Kerchunk" + ] }, { - "objectID": "external/Downloader.html#advanced-usage", - "href": "external/Downloader.html#advanced-usage", - "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", - "section": "Advanced Usage", - "text": "Advanced Usage\n\nDownload data by filename\nIf you’re aware of a file you want to download, you can use the -gr option to download by a filename. The -c (COLLECTION) and -d (directory) options are still required.\nThe -gr option works by taking the file name, removing the suffix and searching for a CMR entry called the granuleUR. Some examples of this include:\n\n\n\n\n\n\n\n\nCollection\nFilename\nCMR GranuleUR\n\n\n\n\nMUR25-JPL-L4-GLOB-v04.2\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2\n\n\nJASON_CS_S6A_L2_ALT_HR_STD_OST_NRT_F\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07.nc\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07\n\n\n\nBecause of this behavior, granules without data suffixes and granules where the the UR does not directly follow this convention may not work as anticipated. We will be adding the ability to download by granuleUR in a future enhancement.\nThe -gr option supports wildcard search patterns (using ? for single- and * for multi-character expansion) to select and download multiple granules based on the filename pattern. This feature is supported through wildcard search functionality provided through CMR, which is described in the CMR Search API documentation.\n\n\nDownload data by cycle\nSome PO.DAAC datasets are better suited for cycles based search instead of start and end times. To enabled this, we’ve added ‘cycle’ based downloading to the data-downloader. The following example will download data from cycle 42:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42\nThe cycle parameter can be repeated to specify multiple cycles:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42 --cycle 43 --cycle 44\n\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z -ed 2014-07-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nDownloader behavior when a file already exists\nBy default, when the downloader is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the downloader will skip downloading that file.\nThis can drastically reduce the time for the downloader to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the downloader to always download matching files, by using –force/-f.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -f\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-downloader -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\" -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov" + "objectID": "external/SWOT_to_kerchunk.html#find-matching-size-granules", + "href": "external/SWOT_to_kerchunk.html#find-matching-size-granules", + "title": "Kerchunk JSON Generation", + "section": "Find matching size granules", + "text": "Find matching size granules\n\nmatches = []\npbar = tqdm(fileset, desc=\"Found 0 matches\")\nfor i, f in enumerate(pbar):\n ds = xr.open_dataset(f, engine=\"h5netcdf\")\n if ds['ancillary_surface_classification_flag'].encoding['chunksizes'] == (9866, 71):\n matches.append(remote_files[i])\n pbar.set_description(f\"Found {len(matches)} matches\")\nprint(matches[0])\n\n\n\n\npodaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\n\nflist = ['s3://' + f for f in tqdm(matches)]\nprint(flist[0])\n\n\n\n\ns3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\nWrite file\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_paths.txt','w')\nfor item in tqdm(flist):\n file.write(item + \"\\n\")\nfile.close()\n\nRead file\n\nf = open(\"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_same_passes_paths.txt\", \"r\")\nremote_urls = f.read().splitlines()\n# remote_urls = remote_urls.split(\"\\n\")\n# remote_urls.pop() # remove extra '' for EOF\nf.close()\nprint(len(remote_urls))\nremote_urls[0]\n\n13680\n\n\n's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_140_20140417T111107_20140417T120233_DG10_01.nc'", + "crumbs": [ + "Advanced Cloud", + "Kerchunk" + ] }, { - "objectID": "external/Direct_S3_Access_NetCDF.html", - "href": "external/Direct_S3_Access_NetCDF.html", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "", - "text": "imported on: 2023-03-02\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository." + "objectID": "external/SWOT_to_kerchunk.html#s3-netcdfs-to-kerchunk-loop", + "href": "external/SWOT_to_kerchunk.html#s3-netcdfs-to-kerchunk-loop", + "title": "Kerchunk JSON Generation", + "section": "s3 NetCDF’s to Kerchunk (loop)", + "text": "s3 NetCDF’s to Kerchunk (loop)\n\n%%time\nsingles = []\nfor i, u in enumerate(tqdm(remote_urls[:20])):\n with fsspec.open(u, mode=\"rb\", anon=False, key=creds['accessKeyId'], secret=creds['secretAccessKey'], token=creds[\"sessionToken\"]) as inf:\n single = SingleHdf5ToZarr(inf, u, inline_threshold=0)\n filename = re.sub(r'.*/', '', u)\n singles.append(single.translate())\n\n ## kerchunk auto_dask definition - Note: this is built in to kerchunk as of v0.1.0 using from kerchunk.combine import auto_dask\n\n# Author: Martin Durant\n# https://fsspec.github.io/kerchunk/_modules/kerchunk/combine.html#auto_dask\nfrom typing import List\ndef auto_dask(\n urls: List[str],\n single_driver: str,\n single_kwargs: dict,\n mzz_kwargs: dict,\n n_batches: int,\n remote_protocol=None,\n remote_options=None,\n filename=None,\n output_options=None,\n):\n \"\"\"Batched tree combine using dask.\n\n If you wish to run on a distributed cluster (recommended), create\n a client before calling this function.\n\n Parameters\n ----------\n urls: list[str]\n input dataset URLs\n single_driver: class\n class with ``translate()`` method\n single_kwargs: to pass to single-input driver\n mzz_kwargs: passed to ``MultiZarrToZarr`` for each batch\n n_batches: int\n Number of MZZ instances in the first combine stage. Maybe set equal\n to the number of dask workers, or a multple thereof.\n remote_protocol: str | None\n remote_options: dict\n To fsspec for opening the remote files\n filename: str | None\n Ouput filename, if writing\n output_options\n If ``filename`` is not None, open it with these options\n\n Returns\n -------\n reference set\n \"\"\"\n import dask\n\n # make delayed functions\n single_task = dask.delayed(lambda x: single_driver(x, **single_kwargs).translate())\n post = mzz_kwargs.pop(\"postprocess\", None)\n inline = mzz_kwargs.pop(\"inline_threshold\", None)\n # TODO: if single files produce list of reference sets (e.g., grib2)\n batch_task = dask.delayed(\n lambda u, x: MultiZarrToZarr(\n u,\n indicts=x,\n remote_protocol=remote_protocol,\n remote_options=remote_options,\n **mzz_kwargs,\n ).translate()\n )\n\n # sort out kwargs\n dims = mzz_kwargs.get(\"concat_dims\", [])\n dims += [k for k in mzz_kwargs.get(\"coo_map\", []) if k not in dims]\n kwargs = {\"concat_dims\": dims}\n if post:\n kwargs[\"postprocess\"] = post\n if inline:\n kwargs[\"inline_threshold\"] = inline\n for field in [\"remote_protocol\", \"remote_options\", \"coo_dtypes\", \"identical_dims\"]:\n if field in mzz_kwargs:\n kwargs[field] = mzz_kwargs[field]\n final_task = dask.delayed(\n lambda x: MultiZarrToZarr(\n x, remote_options=remote_options, remote_protocol=remote_protocol, **kwargs\n ).translate(filename, output_options)\n )\n\n # make delayed calls\n tasks = [single_task(u) for u in urls]\n tasks_per_batch = -(-len(tasks) // n_batches)\n tasks2 = []\n for batch in range(n_batches):\n in_tasks = tasks[batch * tasks_per_batch : (batch + 1) * tasks_per_batch]\n u = urls[batch * tasks_per_batch : (batch + 1) * tasks_per_batch]\n # if in_tasks:\n # skip if on last iteration and no remaining tasks\n # tasks2.append(batch_task(u, in_tasks))\n return dask.compute(final_task(tasks2))[0]\n\n\n\nclass JustLoad:\n \"\"\"For auto_dask, in the case that single file references already exist\"\"\"\n\n def __init__(self, url, storage_options=None):\n self.url = url\n self.storage_options = storage_options or {}\n\n def translate(self):\n with fsspec.open(self.url, mode=\"rt\", **self.storage_options) as f:\n return ujson.load(f)", + "crumbs": [ + "Advanced Cloud", + "Kerchunk" + ] }, { - "objectID": "external/Direct_S3_Access_NetCDF.html#summary", - "href": "external/Direct_S3_Access_NetCDF.html#summary", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Summary", - "text": "Summary\nIn this notebook, we will access monthly sea surface height from ECCO V4r4 (10.5067/ECG5D-SSH44). The data are provided as a time series of monthly netCDFs on a 0.5-degree latitude/longitude grid.\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and load a time series made of multiple netCDF datasets into an xarray dataset. This approach leverages S3 native protocols for efficient access to the data." + "objectID": "external/July_2022_Earthdata_Webinar.html", + "href": "external/July_2022_Earthdata_Webinar.html", + "title": "Earthdata Webinar", + "section": "", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club", + "crumbs": [ + "Webinars", + "July 2022 Earthdata Webinar Notebook" + ] }, { - "objectID": "external/Direct_S3_Access_NetCDF.html#requirements", - "href": "external/Direct_S3_Access_NetCDF.html#requirements", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Requirements", - "text": "Requirements\n\n1. AWS instance running in us-west-2\nNASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. netrc File\nYou will need a netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." + "objectID": "external/July_2022_Earthdata_Webinar.html#abstract", + "href": "external/July_2022_Earthdata_Webinar.html#abstract", + "title": "Earthdata Webinar", + "section": "Abstract", + "text": "Abstract\n\nNearly a petabyte of NASA’s Physical Oceanography Distributed Active Archive Center (PO.DAAC) data products have been moved to NASA’s Earthdata Cloud—hosted in the Amazon Web Services (AWS) cloud. To maximize the full potential of cloud computing on the big Data, one needs to be familiar with not only the data products and their access methods, but also a new set of knowledge for working in a cloud environment. This can be a daunting task for the majority of the science community, who may be familiar with high-performance computing, but not with AWS services. To aid end users in learning and to be successful during this paradigm shift, the PO.DAAC team has been exploring pathways toward practical solutions to help research groups migrate their workflow into cloud.\nDuring this webinar we will explain basic concepts of working in the cloud and use a simple science use case to demonstrate the workflow. Participants do not need prior knowledge of AWS services and the Earthdata Cloud. This is a step-by-step walkthrough of exploring and discovering PO.DAAC data and applying AWS cloud computing to analyze global sea level rise from altimetry data and Estimating the Circulation and Climate of the Ocean (ECCO) products.\nWe hope that you can start to practice cloud computing using AWS and PODAAC/Earthdata cloud products by following the 6 steps in this tutorial without investing a large amount of time.", + "crumbs": [ + "Webinars", + "July 2022 Earthdata Webinar Notebook" + ] }, { - "objectID": "external/Direct_S3_Access_NetCDF.html#learning-objectives", - "href": "external/Direct_S3_Access_NetCDF.html#learning-objectives", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nhow to retrieve temporary S3 credentials for in-region direct S3 bucket access\nhow to define a dataset of interest and find netCDF files in S3 bucket\nhow to perform in-region direct access of ECCO_L4_SSH_05DEG_MONTHLY_V4R4 data in S3\nhow to plot the data" - }, - { - "objectID": "external/Direct_S3_Access_NetCDF.html#import-packages", - "href": "external/Direct_S3_Access_NetCDF.html#import-packages", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Import Packages", - "text": "Import Packages\n\nimport os\nimport requests\nimport s3fs\nimport xarray as xr\nimport hvplot.xarray" - }, - { - "objectID": "external/Direct_S3_Access_NetCDF.html#get-temporary-aws-credentials", - "href": "external/Direct_S3_Access_NetCDF.html#get-temporary-aws-credentials", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Get Temporary AWS Credentials", - "text": "Get Temporary AWS Credentials\nDirect S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. For now, each NASA DAAC has different AWS credentials endpoints. Below are some of the credential endpoints to various DAACs:\n\ns3_cred_endpoint = {\n 'podaac':'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'gesdisc': 'https://data.gesdisc.earthdata.nasa.gov/s3credentials',\n 'lpdaac':'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials',\n 'ornldaac': 'https://data.ornldaac.earthdata.nasa.gov/s3credentials',\n 'ghrcdaac': 'https://data.ghrc.earthdata.nasa.gov/s3credentials'\n}\n\nCreate a function to make a request to an endpoint for temporary credentials. Remember, each DAAC has their own endpoint and credentials are not usable for cloud data from other DAACs.\n\ndef get_temp_creds(provider):\n return requests.get(s3_cred_endpoint[provider]).json()\n\n\ntemp_creds_req = get_temp_creds('podaac')\n#temp_creds_req" - }, - { - "objectID": "external/Direct_S3_Access_NetCDF.html#set-up-an-s3fs-session-for-direct-access", - "href": "external/Direct_S3_Access_NetCDF.html#set-up-an-s3fs-session-for-direct-access", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Set up an s3fs session for Direct Access", - "text": "Set up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint.\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\nIn this example we’re interested in the ECCO data collection from NASA’s PO.DAAC in Earthdata Cloud. In this case it’s the following string that unique identifies the collection of monthly, 0.5-degree sea surface height data (ECCO_L4_SSH_05DEG_MONTHLY_V4R4).\n\nshort_name = 'ECCO_L4_SSH_05DEG_MONTHLY_V4R4'\n\n\nbucket = os.path.join('podaac-ops-cumulus-protected/', short_name, '*2015*.nc')\nbucket\n\nGet a list of netCDF files located at the S3 path corresponding to the ECCO V4r4 monthly sea surface height dataset on the 0.5-degree latitude/longitude grid, for year 2015.\n\nssh_files = fs_s3.glob(bucket)\nssh_files" - }, - { - "objectID": "external/Direct_S3_Access_NetCDF.html#direct-in-region-access", - "href": "external/Direct_S3_Access_NetCDF.html#direct-in-region-access", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Direct In-region Access", - "text": "Direct In-region Access\nOpen with the netCDF files using the s3fs package, then load them all at once into a concatenated xarray dataset.\n\nfileset = [fs_s3.open(file) for file in ssh_files]\n\nCreate an xarray dataset using the open_mfdataset() function to “read in” all of the netCDF4 files in one call.\n\nssh_ds = xr.open_mfdataset(fileset,\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks='auto')\nssh_ds\n\nGet the SSH variable as an xarray dataarray\n\nssh_da = ssh_ds.SSH\nssh_da\n\nPlot the SSH time series using hvplot\n\nssh_da.hvplot.image(y='latitude', x='longitude', cmap='Viridis',).opts(clim=(ssh_da.attrs['valid_min'][0],ssh_da.attrs['valid_max'][0]))" - }, - { - "objectID": "external/Direct_S3_Access_NetCDF.html#resources", - "href": "external/Direct_S3_Access_NetCDF.html#resources", - "title": "How to Access Data Directly in Cloud (netCDF)", - "section": "Resources", - "text": "Resources\nDirect access to ECCO data in S3 (from us-west-2)\nData_Access__Direct_S3_Access__PODAAC_ECCO_SSH using CMR-STAC API to retrieve S3 links" - }, - { - "objectID": "external/NASA_Earthdata_Authentication.html#earthdata-login", - "href": "external/NASA_Earthdata_Authentication.html#earthdata-login", - "title": "How to Authenticate for NASA Earthdata Programmatically", - "section": "Earthdata Login", - "text": "Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\nWe recommend programmatic authentication with a few lines of code using the earthaccess python package.\n\nimport earthaccess\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\nThe line above has you login to Earthdata and persists the credentials in a netrc file in your home directory behind the scenes. If you know you already have a netrc file, you can also authenticate with the following, without typing in your login credentials each time:\n\nauth = earthaccess.login(strategy=\"netrc\")\n\n\n\nAuthentication is also possible without the earthaccess package; please review this 2021 Cloud Hackathon Authentication tutorial for more details.", - "crumbs": [ - "How To", - "Authenticate" - ] - }, - { - "objectID": "external/access-local-python.html#downloading-data", - "href": "external/access-local-python.html#downloading-data", - "title": "How do I access Cloud Data from my Local Machine in Python?", - "section": "Downloading data", - "text": "Downloading data\nWhen you have found the data you want to use, you have two options. You can download the data to work locally, or access the data directly to work in the cloud. This second way of working is called “Direct Cloud Access” or simply, “Direct Access”.\nThis page covers downloading data from Earthdata Cloud to your local machine using the earthaccess library.", - "crumbs": [ - "How To", - "Access Data", - "Locally" - ] - }, - { - "objectID": "external/access-local-python.html#earthaccess", - "href": "external/access-local-python.html#earthaccess", - "title": "How do I access Cloud Data from my Local Machine in Python?", - "section": "earthaccess", - "text": "earthaccess\nWe can use the earthaccess python library to grab the file URLs and then access them with the xarray library.\n\n#Import packages\nimport earthaccess\nimport xarray as xr\n\n\n#Authentication with Earthdata Login\nauth = earthaccess.login(strategy=\"netrc\")\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 10/30/2023\nUsing .netrc file for EDL\n\n\n\n#Access land ice height from ATLAS/ICESat-2 V005 (10.5067/ATLAS/ATL06.005), searching for data over western Greenland coast over two weeks in July 2022. The data are provided as HDF5 granules (files) that span about 1/14th of an orbit.\n\nresults = earthaccess.search_data(short_name=\"ATL06\",\n version=\"005\",\n cloud_hosted=True,\n temporal = (\"2022-07-17\",\"2022-07-31\"),\n bounding_box = (-51.96423,68.10554,-48.71969,70.70529))\n\nGranules found: 5\n\n\n\nfiles = earthaccess.download(results, \"./local_folder\")\n\ndownloaded_files = []\nfor f in files: \n file = \"local_folder/\"+ f\n downloaded_files.append(file)\n\n Getting 5 granules, approx download size: 0.0 GB\n\n\n\n\n\nFile ATL06_20220718010029_03991603_005_01.h5 already downloaded\nFile ATL06_20220718134522_04071605_005_01.h5 already downloaded\nFile ATL06_20220722005209_04601603_005_01.h5 already downloaded\nFile ATL06_20220726004352_05211603_005_01.h5 already downloaded\nFile ATL06_20220722133704_04681605_005_01.h5 already downloaded\n\n\n\n\n\n\n\n\n['local_folder/ATL06_20220718010029_03991603_005_01.h5',\n 'local_folder/ATL06_20220718134522_04071605_005_01.h5',\n 'local_folder/ATL06_20220722005209_04601603_005_01.h5',\n 'local_folder/ATL06_20220722133704_04681605_005_01.h5',\n 'local_folder/ATL06_20220726004352_05211603_005_01.h5']\n\n\n\n#Use xarray to load the data as a multifile dataset for a single group in the HDF5 file, in this case land ice segments:\nds = xr.open_mfdataset(downloaded_files, group='/gt1l/land_ice_segments', engine='h5netcdf')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (delta_time: 241711)\nCoordinates:\n * delta_time (delta_time) datetime64[ns] 2022-07-18T01:00:46.67...\n latitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n longitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\nData variables:\n atl06_quality_summary (delta_time) int8 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li_sigma (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n segment_id (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n sigma_geo_h (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\nAttributes:\n Description: The land_ice_height group contains the primary set of deriv...\n data_rate: Data within this group are sparse. Data values are provide...xarray.DatasetDimensions:delta_time: 241711Coordinates: (3)delta_time(delta_time)datetime64[ns]2022-07-18T01:00:46.678760592 .....contentType :referenceInformationdescription :Number of GPS seconds since the ATLAS SDP epoch. The ATLAS Standard Data Products (SDP) epoch offset is defined within /ancillary_data/atlas_sdp_gps_epoch as the number of GPS seconds between the GPS epoch (1980-01-06T00:00:00.000000Z UTC) and the ATLAS SDP epoch. By adding the offset contained within atlas_sdp_gps_epoch to delta time parameters, the time in gps_seconds relative to the GPS epoch can be computed.long_name :Elapsed GPS secondssource :section 4.4standard_name :timearray(['2022-07-18T01:00:46.678760592', '2022-07-18T01:00:46.681322640',\n '2022-07-18T01:00:46.684008720', ..., '2022-07-26T00:49:18.826637808',\n '2022-07-26T00:49:18.829449568', '2022-07-26T00:49:18.832263232'],\n dtype='datetime64[ns]')latitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Latitude of segment center, WGS84, North=+,long_name :Latitudesource :section 3.10standard_name :latitudeunits :degrees_northvalid_max :90.0valid_min :-90.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nlongitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Longitude of segment center, , WGS84, East=+long_name :Longitudesource :section 3.10standard_name :longitudeunits :degrees_eastvalid_max :180.0valid_min :-180.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nData variables: (5)atl06_quality_summary(delta_time)int8dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :The ATL06_quality_summary parameter indicates the best-quality subset of all ATL06 data. A zero in this parameter implies that no data-quality tests have found a problem with the segment, a one implies that some potential problem has been found. Users who select only segments with zero values for this flag can be relatively certain of obtaining high-quality data, but will likely miss a significant fraction of usable data, particularly in cloudy, rough, or low-surface-reflectance conditions.flag_meanings :best_quality potential_problemflag_values :[0 1]long_name :ATL06_Quality_Summarysource :section 4.3units :1valid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n236.05 kiB\n76.49 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Standard land-ice segment height determined by land ice algorithm, corrected for first-photon bias, representing the median- based height of the selected PEslong_name :Land Ice heightsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li_sigma(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Propagated error due to sampling error and FPB correction from the land ice algorithmlong_name :Expected RMS segment misfitsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsegment_id(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :referenceInformationdescription :Segment number, counting from the equator. Equal to the segment_id for the second of the two 20m ATL03 segments included in the 40m ATL06 segmentlong_name :Reference Point, msource :section 3.1.2.1units :1\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsigma_geo_h(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Total vertical geolocation error due to PPD and POD, including the effects of horizontal geolocation error on the segment vertical error.long_name :Vertical Geolocation Errorsource :ATBD Section 3.10units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nIndexes: (1)delta_timePandasIndexPandasIndex(DatetimeIndex(['2022-07-18 01:00:46.678760592',\n '2022-07-18 01:00:46.681322640',\n '2022-07-18 01:00:46.684008720',\n '2022-07-18 01:00:46.686753504',\n '2022-07-18 01:00:46.689526560',\n '2022-07-18 01:00:46.692315280',\n '2022-07-18 01:00:46.695049040',\n '2022-07-18 01:00:46.700724096',\n '2022-07-18 01:00:46.703545872',\n '2022-07-18 01:00:46.706366832',\n ...\n '2022-07-26 00:49:18.806914512',\n '2022-07-26 00:49:18.809737328',\n '2022-07-26 00:49:18.812559600',\n '2022-07-26 00:49:18.815380608',\n '2022-07-26 00:49:18.818200224',\n '2022-07-26 00:49:18.821015744',\n '2022-07-26 00:49:18.823827088',\n '2022-07-26 00:49:18.826637808',\n '2022-07-26 00:49:18.829449568',\n '2022-07-26 00:49:18.832263232'],\n dtype='datetime64[ns]', name='delta_time', length=241711, freq=None))Attributes: (2)Description :The land_ice_height group contains the primary set of derived ATL06 products. This includes geolocation, height, and standard error and quality measures for each segment. This group is sparse, meaning that parameters are provided only for pairs of segments for which at least one beam has a valid surface-height measurement.data_rate :Data within this group are sparse. Data values are provided only for those ICESat-2 20m segments where at least one beam has a valid land ice height measurement.", - "crumbs": [ - "How To", - "Access Data", - "Locally" - ] - }, - { - "objectID": "external/July_2022_Earthdata_Webinar.html", - "href": "external/July_2022_Earthdata_Webinar.html", - "title": "Earthdata Webinar", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club", - "crumbs": [ - "Webinars", - "July 2022 Earthdata Webinar Notebook" - ] - }, - { - "objectID": "external/July_2022_Earthdata_Webinar.html#abstract", - "href": "external/July_2022_Earthdata_Webinar.html#abstract", - "title": "Earthdata Webinar", - "section": "Abstract", - "text": "Abstract\n\nNearly a petabyte of NASA’s Physical Oceanography Distributed Active Archive Center (PO.DAAC) data products have been moved to NASA’s Earthdata Cloud—hosted in the Amazon Web Services (AWS) cloud. To maximize the full potential of cloud computing on the big Data, one needs to be familiar with not only the data products and their access methods, but also a new set of knowledge for working in a cloud environment. This can be a daunting task for the majority of the science community, who may be familiar with high-performance computing, but not with AWS services. To aid end users in learning and to be successful during this paradigm shift, the PO.DAAC team has been exploring pathways toward practical solutions to help research groups migrate their workflow into cloud.\nDuring this webinar we will explain basic concepts of working in the cloud and use a simple science use case to demonstrate the workflow. Participants do not need prior knowledge of AWS services and the Earthdata Cloud. This is a step-by-step walkthrough of exploring and discovering PO.DAAC data and applying AWS cloud computing to analyze global sea level rise from altimetry data and Estimating the Circulation and Climate of the Ocean (ECCO) products.\nWe hope that you can start to practice cloud computing using AWS and PODAAC/Earthdata cloud products by following the 6 steps in this tutorial without investing a large amount of time.", - "crumbs": [ - "Webinars", - "July 2022 Earthdata Webinar Notebook" - ] - }, - { - "objectID": "external/July_2022_Earthdata_Webinar.html#motivation", - "href": "external/July_2022_Earthdata_Webinar.html#motivation", - "title": "Earthdata Webinar", - "section": "Motivation", - "text": "Motivation\n\nIt is expected the NASA Earthdata will grow to >250 PB in 2025,\nCloud computing has a big potential\nThe path to the cloud computing is unclear for majority of the science and application community\nThe science community are often perplexed at the start line by a new language related to cloud computing and the large amount of different AWS tools and services, such as CloudFront, EC2, VPC, AMI, IAM, Bucket, Glacier, Snowcone, Snowball, Snowmobile, data lakes, just to name a few.\nWe aim to share our experience of passing the start line and start to run cloud computing, demonstrate a use case assuming zero knowledge of AWS cloud\nThe global mean sea level used here is an important climate indicator and relatively easy to calculate from the PODAAC data in the cloud.", - "crumbs": [ - "Webinars", - "July 2022 Earthdata Webinar Notebook" - ] + "objectID": "external/July_2022_Earthdata_Webinar.html#motivation", + "href": "external/July_2022_Earthdata_Webinar.html#motivation", + "title": "Earthdata Webinar", + "section": "Motivation", + "text": "Motivation\n\nIt is expected the NASA Earthdata will grow to >250 PB in 2025,\nCloud computing has a big potential\nThe path to the cloud computing is unclear for majority of the science and application community\nThe science community are often perplexed at the start line by a new language related to cloud computing and the large amount of different AWS tools and services, such as CloudFront, EC2, VPC, AMI, IAM, Bucket, Glacier, Snowcone, Snowball, Snowmobile, data lakes, just to name a few.\nWe aim to share our experience of passing the start line and start to run cloud computing, demonstrate a use case assuming zero knowledge of AWS cloud\nThe global mean sea level used here is an important climate indicator and relatively easy to calculate from the PODAAC data in the cloud.", + "crumbs": [ + "Webinars", + "July 2022 Earthdata Webinar Notebook" + ] }, { "objectID": "external/July_2022_Earthdata_Webinar.html#objectives", @@ -3265,12 +3475,85 @@ "July 2022 Earthdata Webinar Notebook" ] }, + { + "objectID": "external/Downloader.html#step-2-run-the-script", + "href": "external/Downloader.html#step-2-run-the-script", + "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", + "section": "Step 2: Run the Script", + "text": "Step 2: Run the Script\nUsage:\nusage: PO.DAAC bulk-data downloader [-h] -c COLLECTION -d OUTPUTDIRECTORY [--cycle SEARCH_CYCLES] [-sd STARTDATE] [-ed ENDDATE] [-f] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-e EXTENSIONS] [-gr GRANULENAME] [--process PROCESS_CMD] [--version] [--verbose]\n [-p PROVIDER] [--limit LIMIT] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n--cycle SEARCH_CYCLES\n Cycle number for determining downloads. can be repeated for multiple cycles \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --cycle must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the downloader.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nUnlike the ‘subscriber’, no ‘state’ is maintained for the downloader. if you re-run the downloader you’ll re-download all of the files again, unlike the subscriber which will download newly ingested data since the last run." + }, + { + "objectID": "external/Downloader.html#note-netrc-file", + "href": "external/Downloader.html#note-netrc-file", + "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", + "section": "Note: netrc file", + "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" + }, + { + "objectID": "external/Downloader.html#advanced-usage", + "href": "external/Downloader.html#advanced-usage", + "title": "Data Downloader: Bulk or one-time Scripted Access to PODAAC data", + "section": "Advanced Usage", + "text": "Advanced Usage\n\nDownload data by filename\nIf you’re aware of a file you want to download, you can use the -gr option to download by a filename. The -c (COLLECTION) and -d (directory) options are still required.\nThe -gr option works by taking the file name, removing the suffix and searching for a CMR entry called the granuleUR. Some examples of this include:\n\n\n\n\n\n\n\n\nCollection\nFilename\nCMR GranuleUR\n\n\n\n\nMUR25-JPL-L4-GLOB-v04.2\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2\n\n\nJASON_CS_S6A_L2_ALT_HR_STD_OST_NRT_F\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07.nc\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07\n\n\n\nBecause of this behavior, granules without data suffixes and granules where the the UR does not directly follow this convention may not work as anticipated. We will be adding the ability to download by granuleUR in a future enhancement.\nThe -gr option supports wildcard search patterns (using ? for single- and * for multi-character expansion) to select and download multiple granules based on the filename pattern. This feature is supported through wildcard search functionality provided through CMR, which is described in the CMR Search API documentation.\n\n\nDownload data by cycle\nSome PO.DAAC datasets are better suited for cycles based search instead of start and end times. To enabled this, we’ve added ‘cycle’ based downloading to the data-downloader. The following example will download data from cycle 42:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42\nThe cycle parameter can be repeated to specify multiple cycles:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42 --cycle 43 --cycle 44\n\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z -ed 2014-07-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nDownloader behavior when a file already exists\nBy default, when the downloader is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the downloader will skip downloading that file.\nThis can drastically reduce the time for the downloader to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the downloader to always download matching files, by using –force/-f.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -f\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-downloader -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\" -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov" + }, + { + "objectID": "external/Subscriber.html#run-the-script", + "href": "external/Subscriber.html#run-the-script", + "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", + "section": "Run the Script", + "text": "Run the Script\nUsage:\nusage: PO.DAAC data subscriber [-h] -c COLLECTION -d OUTPUTDIRECTORY [-f] [-sd STARTDATE] [-ed ENDDATE] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-m MINUTES] [-e EXTENSIONS] [--process PROCESS_CMD] [--version] [--verbose] [-p PROVIDER] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n-m MINUTES, --minutes MINUTES\n How far back in time, in minutes, should the script look for data. If running this script as a cron, this value should be equal to or greater than how often your cron runs. \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --minutes must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the subscriber.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nEvery time the script runs successfully (that is, no errors), a .update__<collectionname> file is created in your download directory with the last run timestamp. This timestamp will be used the next time the script is run. It will look for data between the timestamp in that file and the current time to determine new files to download." + }, + { + "objectID": "external/Subscriber.html#note-cmr-times", + "href": "external/Subscriber.html#note-cmr-times", + "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", + "section": "Note: CMR times", + "text": "Note: CMR times\nThere are numerous ‘times’ available to query on in CMR. For the default subscriber, we look at the ‘created at’ field, which will look for when a granule file was ingested into the archive. This means as PO.DAAC gets data, your subscriber will also get data, regardless of the time range within the granule itself." + }, + { + "objectID": "external/Subscriber.html#note-netrc-file", + "href": "external/Subscriber.html#note-netrc-file", + "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", + "section": "Note: netrc file", + "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" + }, + { + "objectID": "external/Subscriber.html#advanced-usage", + "href": "external/Subscriber.html#advanced-usage", + "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", + "section": "Advanced Usage", + "text": "Advanced Usage\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nSubscriber behavior when a file already exists\nBy default, when the subscriber is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the subscriber will skip downloading that file.\nThis can drastically reduce the time for the subscriber to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the subscriber to always download matching files, by using –force/-f.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -f\n\n\nRunning as a Cron job\nTo automatically run and update a local file system with data files from a collection, one can use a syntax like the following:\n10 * * * * podaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d /path/to/data/VIIRS_N20-OSPO-L2P-v2.61 -e .nc -e .h5 -m 60 -b=\"-180,-90,180,90\" --verbose >> ~/.subscriber.log\n\nThis will run every hour at ten minutes passed, and output will be appended to a local file called ~/.subscriber.log\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\"\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov" + }, + { + "objectID": "external/access-local-python.html#downloading-data", + "href": "external/access-local-python.html#downloading-data", + "title": "How do I access Cloud Data from my Local Machine in Python?", + "section": "Downloading data", + "text": "Downloading data\nWhen you have found the data you want to use, you have two options. You can download the data to work locally, or access the data directly to work in the cloud. This second way of working is called “Direct Cloud Access” or simply, “Direct Access”.\nThis page covers downloading data from Earthdata Cloud to your local machine using the earthaccess library.", + "crumbs": [ + "How To", + "Access Data", + "Locally" + ] + }, + { + "objectID": "external/access-local-python.html#earthaccess", + "href": "external/access-local-python.html#earthaccess", + "title": "How do I access Cloud Data from my Local Machine in Python?", + "section": "earthaccess", + "text": "earthaccess\nWe can use the earthaccess python library to grab the file URLs and then access them with the xarray library.\n\n#Import packages\nimport earthaccess\nimport xarray as xr\n\n\n#Authentication with Earthdata Login\nauth = earthaccess.login(strategy=\"netrc\")\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 10/30/2023\nUsing .netrc file for EDL\n\n\n\n#Access land ice height from ATLAS/ICESat-2 V005 (10.5067/ATLAS/ATL06.005), searching for data over western Greenland coast over two weeks in July 2022. The data are provided as HDF5 granules (files) that span about 1/14th of an orbit.\n\nresults = earthaccess.search_data(short_name=\"ATL06\",\n version=\"005\",\n cloud_hosted=True,\n temporal = (\"2022-07-17\",\"2022-07-31\"),\n bounding_box = (-51.96423,68.10554,-48.71969,70.70529))\n\nGranules found: 5\n\n\n\nfiles = earthaccess.download(results, \"./local_folder\")\n\ndownloaded_files = []\nfor f in files: \n file = \"local_folder/\"+ f\n downloaded_files.append(file)\n\n Getting 5 granules, approx download size: 0.0 GB\n\n\n\n\n\nFile ATL06_20220718010029_03991603_005_01.h5 already downloaded\nFile ATL06_20220718134522_04071605_005_01.h5 already downloaded\nFile ATL06_20220722005209_04601603_005_01.h5 already downloaded\nFile ATL06_20220726004352_05211603_005_01.h5 already downloaded\nFile ATL06_20220722133704_04681605_005_01.h5 already downloaded\n\n\n\n\n\n\n\n\n['local_folder/ATL06_20220718010029_03991603_005_01.h5',\n 'local_folder/ATL06_20220718134522_04071605_005_01.h5',\n 'local_folder/ATL06_20220722005209_04601603_005_01.h5',\n 'local_folder/ATL06_20220722133704_04681605_005_01.h5',\n 'local_folder/ATL06_20220726004352_05211603_005_01.h5']\n\n\n\n#Use xarray to load the data as a multifile dataset for a single group in the HDF5 file, in this case land ice segments:\nds = xr.open_mfdataset(downloaded_files, group='/gt1l/land_ice_segments', engine='h5netcdf')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (delta_time: 241711)\nCoordinates:\n * delta_time (delta_time) datetime64[ns] 2022-07-18T01:00:46.67...\n latitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n longitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\nData variables:\n atl06_quality_summary (delta_time) int8 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li_sigma (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n segment_id (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n sigma_geo_h (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\nAttributes:\n Description: The land_ice_height group contains the primary set of deriv...\n data_rate: Data within this group are sparse. Data values are provide...xarray.DatasetDimensions:delta_time: 241711Coordinates: (3)delta_time(delta_time)datetime64[ns]2022-07-18T01:00:46.678760592 .....contentType :referenceInformationdescription :Number of GPS seconds since the ATLAS SDP epoch. The ATLAS Standard Data Products (SDP) epoch offset is defined within /ancillary_data/atlas_sdp_gps_epoch as the number of GPS seconds between the GPS epoch (1980-01-06T00:00:00.000000Z UTC) and the ATLAS SDP epoch. By adding the offset contained within atlas_sdp_gps_epoch to delta time parameters, the time in gps_seconds relative to the GPS epoch can be computed.long_name :Elapsed GPS secondssource :section 4.4standard_name :timearray(['2022-07-18T01:00:46.678760592', '2022-07-18T01:00:46.681322640',\n '2022-07-18T01:00:46.684008720', ..., '2022-07-26T00:49:18.826637808',\n '2022-07-26T00:49:18.829449568', '2022-07-26T00:49:18.832263232'],\n dtype='datetime64[ns]')latitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Latitude of segment center, WGS84, North=+,long_name :Latitudesource :section 3.10standard_name :latitudeunits :degrees_northvalid_max :90.0valid_min :-90.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nlongitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Longitude of segment center, , WGS84, East=+long_name :Longitudesource :section 3.10standard_name :longitudeunits :degrees_eastvalid_max :180.0valid_min :-180.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nData variables: (5)atl06_quality_summary(delta_time)int8dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :The ATL06_quality_summary parameter indicates the best-quality subset of all ATL06 data. A zero in this parameter implies that no data-quality tests have found a problem with the segment, a one implies that some potential problem has been found. Users who select only segments with zero values for this flag can be relatively certain of obtaining high-quality data, but will likely miss a significant fraction of usable data, particularly in cloudy, rough, or low-surface-reflectance conditions.flag_meanings :best_quality potential_problemflag_values :[0 1]long_name :ATL06_Quality_Summarysource :section 4.3units :1valid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n236.05 kiB\n76.49 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Standard land-ice segment height determined by land ice algorithm, corrected for first-photon bias, representing the median- based height of the selected PEslong_name :Land Ice heightsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li_sigma(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Propagated error due to sampling error and FPB correction from the land ice algorithmlong_name :Expected RMS segment misfitsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsegment_id(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :referenceInformationdescription :Segment number, counting from the equator. Equal to the segment_id for the second of the two 20m ATL03 segments included in the 40m ATL06 segmentlong_name :Reference Point, msource :section 3.1.2.1units :1\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsigma_geo_h(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Total vertical geolocation error due to PPD and POD, including the effects of horizontal geolocation error on the segment vertical error.long_name :Vertical Geolocation Errorsource :ATBD Section 3.10units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nIndexes: (1)delta_timePandasIndexPandasIndex(DatetimeIndex(['2022-07-18 01:00:46.678760592',\n '2022-07-18 01:00:46.681322640',\n '2022-07-18 01:00:46.684008720',\n '2022-07-18 01:00:46.686753504',\n '2022-07-18 01:00:46.689526560',\n '2022-07-18 01:00:46.692315280',\n '2022-07-18 01:00:46.695049040',\n '2022-07-18 01:00:46.700724096',\n '2022-07-18 01:00:46.703545872',\n '2022-07-18 01:00:46.706366832',\n ...\n '2022-07-26 00:49:18.806914512',\n '2022-07-26 00:49:18.809737328',\n '2022-07-26 00:49:18.812559600',\n '2022-07-26 00:49:18.815380608',\n '2022-07-26 00:49:18.818200224',\n '2022-07-26 00:49:18.821015744',\n '2022-07-26 00:49:18.823827088',\n '2022-07-26 00:49:18.826637808',\n '2022-07-26 00:49:18.829449568',\n '2022-07-26 00:49:18.832263232'],\n dtype='datetime64[ns]', name='delta_time', length=241711, freq=None))Attributes: (2)Description :The land_ice_height group contains the primary set of derived ATL06 products. This includes geolocation, height, and standard error and quality measures for each segment. This group is sparse, meaning that parameters are provided only for pairs of segments for which at least one beam has a valid surface-height measurement.data_rate :Data within this group are sparse. Data values are provided only for those ICESat-2 20m segments where at least one beam has a valid land ice height measurement.", + "crumbs": [ + "How To", + "Access Data", + "Locally" + ] + }, { "objectID": "external/DownloadDopplerScattData.html", "href": "external/DownloadDopplerScattData.html", "title": "S-MODE Workshop: Science Case Study Airborne Part 1", "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop", + "text": "imported on: 2024-07-24\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop", "crumbs": [ "Tutorials", "Dataset Specific", @@ -3331,1168 +3614,1088 @@ ] }, { - "objectID": "external/access-local-opendap.html#opendap", - "href": "external/access-local-opendap.html#opendap", - "title": "How do I access Cloud Data from my Local Machine with OPeNDAP?", - "section": "OPeNDAP", - "text": "OPeNDAP\nOPeNDAP, or the Open-source Project for a Network Data Access Protocol, is a data server that allows for accessing scientific datasets through the public internet. OPeNDAP links can be acquired through dataset landing pages or the common metadata repository. Once you have the desired link(s), you can open them as follows:\n#Import packages\nimport xarray as xr\n\nds_https = xr.open_dataset(https://opendap.earthdata.nasa.gov/collections/C2532426483-ORNL_CLOUD/granules/Daymet_Daily_V4R1.daymet_v4_daily_hi_tmax_2010.nc)\n\n# For datasets that contain dap4 specific datatypes, such as `int64`, replace `https` with `dap4` at the beginning to open with xarray. For example:\nurl = https://opendap.earthdata.nasa.gov/collections/C2036881966-POCLOUD/granules/AQUA_MODIS.20220109_20220116.L3m.8D.SST4.sst4.4km\ndap4_url = url.replace(\"https://\", \"dap4://\")\n# dap4_url output: dap4://opendap.earthdata.nasa.gov/collections/C2036881966-POCLOUD/granules/AQUA_MODIS.20220109_20220116.L3m.8D.SST4.sst4.4km\nds_dap4 = xr.open_dataset(dap4_url)\n\n# Note: Some datasets have their variables organized in groups, so within the open_dataset function, you may need to specify 'group=' to access the dataset.\nFor more information, see the OPeNDAP Data Access Client Tutorials.", - "crumbs": [ - "How To", - "Access Data", - "via OPeNDAP" - ] + "objectID": "mcc_api/metadata_compliance_checker_API.html", + "href": "mcc_api/metadata_compliance_checker_API.html", + "title": "MCC - API POST", + "section": "", + "text": "Template for making API calls to Metadata Compliance Checker (MCC) using a local netCDF or HDF file, and outputing the response to JSON" }, { - "objectID": "external/ECCO_download_data.html", - "href": "external/ECCO_download_data.html", - "title": "Access to ECCO V4r4 Datasets on a Local Machine", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, ECCO.\nDuped+slightly modified version of the s3 access ipynb. Tested on JPL-issued macbook and my linux box. It starts by setting up a most trusted strategy for batch downloads behind URS ussing curl/wget. Will attempt to add line(s) to your netrc file if needed btw; then it writes your urs cookies to a local file that should effectively “pre-authenticate” future download sessions for those sub domains.", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "ECCO", - "Local Download Access" - ] + "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc-endpoints", + "href": "mcc_api/metadata_compliance_checker_API.html#mcc-endpoints", + "title": "MCC - API POST", + "section": "MCC Endpoints", + "text": "MCC Endpoints\nPROD - https://mcc.podaac.earthdatacloud.nasa.gov/\nUAT - https://mcc.podaac.uat.earthdatacloud.nasa.gov/mcc\n\nimport json\nimport requests\nimport sys\n\n# Choose VENUE: UAT or PROD\nmcc_env = 'UAT'\nmcc_env = 'PROD'" }, { - "objectID": "external/ECCO_download_data.html#quick-start", - "href": "external/ECCO_download_data.html#quick-start", - "title": "Access to ECCO V4r4 Datasets on a Local Machine", - "section": "Quick Start", - "text": "Quick Start\nA key takeaway in this notebook… follow these instructions on the Earthdata Wiki to authenticate and store your URS cookies in a local file. You can batch download really efficiently this way, effectively “pre-authenticated” through your previous session.\nAvoid lines that begin with % or %% in code cells. Those are IPython “magic functions” that tell a line or cell to evaluate in some special mode like by bash instead of py3.\n\nConfigure your .netrc file\nGood idea to back up your existing netrc file, if you have one. And while youre at it check for these entries because they might exist in there already:\n\n%cp ~/.netrc ~/bak.netrc\n\n%cat ~/.netrc | grep '.earthdata.nasa.gov' | cut -f-5 -d\" \"\n\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine uat.urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\n\n\n\nAdd entries to your netrc for these two earthdata.nasa.gov sub domains, at a minimum:\nmachine urs.earthdata.nasa.gov login jmcnelis password ***\nmachine opendap.earthdata.nasa.gov login jmcnelis password ***\nand replace jmcnelis and *** with your Earthdata Login username and password, respectively…\n\nReplace jmcnelis and *** with your Earthdata username and password, and then run the cell to append these two lines to your netrc file, if one exists. Otherwise write them to a new one. (all set up by -a)\n\n%%file -a ~/.netrc\nmachine urs.earthdata.nasa.gov login jmcnelis password ***\nmachine opendap.earthdata.nasa.gov login jmcnelis password ***\n\nAppending to /Users/jmcnelis/.netrc\n\n\nDump the netrc again sans passwords to confirm that it worked:\n\n!cat ~/.netrc | grep '.earthdata.nasa.gov' | cut -f-5 -d\" \"\n\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine uat.urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\nmachine urs.earthdata.nasa.gov login jmcnelis password\nmachine opendap.earthdata.nasa.gov login jmcnelis password\n\n\nFinally, you need to make sure to limit access to the netrc file because it stores your plain text password. Simple on MacOS and Linux:\n\n!chmod 0600 ~/.netrc\n\nNo outputs expected.\n\n\nDownload a sample data file, get your URS cookies, and write them to a local file\nNow I’ll download a random file that’s protected by URS/Earthdata Login authentication so that I can grab my URS cookies.\nI chose to download a file containing ECCO grid geometries for the 0.5-degree latitude/longitude grid. It’s small and it may prove useful for downstream analysis of the SSH data. (Again, any protected data file will work.)\n\n%%bash\nwget --no-verbose \\\n --no-clobber \\\n --load-cookies ~/.urs_cookies \\\n --save-cookies ~/.urs_cookies \\\n --keep-session-cookies \\\n https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ECCO_L4_GEOMETRY_05DEG_V4R4/GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc\n\nI used –quiet mode so wget would not dump tons of garbage into the notebook. Confirm that the cookies file exists in your home directory:\n\n!ls ~/.urs_cookies\n\n/Users/jmcnelis/.urs_cookies\n\n\nAnd see if the file downloaded successfully to double-confirm it worked as expected (and be aware that the ncdump output is truncated to the first 50 lines):\n\n!ncdump -h GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc | head -25\n\nnetcdf GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg {\ndimensions:\n Z = 50 ;\n latitude = 360 ;\n longitude = 720 ;\n nv = 2 ;\nvariables:\n float Z(Z) ;\n Z:axis = \"Z\" ;\n Z:bounds = \"Z_bnds\" ;\n Z:comment = \"Non-uniform vertical spacing.\" ;\n Z:coverage_content_type = \"coordinate\" ;\n Z:long_name = \"depth of grid cell center\" ;\n Z:positive = \"up\" ;\n Z:standard_name = \"depth\" ;\n Z:units = \"m\" ;\n float latitude(latitude) ;\n latitude:axis = \"Y\" ;\n latitude:bounds = \"latitude_bnds\" ;\n latitude:comment = \"uniform grid spacing from -89.75 to 89.75 by 0.5\" ;\n latitude:coverage_content_type = \"coordinate\" ;\n latitude:long_name = \"latitude at grid cell center\" ;\n latitude:standard_name = \"latitude\" ;\n latitude:units = \"degrees_north\" ;\n float longitude(longitude) ;\n\n\nAnd that’s it! You should now be able to use wget and curl to download URS-protected data from PODAAC cloud without providing your creds each time.\n\n\nPrepare a list of files to download\nNow the only step that remains is to get a list of URLs to pass to wget or curl for downloading. There’s a lot of ways to do this – even more so for ECCO V4r4 data because the files/datasets follow well-structured naming conventions – but we will rely on Earthdata Search to do this from the browser for the sake of simplicity.\n1. Find the collection/dataset of interest in Earthdata Search.\nStart from this complete list of ECCO collections in Earthdata Search (79 in total), and refine the results until you see your dataset of interest. In this case we want monthly sea surface height grids provided at 0.5-degree cell resolution on an interpolated latitude/longitude grid.\n2. Pick your collection, then click the green Download All button on the next page.\nClick the big green button identified by the red arrow/box in the screenshot below.\n\nThat will add all the granules in the collection to your “shopping cart” and then redirect you straight there and present you with the available options for customizing the data prior to download. We will ignore those because they’re mostly in active development and because we want to download all data in the collection.\n\n\nThe screenshot above shows the download customization interface (i.e. “shopping cart”)\n\n3. Click Download Data to get your list of download urls (bottom-left, another green button)\nThe Download Data button takes you to one final page that provides the list of urls from which to download the files matching your search parameters and any customization options that you selected in the steps that followed. This page will be retained in your User History in case you need to return to it later.\n\nThere are several ways that you could get the list of urls into a text file that’s accessible from Jupyter or your local shell. I simply clicked the save button in my browser and downloaded them as a text file to a subdirectory called resources inside this workspace. (You could also copy them into a new notebook cell and write them to a file like we did with the netrc file above.)\n\n\nDownload files in a batch with GNU Wget\nI find wget options to be convenient and easy to remember. There are only a handful that I use with any regularity.\nThe most important wget option for our purpose is set by the -i argument, which takes a path to the input text file containing our download urls. Another nice feature of wget is the ability to continue downloads where you left of during a previously-interuppted download session. That option is turned on by passing the -c argument.\nNow run wget against a list of files retrieve from Earthdata Search and see what happens.\n\n!ls resources/*.txt\n\nresources/5237392644-download.txt\n\n\nGo ahead and create a data/ directory to keep the downloaded files, and then start the downloads into that location by including the -P argument:\n\n%%bash\n\nmkdir -p data\n\nwget --no-verbose \\\n --no-clobber \\\n --continue \\\n -i resources/5237392644-download.txt -P data/\n\nWait a long time if you have to… then count the number of netCDF files in the data directory:\n\n!ls -1 data/*.nc | wc -l\n\n 312\n\n\nAdd a folder for outputs, if needed:\n\n!mkdir -p outputs/\n\nGet a list of netCDF files at the data directory and print the count + the first filename in the list:\n\nfiles = !ls data/*.nc\n\nlen(files), files[0]\n\n(312, 'data/SEA_SURFACE_HEIGHT_mon_mean_1992-01_ECCO_V4r4_latlon_0p50deg.nc')\n\n\nThis is the first time you’ll need any Python in this notebook… Install Python 3 requirements (I am on version 3.8.)\n\n#!conda install -c conda-forge numpy dask netCDF4 xarray, cartopy, ffmpeg\nimport xarray as xr\nimport matplotlib.animation as animation\nimport matplotlib.pyplot as plt\nimport cartopy.feature as cfeat\nimport cartopy.crs as ccrs\nimport cartopy\n\nOpen the netCDFs as one multi-file dataset with xarray:\n\nds = xr.open_mfdataset(\n paths=files,\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks={'latitude': 360, 'longitude': 720, 'time': 5}\n)\n\nssh = ds.SSH\n\nprint(ssh)\n\n<xarray.DataArray 'SSH' (time: 312, latitude: 360, longitude: 720)>\ndask.array<concatenate, shape=(312, 360, 720), dtype=float32, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 1992-01-16T18:00:00 ... 2017-12-16T06:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: -1.8805772066116333\n valid_max: 1.4207719564437866\n\n\n\n\nPlot gridded sea surface height time series\nBut only the timesteps beginning in 2015:\n\nssh_after_201x = ssh[ssh['time.year']>=2015,:,:]\nprint(ssh_after_201x)\n\n<xarray.DataArray 'SSH' (time: 36, latitude: 360, longitude: 720)>\ndask.array<getitem, shape=(36, 360, 720), dtype=float32, chunksize=(1, 360, 720), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2015-01-16T12:00:00 ... 2017-12-16T06:00:00\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8\nAttributes:\n coverage_content_type: modelResult\n long_name: Dynamic sea surface height anomaly\n standard_name: sea_surface_height_above_geoid\n units: m\n comment: Dynamic sea surface height anomaly above the geoi...\n valid_min: -1.8805772066116333\n valid_max: 1.4207719564437866\n\n\nPlot the grid for the first time step using a Robinson projection. Define a helper function for consistency throughout the notebook:\n\ndef make_figure(proj):\n fig = plt.figure(figsize=(16,6))\n ax = fig.add_subplot(1, 1, 1, projection=proj)\n ax.add_feature(cfeat.LAND)\n ax.add_feature(cfeat.OCEAN)\n ax.add_feature(cfeat.COASTLINE)\n ax.add_feature(cfeat.BORDERS, linestyle='dotted')\n return fig, ax\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\nssh_after_201x.isel(time=0).plot(ax=ax, transform=ccrs.PlateCarree(), cmap='Spectral_r')\n\n\n\n\n\n\n\n\nNow plot the whole time series (post-2010) in an animation and write it to an mp4 file called ecco_monthly_ssh_grid_2015_to_x.mp4:\n\ndef get_animation(var, cmap: str=\"Spectral_r\"):\n \"\"\"Get time series animation for input xarray dataset\"\"\"\n\n def draw_map(i: int, add_colorbar: bool):\n data = var[i]\n m = data.plot(ax=ax, \n transform=ccrs.PlateCarree(),\n add_colorbar=add_colorbar,\n vmin=var.valid_min, \n vmax=var.valid_max,\n cmap=cmap)\n plt.title(str(data.time.values)[:7])\n return m\n\n def init():\n return draw_map(0, add_colorbar=True)\n \n def animate(i):\n return draw_map(i, add_colorbar=False)\n\n return init, animate\n\nNow make the animation using the function:\n\nfig, ax = make_figure(proj=ccrs.Robinson())\n\ninit, animate = get_animation(ssh_after_201x)\n\nani = animation.FuncAnimation(fig=fig, \n func=animate, \n frames=ssh_after_201x.time.size, \n init_func=init, \n interval=0.2, \n blit=False, \n repeat=False)\n\n# Now save the animation to an MP4 file:\nani.save('outputs/ecco_monthly_ssh_grid_2015_to_x.mp4', writer=animation.FFMpegWriter(fps=8))\n\nplt.close(fig)\n\nRender the animation in the ipynb:\n\n#HTML(ani.to_html5_video())", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "ECCO", - "Local Download Access" - ] + "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc-dictionary---environments", + "href": "mcc_api/metadata_compliance_checker_API.html#mcc-dictionary---environments", + "title": "MCC - API POST", + "section": "MCC Dictionary - Environments", + "text": "MCC Dictionary - Environments\n\nurl_dict = {\n 'UAT': \"https://mcc.podaac.uat.earthdatacloud.nasa.gov/mcc\",\n 'PROD': \"https://mcc.podaac.earthdatacloud.nasa.gov/\"\n}\n\nmcc_host = url_dict.get(mcc_env)\n\n\n# Print\nprint(mcc_env, \" - \" , mcc_host)" }, { - "objectID": "external/VisualizeDopplerScattData.html", - "href": "external/VisualizeDopplerScattData.html", - "title": "S-MODE Workshop: Science Case Study Airborne Part 2", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop\n%load_ext autoreload\n%autoreload 2\nimport sys\nsys.path.append('../src')\nfrom matplotlib import pyplot as plt\n%matplotlib inline\nfrom pathlib import Path\nimport numpy as np\nimport rioxarray\nimport xarray as xr\nfrom plot_dopplerscatt_data import make_streamplot_image\nimport warnings\nwarnings.simplefilter('ignore')", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "S-MODE", - "Case Study Airborne Part 2" - ] + "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc---api-post-query-example-for-a-local-file", + "href": "mcc_api/metadata_compliance_checker_API.html#mcc---api-post-query-example-for-a-local-file", + "title": "MCC - API POST", + "section": "MCC - API POST query example (for a local file)", + "text": "MCC - API POST query example (for a local file)\nSee https://mcc.podaac.earthdatacloud.nasa.gov/mcc/about_api for a description of the query parameters (accessed via payload{} dictionary in this example)\n\nurl = mcc_host + \"/check\"\n\npayload = {\n'ACDD':'on',\n'ACDD-version':'1.3',\n'CF':'on',\n'CF-version':'1.7',\n'response':'json',\n}\n\n\n# set the path and filename to upload to MCC\ndirname = \"my_local_path_to_the_file\"\nfilename = \"myFile.nc\"\n\n# working examples . . . comment out, modify or remove these two lines as needed\ndirname = \"./data/\"\nfilename = \"ascat_20210101_000900_metopa_73696_eps_o_coa_3202_ovw.l2.nc\"\n\n\nfiles=[\n ('file-upload',\n (\n filename, \n open(dirname+filename,'rb'),'application/octet-stream'\n\n )\n )\n]\n\nheaders = {}\n\n# Ping the API; format the response in json; pretty print the json response\nresponse = requests.request(\"POST\", url, headers=headers, data=payload, files=files)\njson_resp = json.loads(response.text)\njson_resp_formatted = json.dumps(json_resp, indent=2)\nprint(json_resp_formatted)" }, { - "objectID": "external/VisualizeDopplerScattData.html#apply-the-good-data-mask-for-all-current-observations", - "href": "external/VisualizeDopplerScattData.html#apply-the-good-data-mask-for-all-current-observations", - "title": "S-MODE Workshop: Science Case Study Airborne Part 2", - "section": "Apply the good data mask for all current observations", - "text": "Apply the good data mask for all current observations\nOnly accept estimates that use a minimum number of observations. The current recommended number is 4. Use the variable nobs_all_lines to make a mask and then mask all variables\n\ndef mask_velocity_all_lines(ds, minobs, data_vars, vthresh=0.1):\n \"\"\"Mask all measurements with fewer than minobs observations.\"\"\"\n bad = ( (ds.nobs_all_lines.data < minobs) |\n (ds.u_current_error_all_lines.data > vthresh) |\n (ds.v_current_error_all_lines.data > vthresh) )\n for v in data_vars:\n if np.issubdtype(ds[v].dtype, np.floating):\n ds[v].data[bad] = np.nan\n return ds\n\n\nminobs = 4\nvthresh =0.1\ndata_vars = [\n 'u_current_all_lines',\n 'v_current_all_lines',\n 'u_current_error_all_lines',\n 'v_current_error_all_lines']\nds_all = mask_velocity_all_lines(ds_all, minobs, data_vars, vthresh)", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "S-MODE", - "Case Study Airborne Part 2" - ] + "objectID": "notebooks/SWORD_River_Demo.html#summary", + "href": "notebooks/SWORD_River_Demo.html#summary", + "title": "SWORD River Demo", + "section": "Summary", + "text": "Summary\nThis notebook will query the SWOT River Database (SWORD) for river reaches (segments) or nodes (points) and visualize results using PO.DAAC’s Feature Translation Service. We use geospatial coordinates of the queried features (here river reaches along the Kasai River, a tributary of the Congo River in Africa) to then query and download or access via the cloud Pre-SWOT Hydrology data along the specified regions. This is a programmatic approach to using the ‘Advanced Search -> River Reach’ query in the Earthdata Search GUI." }, { - "objectID": "external/zarr_access.html", - "href": "external/zarr_access.html", - "title": "Zarr Access for NetCDF4 files", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from NASA Openscapes 2021 Cloud Hackathon Repository", - "crumbs": [ - "Tutorials", - "Cloud Optimized Examples", - "Zarr Access for NetCDF4 Files" - ] + "objectID": "notebooks/SWORD_River_Demo.html#requirements", + "href": "notebooks/SWORD_River_Demo.html#requirements", + "title": "SWORD River Demo", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport requests\nimport json\nimport pprint\nimport xarray as xr\nimport geojson\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport plotly.graph_objects as go\nfrom IPython.display import JSON, Image\nimport earthaccess\n\n\n\nAuthenticate Earthdata Login via earthaccess\n\nauth = earthaccess.login()\n\n\n\nDefine a Function to Query Easier\nFirst, we define a function to query a single reach, multiple reaches, or river nodes. This function returns the properties of river reaches including name, length, coordinates as well as individual node properties.\n\ndef response_to_FeatureCollection(response):\n \"\"\"\n This function will return a geojson.FeatureCollection representation of the features found in the provided response.\n Parameters\n ----------\n response : requests.Response - a Response object returned from a GET request on the rivers or nodes endpoint.\n Returns\n -------\n geojson.FeatureCollection - FeatureCollection containing all features extracted from the response.\n \"\"\"\n featureList = []\n for reach_id, reach_json in response.json()['results'].items():\n reach_feature = geojson.loads(json.dumps(reach_json['geojson']))\n reach_feature['properties']={k:v for k,v in reach_json.items() if k not in ['geojson', 'geometry']}\n featureList.append(reach_feature)\n featureCollection = geojson.FeatureCollection(featureList)\n return featureCollection" }, { - "objectID": "external/zarr_access.html#timing", - "href": "external/zarr_access.html#timing", - "title": "Zarr Access for NetCDF4 files", - "section": "Timing:", - "text": "Timing:\n\nExercise: 45 minutes", - "crumbs": [ - "Tutorials", - "Cloud Optimized Examples", - "Zarr Access for NetCDF4 Files" - ] + "objectID": "notebooks/SWORD_River_Demo.html#single-river-reach-from-the-sword-database", + "href": "notebooks/SWORD_River_Demo.html#single-river-reach-from-the-sword-database", + "title": "SWORD River Demo", + "section": "Single River Reach from the SWORD Database", + "text": "Single River Reach from the SWORD Database\nIn this section, we query the Feature Translation Service (FTS) SWORD service using a single Reach ID (from SWORD) to give us all of the metadata regarding the particular reach. In this example, we use the river Reach ID 13227000061. This ID represents a specific reach along the Kasai River, a tributary of the Congo River in Africa.\n\n#change the reach ID in the link below for a different location.\nresponse_reach = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/reach/13227000061\")\nfeatureCollection_reach = response_to_FeatureCollection(response_reach)\n\npprint.pprint(response_reach.json(), compact=True, width=60, depth=2)\n\n{'hits': 1,\n 'results': {'13227000061': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'reach'},\n 'status': '200 OK',\n 'time': '6.2 ms.'}\n\n\nNote that we haven’t looked at any data from a collection yet, we’ve simply found the geospatial coordinates of our river reach of interest within the metadata." }, { - "objectID": "external/zarr_access.html#summary", - "href": "external/zarr_access.html#summary", - "title": "Zarr Access for NetCDF4 files", + "objectID": "notebooks/SWORD_River_Demo.html#query-data-by-coordinates", + "href": "notebooks/SWORD_River_Demo.html#query-data-by-coordinates", + "title": "SWORD River Demo", + "section": "Query Data by Coordinates", + "text": "Query Data by Coordinates\nWe can use results obtained from the FTS query to then directly and automatically query data using the earthaccess python library. We will use the coordinate information of a single reach to search for granules (files) available through the SWOT L2 raster files, whose data has the short-name SWOT_L2_HR_Raster_2.0.\n\n#obtain the associated lat/lons for the feature\nlats = [xy[1] for feature in featureCollection_reach['features'] for xy in feature['coordinates']]\nlons = [xy[0] for feature in featureCollection_reach['features'] for xy in feature['coordinates']]\n\n# find max and min of lat and lon derived when visualizing the reach for the bounding box input to earthaccess\nmaxlat, maxlon, minlat, minlon = max(lats), max(lons), min(lats), min(lons)\n\n\n#earthaccess data search\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', bounding_box=(minlon,minlat,maxlon,maxlat))\n\nGranules found: 30\n\n\nResults contains a link to the data file (granule) from the SWOT_L2_HR_RiverSP_2.0 data collection that overlaps the geospatial search from FTS-SWORD for the river reaches of interest, which we can then download or use within the cloud. Earthaccess will return the link required for the environment (https if local and s3 if in the cloud)." + }, + { + "objectID": "notebooks/SWORD_River_Demo.html#accessing-data-in-the-cloud-skip-this-chunk-if-local", + "href": "notebooks/SWORD_River_Demo.html#accessing-data-in-the-cloud-skip-this-chunk-if-local", + "title": "SWORD River Demo", + "section": "Accessing Data in the Cloud (skip this chunk if local)", + "text": "Accessing Data in the Cloud (skip this chunk if local)\nThis code chunk will only work if you are running this script in the cloud, AWS us-west-2 region.\n\n#access data within the cloud and open into an xarray dataset\nds_SWOT_raster = xr.open_mfdataset(earthaccess.open([results[0]]), engine=\"h5netcdf\")\nds_SWOT_raster\n\nOpening 1 granules, approx size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 581, y: 582)\nCoordinates:\n * x (x) float64 3.585e+05 3.588e+05 ... 5.035e+05\n * y (y) float64 9.358e+06 9.358e+06 ... 9.503e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-11-30T07:08:40Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 358500.0\n x_max: 503500.0\n y_min: 9357750.0\n y_max: 9503000.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 581y: 582Coordinates: (2)x(x)float643.585e+05 3.588e+05 ... 5.035e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([358500., 358750., 359000., ..., 503000., 503250., 503500.])y(y)float649.358e+06 9.358e+06 ... 9.503e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([9357750., 9358000., 9358250., ..., 9502500., 9502750., 9503000.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 34Sgeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :10000000.0longitude_of_central_meridian :21.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 34S\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",21],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",10000000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32734\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 34S\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",21],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",10000000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32734\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([358500.0, 358750.0, 359000.0, 359250.0, 359500.0, 359750.0,\n 360000.0, 360250.0, 360500.0, 360750.0,\n ...\n 501250.0, 501500.0, 501750.0, 502000.0, 502250.0, 502500.0,\n 502750.0, 503000.0, 503250.0, 503500.0],\n dtype='float64', name='x', length=581))yPandasIndexPandasIndex(Float64Index([9357750.0, 9358000.0, 9358250.0, 9358500.0, 9358750.0, 9359000.0,\n 9359250.0, 9359500.0, 9359750.0, 9360000.0,\n ...\n 9500750.0, 9501000.0, 9501250.0, 9501500.0, 9501750.0, 9502000.0,\n 9502250.0, 9502500.0, 9502750.0, 9503000.0],\n dtype='float64', name='y', length=582))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-11-30T07:08:40Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :55scene_number :73tile_numbers :[144 145 146 147 144 145 146 147]tile_names :055_144L, 055_145L, 055_146L, 055_147L, 055_144R, 055_145R, 055_146R, 055_147Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :250.0short_name :L2_HR_Rasterdescriptor_string :250m_UTM34M_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-25T08:46:30.064537Ztime_granule_end :2023-11-25T08:46:51.150152Ztime_coverage_start :2023-11-25T08:46:30.594559Ztime_coverage_end :2023-11-25T08:46:50.620738Zgeospatial_lon_min :19.72141518983517geospatial_lon_max :21.03225044891599geospatial_lat_min :-5.810602992908104geospatial_lat_max :-4.4965880080449185left_first_longitude :19.72141518983517left_first_latitude :-5.641311173698941left_last_longitude :19.891062484099912left_last_latitude :-4.496588008044919right_first_longitude :20.86456012740915right_first_latitude :-5.810602992908102right_last_longitude :21.032250448915992right_last_latitude :-4.665287517098692xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_055_144L_20231125T084620_20231125T084631_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_145L_20231125T084630_20231125T084641_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_146L_20231125T084640_20231125T084651_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_147L_20231125T084650_20231125T084701_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_144R_20231125T084620_20231125T084631_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_145R_20231125T084630_20231125T084641_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_146R_20231125T084640_20231125T084651_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_147R_20231125T084650_20231125T084701_PIC0_02.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_055_144L_20231125T084620_20231125T084631_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_145L_20231125T084630_20231125T084641_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_146L_20231125T084640_20231125T084651_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_147L_20231125T084650_20231125T084701_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_144R_20231125T084620_20231125T084631_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_145R_20231125T084630_20231125T084641_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_146R_20231125T084640_20231125T084651_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_147R_20231125T084650_20231125T084701_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :34mgrs_latitude_band :Mx_min :358500.0x_max :503500.0y_min :9357750.0y_max :9503000.0institution :CNESproduct_version :01" + }, + { + "objectID": "notebooks/SWORD_River_Demo.html#downloading-data-on-a-local-machine", + "href": "notebooks/SWORD_River_Demo.html#downloading-data-on-a-local-machine", + "title": "SWORD River Demo", + "section": "Downloading Data on a Local Machine", + "text": "Downloading Data on a Local Machine\n\n#download data into folder on local machine\nearthaccess.download([results[0]], \"datasets/data_downloads\")\n\n Getting 1 granules, approx download size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n['datasets\\\\data_downloads\\\\SWOT_L2_HR_Raster_250m_UTM34M_N_x_x_x_007_055_073F_20231125T084630_20231125T084651_PIC0_01.nc']\n\n\n\n#open dataset for visualization\nds_SWOT_raster = xr.open_mfdataset(f'datasets/data_downloads/SWOT_L2_HR_Raster*', engine='h5netcdf')\nds_SWOT_raster\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1920, y: 2101)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 5.035e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 9.503e+06\nData variables: (12/39)\n crs (y, x) object b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-12-03T08:26:57Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 04xarray.DatasetDimensions:x: 1920y: 2101Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 5.035e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 503000., 503250., 503500.])y(y)float644.274e+06 4.274e+06 ... 9.503e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 9502500., 9502750., 9503000.])Data variables: (39)crs(y, x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.array([[b'1', b'1', b'1', ..., nan, nan, nan],\n [b'1', b'1', b'1', ..., nan, nan, nan],\n [b'1', b'1', b'1', ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., b'1', b'1', b'1'],\n [nan, nan, nan, ..., b'1', b'1', b'1'],\n [nan, nan, nan, ..., b'1', b'1', b'1']], dtype=object)longitude(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 501250.0, 501500.0, 501750.0, 502000.0, 502250.0, 502500.0,\n 502750.0, 503000.0, 503250.0, 503500.0],\n dtype='float64', name='x', length=1920))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 9500750.0, 9501000.0, 9501250.0, 9501500.0, 9501750.0, 9502000.0,\n 9502250.0, 9502500.0, 9502750.0, 9503000.0],\n dtype='float64', name='y', length=2101))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-12-03T08:26:57Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-27T04:20:14.437610Ztime_granule_end :2023-11-27T04:20:35.534188Ztime_coverage_start :2023-11-27T04:20:14.980558Ztime_coverage_end :2023-11-27T04:20:34.994509Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_106_084L_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085L_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086L_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087L_20231127T042034_20231127T042045_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_084R_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085R_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087R_20231127T042034_20231127T042045_PIC0_03.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_106_084L_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085L_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_084R_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085R_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_086R_20231127T042024_20231127T042035_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_087R_20231127T042034_20231127T042045_PIC0_04.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :04\n\n\n… Continue to Science!" + }, + { + "objectID": "notebooks/SWORD_River_Demo.html#other-options-to-query-the-sword-database", + "href": "notebooks/SWORD_River_Demo.html#other-options-to-query-the-sword-database", + "title": "SWORD River Demo", + "section": "Other Options to query the SWORD Database:", + "text": "Other Options to query the SWORD Database:\n\nMultiple River Reaches\nWe can query the FTS SWORD service over multiple river reaches too. In this example, we use ID 132270000. This ID represents multiple reaches along the Kasai River, a tributary of the Congo River in Africa. Note that this reach includes the reach ID of 13227000061 we plotted earlier. The response includes 9 individual reaches.\n\nresponse_multi = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/reach/132270000\")\nfeatureCollection_multi = response_to_FeatureCollection(response_multi)\n\npprint.pprint(response_multi.json(), compact=True, width=60, depth=2)\n\n{'hits': 9,\n 'results': {'13227000011': {...},\n '13227000021': {...},\n '13227000031': {...},\n '13227000041': {...},\n '13227000051': {...},\n '13227000061': {...},\n '13227000071': {...},\n '13227000081': {...},\n '13227000091': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'reach'},\n 'status': '200 OK',\n 'time': '58.247 ms.'}\n\n\n\n\nRiver Nodes within a Reach\nWe can also query the FTS SWORD service for river nodes, points along the river reaches. In this example, we use the ID of 13227000060. Note that this ID corresponds to the same reach ID 13227000061 we used earlier. The only difference is that the last digit of 0 corresponds to all the individual nodes along the reach. If the last digit is 1 in the reach ID, it corresponds to the overall properties of the reach itself. The response returns 52 nodes along the reach.\n\nresponse = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/node/13227000060\")\n\nfeatureCollection = response_to_FeatureCollection(response)\n\npprint.pprint(response.json(), compact=True, width=60, depth=2)\n\n{'hits': 52,\n 'results': {'13227000060011': {...},\n '13227000060021': {...},\n '13227000060031': {...},\n '13227000060041': {...},\n '13227000060051': {...},\n '13227000060061': {...},\n '13227000060071': {...},\n '13227000060081': {...},\n '13227000060091': {...},\n '13227000060101': {...},\n '13227000060111': {...},\n '13227000060121': {...},\n '13227000060131': {...},\n '13227000060141': {...},\n '13227000060151': {...},\n '13227000060161': {...},\n '13227000060171': {...},\n '13227000060181': {...},\n '13227000060191': {...},\n '13227000060201': {...},\n '13227000060211': {...},\n '13227000060221': {...},\n '13227000060231': {...},\n '13227000060241': {...},\n '13227000060251': {...},\n '13227000060261': {...},\n '13227000060271': {...},\n '13227000060281': {...},\n '13227000060291': {...},\n '13227000060301': {...},\n '13227000060311': {...},\n '13227000060321': {...},\n '13227000060331': {...},\n '13227000060341': {...},\n '13227000060351': {...},\n '13227000060361': {...},\n '13227000060371': {...},\n '13227000060381': {...},\n '13227000060391': {...},\n '13227000060401': {...},\n '13227000060411': {...},\n '13227000060421': {...},\n '13227000060431': {...},\n '13227000060441': {...},\n '13227000060451': {...},\n '13227000060461': {...},\n '13227000060471': {...},\n '13227000060481': {...},\n '13227000060491': {...},\n '13227000060501': {...},\n '13227000060511': {...},\n '13227000060521': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'node'},\n 'status': '200 OK',\n 'time': '119.271 ms.'}" + }, + { + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#summary", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#summary", + "title": "Search by HUC Example", "section": "Summary", - "text": "Summary\nZarr is an open source library for storing N-dimensional array data. It supports multidimensional arrays with attributes and dimensions similar to NetCDF4, and it can be read by XArray. Zarr is often used for data held in cloud object storage (like Amazon S3), because it is better optimized for these situations than NetCDF4.\nThe zarr-eosdis-store library allows NASA EOSDIS NetCDF4 files to be read more efficiently by transferring only file metadata and data needed for computation in a small number of requests, rather than moving the whole file or making many small requests. It works by making the files directly readable by the Zarr Python library and XArray across a network. To use it, files must have a corresponding metadata file ending in .dmrpp, which increasingly true for cloud-accessible EOSDIS data. https://github.com/nasa/zarr-eosdis-store\nThe zarr-eosdis-store library provides several benefits over downloading EOSDIS data files and accessing them using XArray, NetCDF4, or HDF5 Python libraries:\n\nIt only downloads the chunks of data you actually read, so if you don’t read all variables or the full spatiotemporal extent of a file, you usually won’t spend time downloading those portions of the file\nIt parallelizes and optimizes downloads for the portions of files you do read, so download speeds can be faster in general\nIt automatically interoperates with Earthdata Login if you have a .netrc file set up\nIt is aware of some EOSDIS cloud implementation quirks and provides caching that can save time for repeated requests to individual files\n\nIt can also be faster than using XArray pointing NetCDF4 files with s3:// URLs, depending on the file’s internal structure, and is often more convenient.\nConsider using this library when: 1. The portion of the data file you need to use is much smaller than the full file, e.g. in cases of spatial subsets or reading a single variable from a file containing several 1. s3:// URLs are not readily available 1. Code need to run outside of the AWS cloud or us-west-2 region or in a hybrid cloud / non-cloud manner 1. s3:// access using XArray seems slower than you would expect (possibly due to unoptimized internal file structure) 1. No readily-available, public, cloud-optimized version of the data exists already. The example we show is also available as an AWS Public Dataset: https://registry.opendata.aws/mur/ 1. Adding “.dmrpp” to the end of a data URL returns a file\n\nObjectives\n\nBuild on prior knowledge from CMR and Earthdata Login tutorials\nWork through an example of using the EOSDIS Zarr Store to access data using XArray\nLearn about the Zarr format and library for accessing data in the cloud", - "crumbs": [ - "Tutorials", - "Cloud Optimized Examples", - "Zarr Access for NetCDF4 Files" - ] + "text": "Summary\nThis notebook will geospatially search using the PO.DAAC HUC Feature Translation Service (FTS), previewing (viusualizing) the queried region of interest (the Upper Tuolumne River Basin in the San Joaquin River Basin in California’s Sierra Nevada Mountains), and using FTS results to query NASA data. This is a programmatic approach to using the ‘Advanced Search -> River Reach’ query in the Earthdata Search GUI." }, { - "objectID": "external/zarr_access.html#exercise", - "href": "external/zarr_access.html#exercise", - "title": "Zarr Access for NetCDF4 files", - "section": "Exercise", - "text": "Exercise\nIn this exercise, we will be using the eosdis-zarr-store library to aggregate and analyze a month of sea surface temperature for the Great Lakes region\n\nSet up\n\nImport Required Packages\n\n# Core libraries for this tutorial\n# Available via `pip install zarr zarr-eosdis-store`\nfrom eosdis_store import EosdisStore\nimport xarray as xr\n\n# Other Python libraries\nimport requests\nfrom pqdm.threads import pqdm\nfrom matplotlib import animation, pyplot as plt\nfrom IPython.core.display import display, HTML\n\n# Python standard library imports\nfrom pprint import pprint\n\nAlso set the width / height for plots we show\n\nplt.rcParams['figure.figsize'] = 12, 6\n\n\n\nSet Dataset, Time, and Region of Interest\nLook in PO.DAAC’s cloud archive for Group for High Resolution Sea Surface Temperature (GHRSST) Level 4 Multiscale Ultrahigh Resolution (MUR) data\n\ndata_provider = 'POCLOUD'\nmur_short_name = 'MUR-JPL-L4-GLOB-v4.1'\n\nLooking for data from the month of September over the Great Lakes\n\nstart_time = '2021-09-01T21:00:00Z'\nend_time = '2021-09-30T20:59:59Z'\n\n# Bounding box around the Great Lakes\nlats = slice(41, 49)\nlons = slice(-93, -76)\n\n# Some other possibly interesting bounding boxes:\n\n# Hawaiian Islands\n# lats = slice(18, 22.5)\n# lons = slice(-161, -154)\n\n# Mediterranean Sea\n# lats = slice(29, 45)\n# lons = slice(-7, 37)\n\n\n\n\nFind URLs for the dataset and AOI\nSet up a CMR granules search for our area of interest, as we saw in prior tutorials\n\ncmr_url = 'https://cmr.earthdata.nasa.gov/search/granules.json'\n\nSearch for granules in our area of interest, expecting one granule per day of September\n\nresponse = requests.get(cmr_url, \n params={\n 'provider': data_provider,\n 'short_name': mur_short_name, \n 'temporal': f'{start_time},{end_time}',\n 'bounding_box': f'{lons.start},{lats.start},{lons.stop},{lats.stop}',\n 'page_size': 2000,\n }\n )\n\n\ngranules = response.json()['feed']['entry']\n\nfor granule in granules:\n print(granule['title'])\n\n20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210902090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210903090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210904090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210905090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210906090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210907090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210908090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210909090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210910090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210911090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210912090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210913090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210914090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210915090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210916090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210917090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210918090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210919090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210920090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210921090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210922090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210923090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210924090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210925090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210926090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210927090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210928090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210929090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n20210930090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n\n\n\npprint(granules[0])\n\n{'boxes': ['-90 -180 90 180'],\n 'browse_flag': False,\n 'collection_concept_id': 'C1996881146-POCLOUD',\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 4 MUR Global Foundation Sea Surface Temperature '\n 'Analysis (v4.1)',\n 'day_night_flag': 'UNSPECIFIED',\n 'granule_size': '9.059906005859375E-5',\n 'id': 'G2113241213-POCLOUD',\n 'links': [{'href': 's3://podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/s3#',\n 'title': 'This link provides direct download access via S3 to the '\n 'granule.'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#',\n 'title': 'Download '\n '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'Download '\n '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.md5'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#',\n 'title': 'api endpoint to retrieve temporary credentials valid for '\n 'same-region direct s3 access'},\n {'href': 'https://opendap.earthdata.nasa.gov/collections/C1996881146-POCLOUD/granules/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/service#',\n 'title': 'OPeNDAP request URL'},\n {'href': 'https://github.com/nasa/podaac_tools_and_services/tree/master/subset_opendap',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://earthdata.nasa.gov/esds/competitive-programs/measures/mur-sst',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#'},\n {'href': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://doi.org/10.1016/j.rse.2017.07.029',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://registry.opendata.aws/mur/#usageexa',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/metadata#'},\n {'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1996881146-POCLOUD ',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '300.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': ' '\n 'https://search.earthdata.nasa.gov/search/granules?p=C1996881146-POCLOUD ',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'length': '700.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': 'https://podaac.jpl.nasa.gov/MEaSUREs-MUR',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.ipynb',\n 'hreflang': 'en-US',\n 'inherited': True,\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'}],\n 'online_access_flag': True,\n 'original_format': 'UMM_JSON',\n 'time_end': '2021-09-01T21:00:00.000Z',\n 'time_start': '2021-08-31T21:00:00.000Z',\n 'title': '20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'updated': '2021-09-10T07:29:40.511Z'}\n\n\n\nurls = []\nfor granule in granules:\n for link in granule['links']:\n if link['rel'].endswith('/data#'):\n urls.append(link['href'])\n break\npprint(urls)\n\n['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210901090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210902090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210903090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210904090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210905090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210906090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210907090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210908090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210909090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210910090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210911090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210912090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210913090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210914090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210915090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210916090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210917090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210918090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210919090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210920090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210921090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210922090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210923090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210924090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210925090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210926090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210927090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210928090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210929090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210930090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc']\n\n\n\n\nOpen and view our AOI without downloading a whole file\n\nCheck to see if we can use an efficient partial-access technique\n\nresponse = requests.head(f'{urls[0]}.dmrpp')\n\nprint('Can we use EosdisZarrStore and XArray to access these files more efficiently?')\nprint('Yes' if response.ok else 'No')\n\nCan we use EosdisZarrStore and XArray to access these files more efficiently?\nYes\n\n\nOpen our first URL using the Zarr library\n\nurl = urls[0]\n\nds = xr.open_zarr(EosdisStore(url), consolidated=False)\n\nThat’s it! No downloads, temporary credentials, or S3 filesystems. Hereafter, we interact with the ds variable as with any XArray dataset. We need not worry about the EosdisStore anymore.\nView the file’s variable structure\n\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 1, lat: 17999, lon: 36000)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 1lat: 17999lon: 36000Coordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \\\"analysed_sst\\\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \\\"Fill value\\\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.83 GiB\n31.96 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\ntimedelta64[ns]\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[1, 2, 4, 8, 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \\\"grdlandmask\\\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n15.98 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n15.98 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n170 Tasks\n169 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nAttributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \\\"Multi-scale Ultra-high Resolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20210910T072132Zstart_time :20210901T090000Zstop_time :20210901T090000Ztime_coverage_start :20210831T210000Ztime_coverage_end :20210901T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-A, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.009999999776geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.009999999776acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\nds.analysed_sst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\ndask.array<open_dataset-4d5a9a1e1fda090e80524b67b2e413c6analysed_sst, shape=(1, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.41 GiB\n7.99 MiB\n\n\nShape\n(1, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n325 Tasks\n324 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 1\n\n\n\n\nCoordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\nsst = ds.analysed_sst.sel(lat=lats, lon=lons)\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 801, lon: 1701)>\ndask.array<getitem, shape=(1, 801, 1701), dtype=float32, chunksize=(1, 601, 1536), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 41.0 41.01 41.02 41.03 ... 48.97 48.98 48.99 49.0\n * lon (lon) float32 -93.0 -92.99 -92.98 -92.97 ... -76.02 -76.01 -76.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 1lat: 801lon: 1701dask.array<chunksize=(1, 200, 1536), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.20 MiB\n3.52 MiB\n\n\nShape\n(1, 801, 1701)\n(1, 601, 1536)\n\n\nCount\n329 Tasks\n4 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1701 801 1\n\n\n\n\nCoordinates: (3)lat(lat)float3241.0 41.01 41.02 ... 48.99 49.0long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([41. , 41.01, 41.02, ..., 48.98, 48.99, 49. ], dtype=float32)lon(lon)float32-93.0 -92.99 ... -76.01 -76.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-93. , -92.99, -92.98, ..., -76.02, -76.01, -76. ], dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\nsst.plot()\n\n\n\n\n\n\n\n\n\n\n\nAggregate and analyze 30 files\nSet up a function to open all of our URLs as XArrays in parallel\n\ndef open_as_zarr_xarray(url):\n return xr.open_zarr(EosdisStore(url), consolidated=False)\n\ndatasets = pqdm(urls, open_as_zarr_xarray, n_jobs=30)\n\n\n\n\n\n\n\n\n\n\nCombine the individual file-based datasets into a single xarray dataset with a time axis\n\nds = xr.concat(datasets, 'time')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 30, lat: 17999, lon: 36000)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-3...\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 30lat: 17999lon: 36000Coordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \\\"analysed_sst\\\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \\\"Fill value\\\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n144.83 GiB\n31.96 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\ntimedelta64[ns]\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[1, 2, 4, 8, 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \\\"grdlandmask\\\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n15.98 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 1447, 2895), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n15.98 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1447, 2895)\n\n\nCount\n10170 Tasks\n5070 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nAttributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \\\"Multi-scale Ultra-high Resolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20210910T072132Zstart_time :20210901T090000Zstop_time :20210901T090000Ztime_coverage_start :20210831T210000Ztime_coverage_end :20210901T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-A, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.009999999776geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.009999999776acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\nLook at the Analysed SST variable metadata\n\nall_sst = ds.analysed_sst\nall_sst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 30, lat: 17999, lon: 36000)>\ndask.array<concatenate, shape=(30, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-30T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 30lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n72.42 GiB\n7.99 MiB\n\n\nShape\n(30, 17999, 36000)\n(1, 1023, 2047)\n\n\nCount\n19470 Tasks\n9720 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 36000 17999 30\n\n\n\n\nCoordinates: (3)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nCreate a dataset / variable that is only our area of interest and view its metadata\n\nsst = ds.analysed_sst.sel(lat=lats, lon=lons)\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 30, lat: 801, lon: 1701)>\ndask.array<getitem, shape=(30, 801, 1701), dtype=float32, chunksize=(1, 601, 1536), chunktype=numpy.ndarray>\nCoordinates:\n * lat (lat) float32 41.0 41.01 41.02 41.03 ... 48.97 48.98 48.99 49.0\n * lon (lon) float32 -93.0 -92.99 -92.98 -92.97 ... -76.02 -76.01 -76.0\n * time (time) datetime64[ns] 2021-09-01T09:00:00 ... 2021-09-30T09:00:00\nAttributes:\n long_name: analysed sea surface temperature\n standard_name: sea_surface_foundation_temperature\n units: kelvin\n valid_min: -32767\n valid_max: 32767\n comment: \\\"Final\\\" version using Multi-Resolution Variational Anal...\n source: MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, A...xarray.DataArray'analysed_sst'time: 30lat: 801lon: 1701dask.array<chunksize=(1, 200, 1536), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n155.93 MiB\n3.52 MiB\n\n\nShape\n(30, 801, 1701)\n(1, 601, 1536)\n\n\nCount\n19590 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1701 801 30\n\n\n\n\nCoordinates: (3)lat(lat)float3241.0 41.01 41.02 ... 48.99 49.0long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([41. , 41.01, 41.02, ..., 48.98, 48.99, 49. ], dtype=float32)lon(lon)float32-93.0 -92.99 ... -76.01 -76.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-93. , -92.99, -92.98, ..., -76.02, -76.01, -76. ], dtype=float32)time(time)datetime64[ns]2021-09-01T09:00:00 ... 2021-09-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2021-09-01T09:00:00.000000000', '2021-09-02T09:00:00.000000000',\n '2021-09-03T09:00:00.000000000', '2021-09-04T09:00:00.000000000',\n '2021-09-05T09:00:00.000000000', '2021-09-06T09:00:00.000000000',\n '2021-09-07T09:00:00.000000000', '2021-09-08T09:00:00.000000000',\n '2021-09-09T09:00:00.000000000', '2021-09-10T09:00:00.000000000',\n '2021-09-11T09:00:00.000000000', '2021-09-12T09:00:00.000000000',\n '2021-09-13T09:00:00.000000000', '2021-09-14T09:00:00.000000000',\n '2021-09-15T09:00:00.000000000', '2021-09-16T09:00:00.000000000',\n '2021-09-17T09:00:00.000000000', '2021-09-18T09:00:00.000000000',\n '2021-09-19T09:00:00.000000000', '2021-09-20T09:00:00.000000000',\n '2021-09-21T09:00:00.000000000', '2021-09-22T09:00:00.000000000',\n '2021-09-23T09:00:00.000000000', '2021-09-24T09:00:00.000000000',\n '2021-09-25T09:00:00.000000000', '2021-09-26T09:00:00.000000000',\n '2021-09-27T09:00:00.000000000', '2021-09-28T09:00:00.000000000',\n '2021-09-29T09:00:00.000000000', '2021-09-30T09:00:00.000000000'],\n dtype='datetime64[ns]')Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nXArray reads data lazily, i.e. only when our code actually needs it. Up to this point, we haven’t read any data values, only metadata. The next line will force XArray to read the portions of the source files containing our area of interest. Behind the scenes, the eosdis-zarr-store library is ensuring data is fetched as efficiently as possible.\nNote: This line isn’t strictly necessary, since XArray will automatically read the data we need the first time our code tries to use it, but calling this will make sure that we can read the data multiple times later on without re-fetching anything from the source files.\nThis line will take several seconds to complete, but since it is retrieving only about 50 MB of data from 22 GB of source files, several seconds constitutes a significant time, bandwidth, and disk space savings.\n\nsst.load();\n\nNow we can start looking at aggregations across the time dimension. In this case, plot the standard deviation of the temperature at each point to get a visual sense of how much temperatures fluctuate over the course of the month.\n\n# We expect a warning here, from finding the standard deviation of arrays that contain all N/A values.\n# numpy produces N/A for these points, though, which is exactly what we want.\nstdev_sst = sst.std('time')\nstdev_sst.name = 'stdev of analysed_sst [Kelvin]'\nstdev_sst.plot();\n\n/srv/conda/envs/notebook/lib/python3.9/site-packages/numpy/lib/nanfunctions.py:1670: RuntimeWarning: Degrees of freedom <= 0 for slice.\n var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n\n\n\n\n\n\n\n\n\n\nInteractive animation of a month of data\nThis section isn’t as important to fully understand. It shows us a way to get an interactive animation to see what we have retrieved so far\nDefine an animation function to plot the ith time step. We need to make sure each plot is using the same color scale, set by vmin and vmax so the animation is consistent\n\nsst_min = sst.min()\nsst_max = sst.max()\n\ndef show_time_step(i):\n plt.clf()\n res = sst[i].plot.imshow(vmin=sst_min, vmax=sst_max)\n return (res,)\n\nRender each time slice once and show it as an HTML animation with interactive controls\n\n#anim = animation.FuncAnimation(plt.gcf(), func=show_time_step, frames=len(sst))\n#display(HTML(anim.to_jshtml()))\n#plt.close()\n\n\n\n\nSupplemental: What’s happening here?\nFor EOSDIS data in the cloud, we have begun producing a metadata sidecar file in a format called DMR++ that extracts all of the information about arrays, variables, and dimensions from data files, as well as the byte offsets in the NetCDF4 file where data can be found. This information is sufficient to let the Zarr library read data from our NetCDF4 files, but it’s in the wrong format. zarr-eosdis-store knows how to fetch the sidecar file and transform it into something the Zarr library understands. Passing it when reading Zarr using XArray or the Zarr library lets these libraries interact with EOSDIS data exactly as if they were Zarr stores in a way that’s more optimal for reading data in the cloud. Beyond this, the zarr-eosdis-store library makes some optimizations in the way it reads data to help make up for situations where the NetCDF4 file is not internally arranged well for cloud-based access patterns.", - "crumbs": [ - "Tutorials", - "Cloud Optimized Examples", - "Zarr Access for NetCDF4 Files" - ] + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#requirements", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#requirements", + "title": "Search by HUC Example", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nLearning Objectives\n\nuse the FTS-HUC API (https://fts.podaac.earthdata.nasa.gov/) to define geographic region of interest (query by partial or exact HUC or HUC region name)\nvisualize query\nuse coordinates returned by FTS to query Sentinel-1 data, by polygon or bounding box.\n\nResources USGS Hydrologic unit map to help identifiy region of interest (e.g. HUC value or name) can be found here: https://water.usgs.gov/GIS/regions.html\n\n\nImport libraries\n\nimport sys\nimport requests\nimport json\nfrom shapely.geometry import box, Polygon\nimport matplotlib.pyplot as plt \nimport geopandas as gpd\nimport numpy as np\nimport earthaccess" }, { - "objectID": "external/SWOT_to_kerchunk.html", - "href": "external/SWOT_to_kerchunk.html", - "title": "Kerchunk JSON Generation", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, the-coding-club.", - "crumbs": [ - "Advanced Cloud", - "Kerchunk" - ] + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-partial-region-matches", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-partial-region-matches", + "title": "Search by HUC Example", + "section": "Search Feature Translation Service for Partial Region Matches", + "text": "Search Feature Translation Service for Partial Region Matches\nIf you are unsure what the corresponding HUC is for your region of interest, you can query the FTS for partial region matches, by setting EXACT = FALSE.\n\n# Querying partial matches with region \"San Joaquin\"\n# This \"partial\" match is anything that BEGINS with the region specified.\n\nREGION = \"San Joa\"\nEXACT = False\n\n# Query Feature Translation Service and parse JSON response\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/region/{}?exact={}\".format(REGION, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print all elements in HUC database that partially matches with region \"San Jo\"\nprint(json.dumps(response, indent = 4))\n\n{\n \"status\": \"200 OK\",\n \"time\": \"5.954 ms.\",\n \"hits\": 3,\n \"search on\": {\n \"parameter\": \"region\",\n \"exact\": false,\n \"polygon_format\": \"\",\n \"page_number\": 1,\n \"page_size\": 100\n },\n \"results\": {\n \"San Joaquin\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/180400.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,36.36688239563472,-118.65438684397327,38.757297326299295\",\n \"Convex Hull Polygon\": \"-120.63835246068544,36.36688239563472,-120.63808719818587,36.3669077091763,-118.73841884071788,37.07942819140368,-118.67420150956752,37.106490572611676,-118.6735564366519,37.10721677469388,-118.66992847311582,37.11265112260213,-118.65448236168146,37.14116804130782,-118.65438684397327,37.14146941734907,-118.65439289188998,37.14204016109818,-118.66449457312427,37.26170858174572,-118.76220691672262,37.45668952727641,-119.3277000731365,38.0651666159153,-119.68023816217266,38.44035645491624,-119.68779037986923,38.44773399761311,-119.84793537962065,38.5975748484222,-119.85336387752892,38.602501526539584,-119.85360401398685,38.60263670362269,-119.96183540965222,38.66278904519601,-119.96190132840212,38.662814343112586,-120.44062253078403,38.74564163360907,-120.48902702862557,38.753198735680655,-120.5539957670664,38.757297326299295,-120.99357654242573,38.71330113157592,-121.07883122250172,38.679223455587135,-121.0804450745826,38.678464784754965,-121.08111498187321,38.67810103163055,-121.5306744270087,38.43261620596991,-121.53113729471636,38.432277129928764,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.02024189030101,36.55629579221568,-121.01674177780643,36.551948971389095,-121.00775647573704,36.54095870369781,-121.00754228094576,36.54077855369809,-120.90553311860407,36.477056078797034,-120.90373942485684,36.476002641298635,-120.73774029490619,36.387480222686065,-120.73704381990729,36.387168219561545,-120.63835246068544,36.36688239563472\",\n \"Visvalingam Polygon\": \"-120.54009506083798,38.751263262767,-120.64081991068161,38.70357532638269,-120.71727710431293,38.70154573055248,-120.74424469072943,38.67445884830289,-120.82514061977054,38.69750556180878,-120.85090918535553,38.634815070239426,-120.85764353951174,38.6677095441467,-120.96138979351736,38.674692672260846,-120.99357654242573,38.71330113157592,-121.0041938840759,38.682131000374284,-121.08583462874088,38.67462685351097,-121.08290462249539,38.62664741087707,-121.13917907969972,38.62357320671521,-121.2089503806331,38.49669539128712,-121.27717303990221,38.476062632985816,-121.26259156388318,38.44828171636226,-121.30028969090802,38.438934230960115,-121.32968337940406,38.39078809249321,-121.3599304720654,38.390321332077235,-121.44111079277275,38.43287303096952,-121.53153281971572,38.431799249721166,-121.51200092287104,38.3990511351887,-121.52198663431386,38.33135239571044,-121.49836688747553,38.271607430178165,-121.5407886280347,38.202546845910376,-121.6015964498153,38.14619380537283,-121.56855837590825,38.097723677323074,-121.66657562158946,38.09834799503045,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.82191980051499,38.02152160869139,-121.86590229836338,37.98235407021048,-121.86986600564887,37.929583865084055,-121.93679916804501,37.85678621415542,-121.83044241300178,37.83564997147988,-121.73909092251853,37.760126577847075,-121.65209140390357,37.75944488930651,-121.65894963201794,37.70730379459576,-121.61490015812797,37.67537787797863,-121.62601494873576,37.621678591603654,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.46914160210423,37.48928770118414,-121.45782723962179,37.39582026382925,-121.41146298448541,37.388361478424144,-121.40667140011789,37.314010806664555,-121.45952651357749,37.284674128585095,-121.39474167826137,37.15006367462735,-121.36483071268282,37.184255913115976,-121.33036383565297,37.167644427725065,-121.28572767738893,37.18259941936856,-121.24031638058443,37.158712379822305,-121.21668344207944,37.12189013821279,-121.231344697265,37.0835010684807,-121.20818868167595,37.061546638306424,-121.24711760557386,37.03114826752028,-121.24579035974261,36.988509275919796,-121.21167625146222,36.95729284888495,-121.23447995559349,36.92657608434928,-121.19828302127468,36.914258812493415,-121.15294869113671,36.865306701111024,-121.1143471828633,36.769056561677075,-121.04964033921374,36.75343970336803,-121.00617919865618,36.76372240960205,-120.95985347476977,36.720116577378064,-120.99658496742109,36.62860115564513,-121.03185423090798,36.58366134425654,-121.00807903927824,36.54150738807198,-120.83248069892579,36.471554128805565,-120.74546076156088,36.39178235497104,-120.68716579706802,36.39413058205071,-120.63835246068544,36.36688239563472,-120.6130646732247,36.441495923643856,-120.65738012628094,36.45709164132802,-120.66078854919232,36.51874457144066,-120.64111663047282,36.53968963494981,-120.66577184918458,36.58187674217595,-120.63374172840093,36.64829444832287,-120.5664488316304,36.71118111072525,-120.48434472967449,36.748263084626046,-120.44305652348856,36.749373372124296,-120.35291486008686,36.786035749150756,-120.23388445714659,36.767794575220705,-120.09885247506452,36.77904516791159,-119.97666310754585,36.8328416803281,-119.812517053634,36.84792405842967,-119.75333349122587,36.86578132194364,-119.69273040277824,36.92774011559749,-119.62802316329538,36.92294028747989,-119.57222072588195,36.95061687285363,-119.51664880721825,36.95427249159792,-119.46285424792671,36.981914174888345,-119.383642975133,37.05806398310352,-119.2715441169737,37.09415164138085,-119.20212414312311,37.10217027886836,-119.18784042960363,37.143694729845606,-119.0858305964286,37.176455095419726,-118.98052836534208,37.185962293321666,-118.89614518838971,37.208425149536765,-118.82732031245484,37.18283535165983,-118.73841884071788,37.07942819140368,-118.71628753554387,37.10699850281924,-118.67420150956752,37.106490572611676,-118.65448236168146,37.14116804130782,-118.68439308246838,37.24133370261069,-118.66449457312427,37.26170858174572,-118.71612671679412,37.328646110808506,-118.74006027092366,37.316221957702794,-118.78637329272675,37.343784711826686,-118.79007416876266,37.39395630133214,-118.7583354854786,37.444366181462215,-118.79668088958579,37.489443694933925,-118.84989162804482,37.47656995224554,-118.9163347623167,37.5501889677563,-118.99876110906376,37.569233157310066,-119.03902598191792,37.60352632600683,-119.03232058505336,37.62993357596582,-119.06525219021057,37.68462583317262,-119.12706784115625,37.73496690601115,-119.20027055354262,37.73524533309404,-119.2162143024762,37.71411237687687,-119.26841790031187,37.73950751954578,-119.20108320354137,37.801137019450096,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.30948290962311,37.94616478068332,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.54763344883679,38.14419101891764,-119.62908996641869,38.196015076128845,-119.61295248831874,38.2614448656106,-119.65148469659226,38.28643111453016,-119.62837932891978,38.349732117556925,-119.68113032050456,38.40217269768385,-119.68023816217266,38.44035645491624,-119.7679873151614,38.48571382776248,-119.77203659015515,38.518283566253615,-119.83374104110106,38.55282589953333,-119.85360401398685,38.60263670362269,-119.92262494617142,38.60820715882238,-119.96190132840212,38.662814343112586,-120.01568027831865,38.665510678525095,-120.06113182303977,38.63065420878752,-120.12165386565414,38.61454576089585,-120.1460215124913,38.64340277022609,-120.23913430193011,38.62996324108025,-120.24664128108515,38.65589799312335,-120.36064677465816,38.70485176492235,-120.39097328086109,38.70561956804619,-120.44062253078403,38.74564163360907,-120.54009506083798,38.751263262767\",\n \"HUC\": \"180400\"\n },\n \"San Joaquin 2\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/1804.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,36.36688239563472,-118.65438684397327,38.757297326299295\",\n \"Convex Hull Polygon\": \"-120.63835246068544,36.36688239563472,-120.63808719818587,36.3669077091763,-118.73841884071788,37.07942819140368,-118.67420150956752,37.106490572611676,-118.6735564366519,37.10721677469388,-118.66992847311582,37.11265112260213,-118.65448236168146,37.14116804130782,-118.65438684397327,37.14146941734907,-118.65439289188998,37.14204016109818,-118.66449457312427,37.26170858174572,-118.76220691672262,37.45668952727641,-119.3277000731365,38.0651666159153,-119.68023816217266,38.44035645491624,-119.68779037986923,38.44773399761311,-119.84793537962065,38.5975748484222,-119.85336387752892,38.602501526539584,-119.85360401398685,38.60263670362269,-119.96183540965222,38.66278904519601,-119.96190132840212,38.662814343112586,-120.44062253078403,38.74564163360907,-120.48902702862557,38.753198735680655,-120.5539957670664,38.757297326299295,-120.99357654242573,38.71330113157592,-121.07883122250172,38.679223455587135,-121.0804450745826,38.678464784754965,-121.08111498187321,38.67810103163055,-121.5306744270087,38.43261620596991,-121.53113729471636,38.432277129928764,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.02024189030101,36.55629579221568,-121.01674177780643,36.551948971389095,-121.00775647573704,36.54095870369781,-121.00754228094576,36.54077855369809,-120.90553311860407,36.477056078797034,-120.90373942485684,36.476002641298635,-120.73774029490619,36.387480222686065,-120.73704381990729,36.387168219561545,-120.63835246068544,36.36688239563472\",\n \"Visvalingam Polygon\": \"-120.54009506083798,38.751263262767,-120.64081991068161,38.70357532638269,-120.71727710431293,38.70154573055248,-120.74424469072943,38.67445884830289,-120.82514061977054,38.69750556180878,-120.85090918535553,38.634815070239426,-120.85764353951174,38.6677095441467,-120.96138979351736,38.674692672260846,-120.99357654242573,38.71330113157592,-121.0041938840759,38.682131000374284,-121.08583462874088,38.67462685351097,-121.08290462249539,38.62664741087707,-121.13917907969972,38.62357320671521,-121.2089503806331,38.49669539128712,-121.27717303990221,38.476062632985816,-121.26259156388318,38.44828171636226,-121.30028969090802,38.438934230960115,-121.32968337940406,38.39078809249321,-121.3599304720654,38.390321332077235,-121.44111079277275,38.43287303096952,-121.53153281971572,38.431799249721166,-121.51200092287104,38.3990511351887,-121.52198663431386,38.33135239571044,-121.49836688747553,38.271607430178165,-121.5407886280347,38.202546845910376,-121.6015964498153,38.14619380537283,-121.56855837590825,38.097723677323074,-121.66657562158946,38.09834799503045,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.82191980051499,38.02152160869139,-121.86590229836338,37.98235407021048,-121.86986600564887,37.929583865084055,-121.93679916804501,37.85678621415542,-121.83044241300178,37.83564997147988,-121.73909092251853,37.760126577847075,-121.65209140390357,37.75944488930651,-121.65894963201794,37.70730379459576,-121.61490015812797,37.67537787797863,-121.62601494873576,37.621678591603654,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.46914160210423,37.48928770118414,-121.45782723962179,37.39582026382925,-121.41146298448541,37.388361478424144,-121.40667140011789,37.314010806664555,-121.45952651357749,37.284674128585095,-121.39474167826137,37.15006367462735,-121.36483071268282,37.184255913115976,-121.33036383565297,37.167644427725065,-121.28572767738893,37.18259941936856,-121.24031638058443,37.158712379822305,-121.21668344207944,37.12189013821279,-121.231344697265,37.0835010684807,-121.20818868167595,37.061546638306424,-121.24711760557386,37.03114826752028,-121.24579035974261,36.988509275919796,-121.21167625146222,36.95729284888495,-121.23447995559349,36.92657608434928,-121.19828302127468,36.914258812493415,-121.15294869113671,36.865306701111024,-121.1143471828633,36.769056561677075,-121.04964033921374,36.75343970336803,-121.00617919865618,36.76372240960205,-120.95985347476977,36.720116577378064,-120.99658496742109,36.62860115564513,-121.03185423090798,36.58366134425654,-121.00807903927824,36.54150738807198,-120.83248069892579,36.471554128805565,-120.74546076156088,36.39178235497104,-120.68716579706802,36.39413058205071,-120.63835246068544,36.36688239563472,-120.6130646732247,36.441495923643856,-120.65738012628094,36.45709164132802,-120.66078854919232,36.51874457144066,-120.64111663047282,36.53968963494981,-120.66577184918458,36.58187674217595,-120.63374172840093,36.64829444832287,-120.5664488316304,36.71118111072525,-120.48434472967449,36.748263084626046,-120.44305652348856,36.749373372124296,-120.35291486008686,36.786035749150756,-120.23388445714659,36.767794575220705,-120.09885247506452,36.77904516791159,-119.97666310754585,36.8328416803281,-119.812517053634,36.84792405842967,-119.75333349122587,36.86578132194364,-119.69273040277824,36.92774011559749,-119.62802316329538,36.92294028747989,-119.57222072588195,36.95061687285363,-119.51664880721825,36.95427249159792,-119.46285424792671,36.981914174888345,-119.383642975133,37.05806398310352,-119.2715441169737,37.09415164138085,-119.20212414312311,37.10217027886836,-119.18784042960363,37.143694729845606,-119.0858305964286,37.176455095419726,-118.98052836534208,37.185962293321666,-118.89614518838971,37.208425149536765,-118.82732031245484,37.18283535165983,-118.73841884071788,37.07942819140368,-118.71628753554387,37.10699850281924,-118.67420150956752,37.106490572611676,-118.65448236168146,37.14116804130782,-118.68439308246838,37.24133370261069,-118.66449457312427,37.26170858174572,-118.71612671679412,37.328646110808506,-118.74006027092366,37.316221957702794,-118.78637329272675,37.343784711826686,-118.79007416876266,37.39395630133214,-118.7583354854786,37.444366181462215,-118.79668088958579,37.489443694933925,-118.84989162804482,37.47656995224554,-118.9163347623167,37.5501889677563,-118.99876110906376,37.569233157310066,-119.03902598191792,37.60352632600683,-119.03232058505336,37.62993357596582,-119.06525219021057,37.68462583317262,-119.12706784115625,37.73496690601115,-119.20027055354262,37.73524533309404,-119.2162143024762,37.71411237687687,-119.26841790031187,37.73950751954578,-119.20108320354137,37.801137019450096,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.30948290962311,37.94616478068332,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.54763344883679,38.14419101891764,-119.62908996641869,38.196015076128845,-119.61295248831874,38.2614448656106,-119.65148469659226,38.28643111453016,-119.62837932891978,38.349732117556925,-119.68113032050456,38.40217269768385,-119.68023816217266,38.44035645491624,-119.7679873151614,38.48571382776248,-119.77203659015515,38.518283566253615,-119.83374104110106,38.55282589953333,-119.85360401398685,38.60263670362269,-119.92262494617142,38.60820715882238,-119.96190132840212,38.662814343112586,-120.01568027831865,38.665510678525095,-120.06113182303977,38.63065420878752,-120.12165386565414,38.61454576089585,-120.1460215124913,38.64340277022609,-120.23913430193011,38.62996324108025,-120.24664128108515,38.65589799312335,-120.36064677465816,38.70485176492235,-120.39097328086109,38.70561956804619,-120.44062253078403,38.74564163360907,-120.54009506083798,38.751263262767\",\n \"HUC\": \"1804\"\n },\n \"San Joaquin Delta\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/18040003.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.93679916804501,37.50128378554052,-120.83793204891731,38.21666854588847\",\n \"Convex Hull Polygon\": \"-121.48401321978946,37.50128378554052,-121.48319938333242,37.501357755332094,-121.48196255312598,37.50148574804024,-121.05388696212378,37.76071366013787,-120.90450576548068,38.0272342086825,-120.90349268423222,38.02938314201248,-120.83793204891731,38.18877460322341,-120.83800179891722,38.1976922021679,-120.83898908849903,38.19987750528952,-121.02443172883619,38.21666854588847,-121.02474798300238,38.21663954068015,-121.02495458821039,38.216620591721835,-121.61499185396116,38.10789443147394,-121.6671072070053,38.09826675128056,-121.84538162652024,38.06328592216818,-121.85283117130035,38.05978179300695,-121.8533769712995,38.059398593007586,-121.93679916804501,37.85678621415542,-121.56421756653998,37.54766027817686,-121.54682447177532,37.53336393132406,-121.54584872802684,37.53266251257514,-121.54544794886078,37.532376185492296,-121.54202411449108,37.53037829903707,-121.49308462915042,37.502441020955416,-121.48639323541079,37.501483144915255,-121.48560074791203,37.501374500123745,-121.48401321978946,37.50128378554052\",\n \"Visvalingam Polygon\": \"-121.02143199238253,38.21228919277024,-121.03881544131383,38.21370070526808,-121.05832012565855,38.19822062820873,-121.07285287251102,38.19676138550267,-121.11744717765015,38.17114820429242,-121.14022114948978,38.168721211587865,-121.15031440780746,38.15854012306204,-121.20154061397795,38.143356763710585,-121.27375955553254,38.116192127294426,-121.32007884504395,38.108511572097996,-121.33525729293706,38.09480684191095,-121.35392083665806,38.08854727525397,-121.41605480843663,38.087353247130864,-121.44424249485121,38.08399005338606,-121.4631167833636,38.071604213821956,-121.4724672395991,38.08759970546379,-121.50203907184482,38.091632609624185,-121.5035856697591,38.072714664861905,-121.51886918848538,38.089077872128144,-121.53291849575527,38.091567440874314,-121.56947503215684,38.08615950442436,-121.5702684009056,38.09822388148899,-121.60393055710335,38.10898488355559,-121.63051299143712,38.10154624398382,-121.6371124122602,38.08992846796019,-121.66657562158946,38.09834799503045,-121.68644943926694,38.08549239192541,-121.68354131427145,38.067767361744586,-121.6994337861218,38.051017879478934,-121.74477304125975,38.03062196596892,-121.80058061825645,38.025494545143545,-121.82947484737826,38.03754110345818,-121.83790479528182,38.06236660550297,-121.8533769712995,38.059398593007586,-121.83359162133019,38.0236317357714,-121.82191980051499,38.02152160869139,-121.8452383838121,37.99565135456487,-121.86590229836338,37.98235407021048,-121.87389402439265,37.949298472345106,-121.88361340562756,37.94069631819184,-121.86986600564887,37.929583865084055,-121.87272500251947,37.917601039061026,-121.88853686499493,37.912210873444394,-121.93679916804501,37.85678621415542,-121.88209073375492,37.84099142667992,-121.86810714523494,37.85399849645137,-121.85208152546818,37.83929578814087,-121.83044241300178,37.83564997147988,-121.8066090526221,37.81308303505659,-121.7922590016027,37.80782963818973,-121.76324145268939,37.7858900934321,-121.76527957768621,37.7773995799036,-121.73909092251853,37.760126577847075,-121.70685220486024,37.77253795491117,-121.69044629863572,37.761101645553936,-121.65209140390357,37.75944488930651,-121.66449931638431,37.74842932369859,-121.6507850361973,37.735751545593246,-121.65918360805927,37.72781387164724,-121.65894963201794,37.70730379459576,-121.63536538726288,37.70130697273004,-121.63448013830595,37.689717726914694,-121.61490015812797,37.67537787797863,-121.60974490188602,37.64429441552687,-121.6227430268658,37.63603342387307,-121.62601494873576,37.621678591603654,-121.61450599042024,37.59930529893006,-121.58214772276216,37.58058849166747,-121.5660067644539,37.54927187400773,-121.54111389574251,37.52994497299608,-121.50439590934116,37.525883816752355,-121.49308462915042,37.502441020955416,-121.48138812291859,37.505721846992,-121.46184374690722,37.53450626882233,-121.44088779485645,37.54675186776166,-121.42484409071466,37.54751497713545,-121.42580857821315,37.564976893775,-121.38028850640882,37.586133978117175,-121.36222241581186,37.603589127048394,-121.31597830859198,37.6093966551644,-121.2544957930624,37.65727026654844,-121.22158270248849,37.67257598423299,-121.22429523477598,37.68152568213577,-121.2057427212631,37.69569779461375,-121.16857574007076,37.70748815501213,-121.14110785782174,37.729918075810644,-121.11848947660684,37.73365946955482,-121.10911928703808,37.7484026966153,-121.09223503081427,37.74791053724107,-121.09480595685193,37.760903828887535,-121.05617153503692,37.76043123409664,-121.09747076830615,37.76801436220984,-121.15035315884904,37.79415341529426,-121.18449382754608,37.82583186628676,-121.19699943377668,37.826716714202064,-121.2195945576999,37.85136148083046,-121.26523294929575,37.87824116933041,-121.2947732367499,37.913431269275804,-121.271524724286,37.93996951090128,-121.19155812336845,37.95833420253945,-121.11637632452681,37.95492616608641,-121.10437461621211,37.957914906706776,-121.05944651211519,37.95597624525141,-121.0339739194464,37.94209255568967,-121.0166917559315,37.94320716193795,-121.00221693720397,37.95548945983552,-120.97566607266185,37.96720422856731,-120.97877787890707,37.989337251449626,-120.9583201601888,37.98447010979055,-120.940789375841,37.99810579518606,-120.92829857481871,38.01908881702849,-120.90450576548068,38.0272342086825,-120.91396404254931,38.035717584710994,-120.91473279150648,38.05371388572473,-120.95564168727628,38.05178600656103,-120.98212063202686,38.064245121125055,-121.03830712152296,38.03886609408113,-121.06709473606162,38.018101445155025,-121.1009083245508,38.00855445246151,-121.130640501588,38.008583444128135,-121.20277275251772,37.95955794732919,-121.28034443156395,37.99378153581773,-121.26629757012745,38.004894071217166,-121.2374627691305,38.01277404724658,-121.21825716395199,38.036504297209774,-121.1927208462833,38.05271741697629,-121.17248860464804,38.05317975343388,-121.1349351203313,38.074925166941796,-121.1088929182884,38.065759808622715,-121.08234508395464,38.050340206563305,-121.07683546104653,38.075894660690324,-121.06335145898413,38.08001638672556,-121.05341488399955,38.103619159605614,-121.02532235904312,38.11545590229554,-121.02185200800687,38.141849487671266,-120.99854338616802,38.13813815330201,-120.96777642579912,38.14682469287186,-120.9602597226858,38.1365514095545,-120.9325378352288,38.152037275155465,-120.90481372589687,38.15161844286445,-120.90117972173584,38.163558659512546,-120.8795133332278,38.16931939075363,-120.83793204891731,38.18877460322341,-120.83898908849903,38.19987750528952,-120.85724504159566,38.19074097717868,-120.87978625510237,38.18972461780527,-120.89379082070565,38.19927907508213,-120.9222689144114,38.1909182750951,-120.94590735812471,38.20575099590542,-120.97285543933293,38.20184120424483,-121.02143199238253,38.21228919277024\",\n \"HUC\": \"18040003\"\n }\n }\n}" }, { - "objectID": "external/SWOT_to_kerchunk.html#background", - "href": "external/SWOT_to_kerchunk.html#background", - "title": "Kerchunk JSON Generation", - "section": "Background", - "text": "Background\nKerchunk is a library that provides a unified way to represent a variety of chunked, compressed data formats (e.g. NetCDF/HDF5, GRIB2, TIFF, …), allowing efficient access to the data from traditional file systems or cloud object storage. It also provides a flexible way to create virtual datasets from multiple files. It does this by extracting the byte ranges, compression information and other information about the data and storing this metadata in a new, separate object. This means that you can create a virtual aggregate dataset over potentially many source files, for efficient, parallel and cloud-friendly in-situ access without having to copy or translate the originals. It is a gateway to in-the-cloud massive data processing for legacy data archival formats. (description from Kerchunk documentation)\n ## Objectives - Generate a Kerchunk JSON file for a PODAAC SWOT Collection - Create individual JSON’s for each netCDF. Then, combine into one file using MultiZarrToZarr. - Allows data to be read from PODAAC s3 as a Zarr combined data store - output file: SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_kerchunk_DEMO.json\n\nimport os\nimport re\nimport s3fs\nimport glob\nimport zarr\nimport dask\nimport ujson\nimport fsspec\nimport requests\nimport numpy as np\nimport xarray as xr\nimport xml.etree.ElementTree as ET\n\nfrom tqdm.notebook import tqdm\nfrom dask import delayed, compute\nfrom dask.distributed import Client\n# from kerchunk.combine import auto_dask\nfrom kerchunk.hdf import SingleHdf5ToZarr\nfrom kerchunk.combine import MultiZarrToZarr", - "crumbs": [ - "Advanced Cloud", - "Kerchunk" - ] + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-matches", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-matches", + "title": "Search by HUC Example", + "section": "Search Feature Translation Service for Exact HUC Matches", + "text": "Search Feature Translation Service for Exact HUC Matches\nHere we can set a HUC ID, or hydrologic unit code, and use this to query the HUC FTS. By defining the parameter EXACT = True, we tell the query to not search for partial matches.\nBased on the partial name response in the previous step, we can now do an exact search for San Joaquin River Basin, using its HUC ID (1804).\n\n# Querying exact matches for HUC \"1804\" = San Joaquin River Basin\n\nHUC = \"1804\"\nEXACT = True\n\n# Query Feature Translation Service and parse JSON response\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/huc/{}?exact={}\".format(HUC, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print only the region name from the query results of the HUC database\nprint(json.dumps(response[\"results\"][\"1804\"][\"Region Name\"], indent = 4))\n\n\"San Joaquin\"" }, { - "objectID": "external/SWOT_to_kerchunk.html#start-dask-cluster", - "href": "external/SWOT_to_kerchunk.html#start-dask-cluster", - "title": "Kerchunk JSON Generation", - "section": "Start Dask cluster", - "text": "Start Dask cluster\n\nData can be read via s3 in parallel and used by Kerchunk\nNOTE: Performance is greatly improved by more CPU’s/threads. 4 hours can become 1 hour, 90 mins can become 20 mins, etc.\nFor over 10,000 granules at least 4 threads is recommended\n\n\nclient = Client()\nclient\n\n\n \n \n Client\n Client-28f1d48e-41d3-11ee-8aca-c62ddac59d68\n \n\n\n\nConnection method: Cluster object\nCluster type: distributed.LocalCluster\n\n\nDashboard: http://127.0.0.1:8787/status\n\n\n\n\n\n\n \n \n Cluster Info\n \n \n \n \n LocalCluster\n f1696fda\n \n\n\n\nDashboard: http://127.0.0.1:8787/status\nWorkers: 4\n\n\nTotal threads: 4\nTotal memory: 8.00 GiB\n\n\nStatus: running\nUsing processes: True\n\n\n\n\n\n \n \n Scheduler Info\n \n\n \n \n \n \n Scheduler\n Scheduler-d99eecbb-b5ff-4e92-80e3-e03e51977918\n \n\n\n\nComm: tcp://127.0.0.1:33331\nWorkers: 4\n\n\nDashboard: http://127.0.0.1:8787/status\nTotal threads: 4\n\n\nStarted: Just now\nTotal memory: 8.00 GiB\n\n\n\n\n \n \n\n \n \n Workers\n \n\n \n \n \n \n \n \n Worker: 0\n \n \n\n\n\nComm: tcp://127.0.0.1:34527\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:45957/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:37945\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-yycevmql\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 1\n \n \n\n\n\nComm: tcp://127.0.0.1:36915\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:41499/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:39355\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-ivjiyl7u\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 2\n \n \n\n\n\nComm: tcp://127.0.0.1:35757\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:33523/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:44603\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-qggrwd45\n\n\n\n\n \n \n \n \n \n \n \n \n \n Worker: 3\n \n \n\n\n\nComm: tcp://127.0.0.1:36783\nTotal threads: 1\n\n\nDashboard: http://127.0.0.1:39605/status\nMemory: 2.00 GiB\n\n\nNanny: tcp://127.0.0.1:34001\n\n\n\nLocal directory: /tmp/dask-worker-space/worker-qgfewoy7", + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-and-named-region-matches", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#search-feature-translation-service-for-exact-huc-and-named-region-matches", + "title": "Search by HUC Example", + "section": "Search Feature Translation Service for Exact HUC and Named Region Matches", + "text": "Search Feature Translation Service for Exact HUC and Named Region Matches\nWhat if we are interested in the Toulumne River Basin within the San Joaquin main basin? We can search directly for that basin as well. If we already know an exact region name or HUC in USGS’s Watershed Boundary Dataset (WBD), we can use this or the name of the basin, or search partially like we did above. Below is an example of searching by exact match using HUC ID (e.g. 18040009) that could be modified to search by region name (“Upper Tuolumne”).\n\n# Querying exact matches with HUC \"18040009\" = Upper Tuolumne\n\nHUC = \"18040009\" #or REGION = \"Upper Tuolumne\"\nEXACT = True\n\n# Query Feature Translation Service and parse JSON response\n# If using region, Note the change in endpoint must go from \"/huc\" to \"/region\" and the .format() must change from HUC to REGION\nr = requests.get(\"https://fts.podaac.earthdata.nasa.gov/huc/{}?exact={}\".format(HUC, EXACT))\n\n# Load response from FTS\nresponse = r.json()\n\n# Print all elements in HUC database that exactly match HUC \"18040009\"\nprint(json.dumps(response, indent = 4))\n\n{\n \"status\": \"200 OK\",\n \"time\": \"1.659 ms.\",\n \"hits\": 1,\n \"search on\": {\n \"parameter\": \"HUC\",\n \"exact\": true,\n \"polygon_format\": \"\",\n \"page_number\": 1,\n \"page_size\": 100\n },\n \"results\": {\n \"18040009\": {\n \"USGS Polygon\": {\n \"Object URL\": \"https://podaac-feature-translation-service.s3-us-west-2.amazonaws.com/18040009.zip\",\n \"Source\": \"ftp://rockyftp.cr.usgs.gov/vdelivery/Datasets/Staged/Hydrography/WBD/HU2/Shape/WBD_18_HU2_Shape.zip\"\n },\n \"Bounding Box\": \"-121.17476593797784,37.57291785522102,-119.19927543166921,38.22952896670182\",\n \"Convex Hull Polygon\": \"-121.105517801627,37.57291785522102,-120.51777999837259,37.58160878749919,-119.26845687218679,37.73942430183757,-119.26095827844847,37.741190162251485,-119.26079495969867,37.74128122475133,-119.25581474616479,37.7450598684955,-119.25563206491506,37.74520087891193,-119.25521361804067,37.745555179953044,-119.20452512020273,37.79316755800414,-119.20311483687158,37.794898117376476,-119.20297581291345,37.79511513091779,-119.20108320354137,37.801137019450096,-119.20096521291657,37.803876760070864,-119.19927543166921,37.88483115890352,-119.19931234937746,37.885001276611604,-119.20064394937538,37.88738135160793,-119.31090541587093,38.044980644071586,-119.3277000731365,38.0651666159153,-119.32796109605277,38.06544024091488,-119.34908448143665,38.08655395234041,-119.62508146642494,38.22905559795254,-119.65624842470987,38.22952896670182,-119.65829346949835,38.22947615316025,-119.79473757241158,38.21799358859471,-119.99491475022586,38.196920114669126,-120.38613654232694,38.056378609678916,-121.15444382863438,37.62884831659255,-121.15500076925849,37.6284224540932,-121.15993039529252,37.62332076451776,-121.16822139007132,37.61386883849076,-121.17452907235321,37.605445134337174,-121.17462853797804,37.60522817287921,-121.17469632131127,37.60502320725453,-121.17471004943627,37.60496802808791,-121.17476593797784,37.604743358296616,-121.17472602131124,37.60443736142207,-121.1743974786034,37.603737121839856,-121.17385444318757,37.603213931215635,-121.12495024430518,37.575249448967384,-121.1206057318119,37.57340581772024,-121.1184699109819,37.573299354178744,-121.105517801627,37.57291785522102\",\n \"Visvalingam Polygon\": \"-119.65612154137676,38.229472830243594,-119.65887392887248,38.21611789588928,-119.68748882882807,38.20072575945488,-119.74423195478164,38.21583016359807,-119.79473757241158,38.21799358859471,-119.80777226405803,38.20387888444998,-119.83634931818034,38.19900379279085,-119.8794751608217,38.205164957364616,-119.92926093053609,38.1903575073876,-119.95874486382365,38.194300821964816,-119.9915583491894,38.18745202718378,-119.99491475022586,38.196920114669126,-120.05974666158357,38.15445730952666,-120.10528053234623,38.13442047414111,-120.12843912918527,38.10262073148215,-120.20521266552441,38.056065841971076,-120.26427926855774,38.061807551337154,-120.34283367885251,38.04442165553081,-120.36616220485797,38.05864021280041,-120.38138515275097,38.04379106074015,-120.39399451523144,38.00852514516987,-120.41557226103123,38.00413815246833,-120.4432863495299,37.97081393481176,-120.45616958284324,37.92842260675252,-120.46878266719864,37.921885701554345,-120.4624829120001,37.891430354726594,-120.479954646348,37.871879250590325,-120.48053337030541,37.82415609128935,-120.5431307066666,37.84913992354228,-120.55227857644405,37.86382160997783,-120.57047251079081,37.845455260006304,-120.5664340514221,37.82240133087544,-120.59755003054045,37.81161053401718,-120.64595511379866,37.78181727677179,-120.67580313979397,37.7973594465393,-120.7399643115694,37.77691864136273,-120.75337800946522,37.73604807163446,-120.78855502295232,37.75464512473059,-120.82306428227372,37.739964848711736,-120.82298294894053,37.72367104352867,-120.84114918537068,37.706087340431,-120.8673865186633,37.69917305085835,-120.87598703427494,37.68470263317249,-120.91724289983591,37.65975447800287,-120.94840845082916,37.657548763422994,-121.0014800642885,37.642007069697115,-121.06141474752877,37.632796530128076,-121.15500076925849,37.6284224540932,-121.17472602131124,37.60443736142207,-121.15475178384224,37.60555392496201,-121.12649717971942,37.5761612791743,-121.105517801627,37.57291785522102,-121.06195388086127,37.58432554999496,-121.051833277752,37.59549621664428,-120.9623811789325,37.616090631195675,-120.93801052688701,37.61182627286894,-120.86057590200721,37.62129079368759,-120.85730386034561,37.613155902033554,-120.78087282192257,37.61414406661538,-120.73817309594716,37.63053679471494,-120.70606299078867,37.6253131207647,-120.65312547628753,37.630845649922776,-120.64372085026048,37.617530275985075,-120.59897548366325,37.61838293640045,-120.58566304618392,37.6280897895104,-120.55437374519079,37.61949203744041,-120.53035751501977,37.62416281034979,-120.52267756711501,37.58373637916253,-120.47482846302262,37.59087335206817,-120.45815308909016,37.620518593688814,-120.4371221932895,37.63718915616295,-120.3849402642038,37.635048797832894,-120.3755883360933,37.65339462697108,-120.39417890064777,37.66818361028146,-120.392313883984,37.68359100504921,-120.3559603048738,37.67552716860342,-120.32610607262848,37.648966585311314,-120.30639988828403,37.66573735924362,-120.3455439350983,37.72512544352645,-120.31539807993676,37.733894229971156,-120.28665821956469,37.72927809560332,-120.28245683519623,37.74541342682829,-120.26069274460497,37.73358365601331,-120.25387803732389,37.749232223697334,-120.200135472824,37.76372567054983,-120.17357968640687,37.79608365070794,-120.12741327606187,37.78170633927192,-120.08906888341306,37.81273366005712,-120.07891344384547,37.82866939649068,-120.05533048450707,37.812757440265386,-120.02518823247055,37.81132716005931,-119.96359235131615,37.78073240906514,-119.94507216905322,37.76542058617224,-119.90693944932076,37.75781682576735,-119.86549272230178,37.77222938512,-119.85359450461186,37.758767389307536,-119.83160174943771,37.76963435595735,-119.80589665676928,37.75608133722835,-119.75060675164673,37.77341942574316,-119.7359645225028,37.78635874968137,-119.6978660861036,37.78960109342637,-119.64907657576265,37.81516770484501,-119.65722697262504,37.83230492565173,-119.59708603105173,37.86135878810666,-119.58892104668939,37.88872669535584,-119.57247042275657,37.8998297015886,-119.53527651760601,37.90190377762701,-119.49696578120711,37.86409281310239,-119.47533168332404,37.85892923602705,-119.45447817606475,37.871394138091034,-119.44539026566218,37.858937875610366,-119.4045319969756,37.85021429541558,-119.40293857510306,37.833821247524384,-119.37314428244099,37.83849664855876,-119.35155096789117,37.82452854545545,-119.3552763335104,37.812805713182,-119.32340220126821,37.79368655279501,-119.29229722319144,37.762878678884476,-119.2876598648653,37.74535544245333,-119.26052065344913,37.74159433725089,-119.24428567430766,37.76834668616766,-119.22055414726117,37.77924966531742,-119.20108320354137,37.801137019450096,-119.21738830351609,37.8183151860901,-119.20449054936944,37.82981189961396,-119.21625690560114,37.847411426669964,-119.21512584414461,37.87042564434256,-119.19927543166921,37.88483115890352,-119.23787860140095,37.911280908862466,-119.26486444510903,37.91263911719369,-119.26807310656238,37.92880876300194,-119.30948290962311,37.94616478068332,-119.31574230232172,37.96621302648555,-119.30533157629623,38.02416955035392,-119.34927245018639,38.08565116171684,-119.35845034913046,38.08266815651314,-119.39810467927725,38.1068175096006,-119.43127595110076,38.11332130542388,-119.4403859021283,38.09636985024184,-119.46399499479998,38.09838383773871,-119.4692413104168,38.12798441894279,-119.48819819267908,38.132729004352086,-119.50246159786525,38.159339980352456,-119.50459633952858,38.140964939755975,-119.54763344883679,38.14419101891764,-119.54624260196397,38.15397065015242,-119.5773162810824,38.15780512931315,-119.57980050712018,38.17791634178195,-119.62908996641869,38.196015076128845,-119.62508146642494,38.22905559795254,-119.65612154137676,38.229472830243594\",\n \"Region Name\": \"Upper Tuolumne\"\n }\n }\n}" + }, + { + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#visualization", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#visualization", + "title": "Search by HUC Example", + "section": "Visualization", + "text": "Visualization\nWe can take that response and pass it to the visualize() function created above. The pink polygon is Bounding Box, the green is Convex Hull Polygon and the purple color is Visvalingam Polygon\n\n#visualize FTS response\nvisualize(response)" + }, + { + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-bounding-box", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-bounding-box", + "title": "Search by HUC Example", + "section": "Query Data by Bounding Box", + "text": "Query Data by Bounding Box\nWe can use results obtained from the FTS to then directly and automatically query on data using the earthaccess Python library. We use the bounding box representing Upper Tuolumne River Basin extracted from the response above, and search for granules available from the SWOT mission, as an example.\n\nshortname = 'SWOT_L2_HR_Raster_2.0' # SWOT Raster files\nHUC = \"18040009\"\n\n# Obtain bounding box from response\nbbox = response['results'][HUC]['Bounding Box']\nbbox_vals = []\nfor val in bbox.split(','): bbox_vals.append(float(val)) #transform string into values\n\n# Query data by bounding box\nresults = earthaccess.search_data(short_name=shortname, bounding_box=(bbox_vals[0],bbox_vals[1],bbox_vals[2],bbox_vals[3]))\n\nGranules found: 84" + }, + { + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-polygon", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#query-data-by-polygon", + "title": "Search by HUC Example", + "section": "Query Data by Polygon", + "text": "Query Data by Polygon\nInstead of querying via bounding box from the FTS response, we can extract the polygon of the region and use this to query.\n\nshortname = 'SWOT_L2_HR_Raster_2.0' # SWOT Raster files\nHUC = \"18040009\"\n\n#obtain polygon from response\npolygon_v = response['results'][HUC]['Visvalingam Polygon']\n\n#transform string into list of values\npolygon_vals = []\nfor val in polygon_v.split(','): polygon_vals.append(float(val)) \n#change list to correct tuple format to input into earthaccess query\nit = iter(polygon_vals)\npoly = [(x, next(it)) for x in it]\n\n# Query by polygon\nresults = earthaccess.search_data(short_name=shortname, polygon=poly)\n\nGranules found: 70" + }, + { + "objectID": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#check-with-earthdata-search", + "href": "notebooks/HUC Feature Translation Service Examples-updated-20210804.html#check-with-earthdata-search", + "title": "Search by HUC Example", + "section": "Check with Earthdata Search", + "text": "Check with Earthdata Search\nTo find granules in Earthdata Search, we need to first search for the collection. You can search for ‘SWOT L2 Raster 2.0’ in the top left corner to find the Soil Mositure dataset. Earthdata allows you to do an Advanced seach over a HUC region. You can search by HUC ID or HUC region. In our case, let’s search for “HUC Region” and “Upper Tuolumne” .\n\n\n\nAdvanced Search\n\n\nFinally, we can locate the total number of granules from the search which matches with the one we identified.\nAlso, our search in Earth Data has a unique url with a project ID. This url corresponds to SWOT Raster granules within the Upper Tuolumne:\nhttps://search.earthdata.nasa.gov/search/granules?projectId=3520324655\n\n\n\nEarthdata Granules" + }, + { + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#summary", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#summary", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "Summary", + "text": "Summary\nA previous notebook covered basic use of Dask for parallel computing with Earthdata. This included the case where we have a function we wish to replicate over many files, represented by the schematic below.\n\nIn the previous notebook, a toy example was used to demonstrate this basic functionality using a local cluster and dask.delayed(). In this notebook, the workflow is used on a more complex analysis.\nThe analysis will generate global maps of spatial correlation between sea surface temperature (SST) and sea surface height (SSH). The analysis uses PO.DAAC hosted, gridded SSH and SST data sets:\n\nMEaSUREs gridded SSH Version 2205: 0.17° x 0.17° resolution, global map, one file per 5-days, https://doi.org/10.5067/SLREF-CDRV3\nGHRSST Level 4 MW_OI Global Foundation SST, V5.0: 0.25° x 0.25° resolution, global map, daily files, https://doi.org/10.5067/GHMWO-4FR05\n\nThe time period of overlap between these data sets is 1998 – 2020, with 1808 days in total overlapping. For each pair of SST, SSH files on these days, compute a map of spatial correlation between them, where the following method is used at each gridpoint:\n\nThis notebook will first define the functions to read in the data and perform the computations, then test them on a single file. Next a smaller parallel computation will be performed on all pairs of files in 2018 (73 pairs in total), reducing what would have otherwise taken hours to minutes instead. Finally, the last section presents the code used to perform the full computation on all 1808 pairs of files at 0.25 degree resolution.", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#request-po.daac-s3-credentials", - "href": "external/SWOT_to_kerchunk.html#request-po.daac-s3-credentials", - "title": "Kerchunk JSON Generation", - "section": "Request PO.DAAC s3 credentials", - "text": "Request PO.DAAC s3 credentials\n\n%%time\ncollection = \"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1\"\nurl = \"https://archive.podaac.earthdata.nasa.gov/s3credentials\"\ncreds = requests.get(url).json()\n\nCPU times: user 205 ms, sys: 31.1 ms, total: 236 ms\nWall time: 4.98 s", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#requirements-prerequisite-knowledge-learning-outcomes", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "Requirements, prerequisite knowledge, learning outcomes", + "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCompute environment: This notebook can technically be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server). However, running in the cloud is recommended, since it is unlikely that a laptop has the power to replicate the compute times we quote here. If running in a local environment, the number of workers spun up Section 4 will likely need to be decreased.\nVM type: For running in AWS (recommended), we used C7i instances, which are “compute-optimized” VM’s well-suited to the particular computations performed here (more on this later). Since the cost per hour of these instances go up in size, we recommend the following workflow to explore this notebook.\n\nStart by running Sections 1 - 3 in a low cost c7i.2xlarge instance (fractions of a $1 per hour).\nParallel computations start in Section 4. For this, we ran Sections 1-4 with a c7i.24xlarge. At the time this notebook was written, this VM type took 7-10 minutes to run the computations, and cost ~$4/hr. You can run a smaller, less expensive VM type, but will need to change one line of code in Section 4.\nFor Optional Section 5, we ran using a c7i.24xlarge, although you could try running it with a c7i.48xlarge (double the vCPUs and double the cost).\n\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use dask.delayed() with a local cluster on an analysis mirroring what someone might want to do in a real-world setting. As such, you will get better insight on how to apply this workflow to your own analysis. Further, this notebook touches briefly on choosing VM types, which may be many user’s first introduction to the topic.", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#option-1-get-list-of-remote-netcdf-files-by-collection-s3-endpoints", - "href": "external/SWOT_to_kerchunk.html#option-1-get-list-of-remote-netcdf-files-by-collection-s3-endpoints", - "title": "Kerchunk JSON Generation", - "section": "Option 1: Get list of remote netCDF files by collection (s3 endpoints)", - "text": "Option 1: Get list of remote netCDF files by collection (s3 endpoints)\n\n%%time\ns3 = s3fs.S3FileSystem(anon=False, key=creds[\"accessKeyId\"], secret=creds[\"secretAccessKey\"], token=creds[\"sessionToken\"])\ns3path = f\"s3://podaac-ops-cumulus-protected/{collection}/*.nc\"\nremote_urls = s3.glob(s3path)\nremote_urls = ['s3://' + f for f in remote_urls]\nprint(len(remote_urls))\n\n17564\nCPU times: user 6.94 s, sys: 214 ms, total: 7.15 s\nWall time: 9.96 s", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#import-packages", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#import-packages", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "Import packages", + "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.0 earthaccess==0.9.0 matplotlib==3.8.0 jupyterlab\nor with conda:\nconda install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.0 earthaccess==0.9.0 matplotlib==3.8.0 jupyterlab\nNote that the versions are important, specifially for the science / math packages - when running newer versions of xarray, scipy, and numpy, we got some strange results.\n\n# Built in packages\nimport time\nimport sys\nimport os\nimport shutil\n\n# Math / science packages\nimport xarray as xr\nimport numpy as np\nfrom scipy.optimize import leastsq\n\n# Plotting packages\nfrom matplotlib import pylab as plt\n%matplotlib inline\n\n# Cloud / parallel computing packages\nimport earthaccess\nimport dask\nfrom dask.distributed import Client\nfrom dask import delayed\nimport dask.array as da\nimport multiprocessing", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#option-2-find-and-filter-s3-urls-using-nasa-cmr-search", - "href": "external/SWOT_to_kerchunk.html#option-2-find-and-filter-s3-urls-using-nasa-cmr-search", - "title": "Kerchunk JSON Generation", - "section": "Option 2: Find and filter s3 urls using NASA CMR Search", - "text": "Option 2: Find and filter s3 urls using NASA CMR Search\n\nIf you would like a certain cycle number, datetime, etc. You can choose the granules to cloud optimize using the powerful CMR search tool\nNASA CMR API Documentiation\nPO.DAAC Cookbook CMR Tutorial", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#define-functions", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#define-functions", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "1. Define functions", + "text": "1. Define functions\nThe main function implemented is spatial_corrmap(), which will return the map of correlations as a 2D array. The other functions below are called by spatial_corrmap().\n\ndef load_sst_ssh(gran_ssh, gran_sst):\n \"\"\"\n Return SLA and SST variables for a single file each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections, respectively, returned as xarray.DataArray's. Input args are granule info \n (earthaccess.results.DataGranule object's) for each collection. \n \"\"\"\n earthaccess.login(strategy=\"environment\") # Confirm credentials are current\n \n # Get SLA and SST variables, loaded fully into local memory:\n ssh = xr.load_dataset(earthaccess.open([gran_ssh], provider='POCLOUD')[0])['SLA'][0,...]\n sst = xr.load_dataset(earthaccess.open([gran_sst], provider='POCLOUD')[0])['analysed_sst'][0,...]\n\n return ssh, sst\n\n\ndef spatialcorr(x, y, p1, p2):\n \"\"\"\n Correlation between two 2D variables p1(x, y), p2(x, y), over the domain (x, y). Correlation is \n computed between the anomalies of p1, p2, where anomalies for each variables are the deviations \n from respective linear 2D surface fits.\n \"\"\"\n # Compute anomalies:\n ssha, _ = anomalies_2Dsurf(x, y, p1) # See function further down.\n ssta, _ = anomalies_2Dsurf(x, y, p2)\n \n # Compute correlation coefficient:\n a, b = ssta.flatten(), ssha.flatten()\n if ( np.nansum(abs(a))==0 ) or ( np.nansum(abs(b))==0 ): \n # For cases with all 0's, the correlation should be 0. Numpy computes this correctly \n # but throws a lot of warnings. So instead, manually append 0.\n return 0\n else:\n return np.nanmean(a*b)/np.sqrt(np.nanvar(a) * np.nanvar(b))\n\n\ndef anomalies_2Dsurf(x, y, p):\n \"\"\"\n Return anomalies for a 2D variable. Anomalies are computed as the deviations of each \n point from a bi-linear 2D surface fit to the data (using scipy).\n \n Inputs\n ------\n x, y: 1D array-like.\n Independent vars (likely the lon, lat coordinates).\n p: 2D array-like, of shape (len(y), len(x)).\n Dependent variable. 2D surface fit will be to p(x, y).\n \n Returns\n ------\n va, vm: 2D NumPy arrays\n Anomalies (va) and mean surface fit (vm).\n \"\"\"\n # Function for a 2D surface:\n def surface(c,x0,y0): # Takes independent vars and poly coefficients\n a,b,c=c\n return a + b*x0 + c*y0\n # Function for the difference between data and the computed surface:\n def err(c,x0,y0,p): # Takes independent/dependent vars and poly coefficients\n a,b,c=c\n return p - (a + b*x0 + c*y0 )\n\n\n # Prep arrays and remove NAN's:\n xx, yy = np.meshgrid(x, y)\n xf, yf, pf = xx.flatten(), yy.flatten(), p.flatten()\n msk=~np.isnan(pf)\n xf, yf, pf = xf[msk], yf[msk], pf[msk]\n\n \n # Initial values of polynomial coefficients to start fitting algorithm off with:\n dpdx=(pf.max()-pf.min())/(xf.max()-xf.min())\n dpdy=(pf.max()-pf.min())/(yf.max()-yf.min())\n c = [pf.mean(),dpdx,dpdy]\n\n \n # Fit and compute anomalies:\n coef = leastsq(err,c,args=(xf,yf,pf))[0]\n vm = surface(coef, xx, yy) # mean surface\n va = p - vm # anomalies\n return va, vm\n\n\ndef spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Get a 2D map of SSH-SST spatial correlation coefficients, for one each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections. At each gridpoint, the spatial correlation is computed over a lat, lon window of \n size 2*lat_halfwin x 2*lon_halfwin. Correlation is computed from the SSH, SST anomalies, \n which are computed in turn as the deviations from a fitted 2D surface over the window.\n \n Inputs\n ------\n grans: 2-tuple of earthaccess.results.DataGranule objects\n Metadata for the SSH, SST files. These objects contain https and S3 locations.\n lat_halfwin, lon_halfwin: floats\n Half window size in degrees for latitude and longitude dimensions, respectively.\n lats, lons: None or 1D array-like\n Latitude, longitude gridpoints at which to compute the correlations. \n If None, will use the SSH grid.\n f_notnull: float between 0-1 (default = 0.5)\n Threshold fraction of non-NAN values in a window, otherwise the correlation is not computed, \n and NAN is returned for that grid point. For edge cases, 'ghost' elements are counted.\n\n Returns\n ------\n coef: 2D numpy array\n Spatial correlation coefficients.\n \n lats, lons: 1D numpy arrays.\n Latitudes and longitudes creating the 2D grid that 'coef' was calculated on.\n \"\"\" \n # Load datafiles, convert SST longitude to (0,360), and interpolate SST to SSH grid: \n ssh, sst = load_sst_ssh(*grans)\n sst = sst.roll(lon=len(sst['lon'])//2)\n sst['lon'] = sst['lon']+180\n sst = sst.interp(lon=ssh['Longitude'], lat=ssh['Latitude'])\n\n \n # Compute windows size and threshold number of non-nan points:\n dlat = (ssh['Latitude'][1]-ssh['Latitude'][0]).item()\n dlon = (ssh['Longitude'][1]-ssh['Longitude'][0]).item()\n nx_win = 2*round(lon_halfwin/dlon)\n ny_win = 2*round(lat_halfwin/dlat)\n n_thresh = nx_win*ny_win*f_notnull\n\n\n # Some prep work for efficient identification of windows where number of non-nan's < threshold:\n # Map of booleans for sst*ssh==np.nan\n notnul = (sst*ssh).notnull() \n # Combine map and sst, ssh data into single Dataset for more efficient indexing:\n notnul = notnul.rename(\"notnul\") # Needs a name to merge\n mergeddata = xr.merge([ssh, sst, notnul], compat=\"equals\")\n \n\n # Compute spatial correlations over whole map:\n coef = []\n \n if lats is None:\n lats = ssh['Latitude'].data\n lons = ssh['Longitude'].data\n \n for lat_cen in lats:\n for lon_cen in lons:\n\n # Create window for both sst and ssh with xr.sel:\n lat_bottom = lat_cen - lat_halfwin\n lat_top = lat_cen + lat_halfwin\n lon_left = lon_cen - lon_halfwin\n lon_right = lon_cen + lon_halfwin\n data_win = mergeddata.sel(\n Longitude=slice(lon_left, lon_right), \n Latitude=slice(lat_bottom, lat_top)\n )\n \n # If number of non-nan values in window is less than threshold \n # value, append np.nan, else compute correlation coefficient:\n n_notnul = data_win[\"notnul\"].sum().item()\n if n_notnul < n_thresh:\n coef.append(np.nan)\n else:\n c = spatialcorr(\n data_win['Longitude'], data_win['Latitude'], \n data_win['SLA'].data, data_win['analysed_sst'].data\n )\n coef.append(c)\n \n return np.array(coef).reshape((len(lats), len(lons))), np.array(lats), np.array(lons)", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#open-files-with-s3fs", - "href": "external/SWOT_to_kerchunk.html#open-files-with-s3fs", - "title": "Kerchunk JSON Generation", - "section": "Open files with s3fs", - "text": "Open files with s3fs\n\n%%time\nremote_files = [s3.open(file) for file in tqdm(remote_urls)]\n\n ## Large amount of s3 netCDF’s to individual JSON’s (dask) - The PODAAC SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1 collection has 17564 granules! - Recommended to test with a smaller dataset such as remote_files[:20] - Single threaded - 625 granules = ~25 mins - 13680 granules = ~540 mins - 4 threads/workers - 625 granules = ~8 mins - 13680 granules = ~180 mins\n\ndef remaining_jsons(remote_urls: list, directory: str):\n \"\"\"\n Find set difference between remote_urls and JSONS already made in directory.\n Extracts granule name from remote url path and JSON file name\n \"\"\"\n # Extract granule names from s3 endpoints list and jsons list\n remote_granules = np.asarray([path.split('/')[-1] for path in remote_urls])\n done_granules = np.asarray([path[:-5] for path in os.listdir(directory)])\n # Find remaining files (set difference: s3 endpoints - json directory)\n remaining_indices = np.where(~np.isin(remote_granules, done_granules))[0]\n new_remote_urls = [remote_urls[idx] for idx in remaining_indices]\n print(f\"{len(remote_urls)}/{len(new_remote_urls)} files already done\")\n return remote_urls\n\n\n%%time\nout_dir = f\"{collection}_kerchunk_DEMO\"\nif not os.path.exists(out_dir):\n os.makedirs(out_dir)\n\n# If session expired, only re-run on remote_urls we don't have a JSON for\nremaining_urls = remaining_jsons(remote_urls, f\"{collection}_kerchunk_DEMO\")\n \n@dask.delayed\ndef gen_json(u: str):\n \"Generate JSON reference file for one netCDF\"\n with fsspec.open(u, mode=\"rb\", anon=False, key=creds['accessKeyId'], secret=creds['secretAccessKey'], token=creds[\"sessionToken\"]) as inf:\n single = SingleHdf5ToZarr(inf, u, inline_threshold=0)\n # Extract granule name from s3 URL\n granule = re.search(r'[^/]+$', u).group(0)\n full_filename = f'{out_dir}/{granule}.json'\n # Generate single kerchunk reference\n s = single.translate()\n if len(s) == 0:\n warnings.warn(f\"{granule} JSON generation failed\")\n # Write JSON to folder\n with open(full_filename, 'w') as f:\n ujson.dump(s, f)\n return full_filename\n \n# Define delayed list of jsons \njsons = [dask.delayed(gen_json)(file) for file in remaining_urls]\n\n# Run kerchunk single netcdf to JSON conversion in parallel\nfull_filenames = dask.compute(jsons)\n\n1066/1368 files remaining\nCPU times: user 3min 33s, sys: 22.4 s, total: 3min 55s\nWall time: 19min 36s", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "2. Get all matching pairs of SSH, SST files for 2018", + "text": "2. Get all matching pairs of SSH, SST files for 2018\nThe spatial_corrmap() function takes as one of its arguments a 2-tuple of earthaccess.results.DataGranule objects, one each for SSH and SST (recall that these are the objects returned from a call to earthaccess.search_data()). This section will retrieve pairs of these objects for all SSH, SST data in 2018 on days where the data sets overlap.\n\nearthaccess.login()\n\n\n## Granule info for all files in 2018:\ndt2018 = (\"2018-01-01\", \"2018-12-31\")\ngrans_ssh = earthaccess.search_data(\n short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\", \n temporal=dt2018\n )\ngrans_sst = earthaccess.search_data(\n short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\", \n temporal=dt2018\n )\n\nGranules found: 73\nGranules found: 365\n\n\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\nprint(' SSH file days: ', dates_ssh[:8], '\\n', 'SST file days: ', dates_sst[:8])\n\n SSH file days: ['20180102', '20180107', '20180112', '20180117', '20180122', '20180127', '20180201', '20180206'] \n SST file days: ['20180101', '20180102', '20180103', '20180104', '20180105', '20180106', '20180107', '20180108']\n\n\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nThe result is two lists of earthaccess.results.DataGranule objects, where the ith element of the SSH, SST lists contain granule info for the respective data sets on the same day:\n\nprint(grans_ssh_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_ssh_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_ssh_analyze[:4]])\nprint(grans_sst_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_sst_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_sst_analyze[:4]])\n\nSEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']\nMW_OI-REMSS-L4-GLOB-v5.0 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#create-combined-kerchunk", - "href": "external/SWOT_to_kerchunk.html#create-combined-kerchunk", - "title": "Kerchunk JSON Generation", - "section": "Create combined kerchunk", - "text": "Create combined kerchunk\n\n%%time\nout_dir = f\"{collection}_kerchunk_DEMO\"\njson_files = os.listdir(out_dir)\njson_files = [f\"{out_dir}/{f}\" for f in json_files if f.endswith(\".json\")]\nmzz = MultiZarrToZarr(json_files,\n remote_protocol='s3',\n remote_options={\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]},\n coo_map={\"cycle_num\": \"attr:cycle_number\", \"pass_num\": \"attr:pass_number\"},\n concat_dims=[\"cycle_num\", \"pass_num\"]\n)\n\nout = mzz.translate()\n\nCPU times: user 1min 50s, sys: 14.3 s, total: 2min 4s\nWall time: 15min 47s\n\n\nThe args passed to SingleHdf5ToZarr and MultiZarrToZarr define how the data is read and concatenated. These parameters will need to be modified depending on how you want to concat the datasets (time, cycles). The documentation for those functions is linked above. Linked in this cell is more resources for understanding and how to use Kerchunk.\n\n%%time\njson_file = f'{collection}_kerchunk_DEMO.json'\nwith open(json_file, 'wb') as f:\n f.write(ujson.dumps(out).encode())\n\nCPU times: user 141 ms, sys: 44.4 ms, total: 185 ms\nWall time: 181 ms", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "3. Test the computation on a pair of files, output on a coarse resolution grid", + "text": "3. Test the computation on a pair of files, output on a coarse resolution grid\nTo verify the functions work, test them on the first pair of files. To reduce computation time, we compute them for a 2 degree x 2 degree output grid for now.\n\n# Compute spatial correlation map for 2 degree x 2 degree resolution and time it:\nt1 = time.time()\n\nlats = np.arange(-80, 80, 2)\nlons = np.arange(0, 359, 2)\ncoef, lats, lons = spatial_corrmap((grans_ssh_analyze[0], grans_sst_analyze[0]), 3, 3, lats=lats, lons=lons, f_notnull=0.5)\n\nt2 = time.time()\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds.\")\n\nOpening 1 granules, approx size: 0.01 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nOpening 1 granules, approx size: 0.0 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\nTotal computation time = 21.34 seconds.\n\n\n\n## Plot the results:\nplt.figure(figsize=(8,3))\nplt.contourf(lons, lats, coef, cmap='RdBu_r')\nplt.colorbar()\n\n\n\n\n\n\n\n\n\nEstimation of computation time for higher resolution output and more files\nThe computation for one file computed on a 2 x 2 degree grid takes:\n\nprint(str(comptime) + \" seconds.\")\n\n18.88 seconds.\n\n\nthen assuming linear scaling with number of gridpoints (reasonable since our top level function is a big for-loop), processing one file at 0.5 x 0.5 degree resolution would take:\n\neta_fullres_seconds = comptime*(2/0.5)*(2/0.5)\neta_fullres_minutes = round(eta_fullres_seconds/60)\nprint(str(eta_fullres_minutes) + \" minutes.\")\n\n5 minutes.\n\n\nand for the record over all of 2018 would take:\n\neta_allfiles_hrs = round( (len(grans_ssh)*eta_fullres_minutes)/60, 1 )\neta_allfiles_days = round(eta_allfiles_hrs/24, 2)\nprint(str(len(grans_ssh)) + \" granules for 2018.\")\nprint(str(eta_allfiles_hrs) + \" hours = \" + str(eta_allfiles_days) + \" days.\")\n\n73 granules for 2018.\n6.1 hours = 0.25 days.", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#check-by-opening-dataset", - "href": "external/SWOT_to_kerchunk.html#check-by-opening-dataset", - "title": "Kerchunk JSON Generation", - "section": "Check by opening dataset", - "text": "Check by opening dataset\n\ndata = xr.open_dataset(\n \"reference://\", engine=\"zarr\", chunks={}, decode_times=False,\n backend_kwargs={\n \"storage_options\": {\n \"fo\": f'{collection}_kerchunk_DEMO.json',\n \"remote_protocol\": \"s3\",\n \"remote_options\": {\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]}\n },\n \"consolidated\": False\n }\n)\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (cycle_num: 3, pass_num: 456,\n num_lines: 9866, num_pixels: 71,\n num_sides: 2)\nCoordinates:\n * cycle_num (cycle_num) float64 3.0 4.0 5.0\n latitude (cycle_num, pass_num, num_lines, num_pixels) float64 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n latitude_nadir (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n longitude (cycle_num, pass_num, num_lines, num_pixels) float64 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n longitude_nadir (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n * pass_num (pass_num) float64 1.0 2.0 ... 583.0\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/91)\n ancillary_surface_classification_flag (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n correction_flag (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n cross_track_angle (cycle_num, pass_num, num_lines) float64 dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>\n cross_track_distance (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n dac (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n depth_or_elevation (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n ... ...\n wind_speed_karin (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_karin_2 (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_model_u (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_model_v (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\n wind_speed_rad (cycle_num, pass_num, num_lines, num_sides) float32 dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>\n x_factor (cycle_num, pass_num, num_lines, num_pixels) float32 dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>\nAttributes: (12/32)\n Conventions: CF-1.7\n contact: CNES aviso@altimetry.fr, JPL podaac@podaac.jp...\n cycle_number: 5\n ellipsoid_flattening: 0.003352810664781205\n ellipsoid_semi_major_axis: 6378137.0\n equator_longitude: 206.06188772087626\n ... ...\n right_last_longitude: 289.6585533138908\n source: Simulate product\n time_coverage_end: 2014-07-24T10:18:18.533147Z\n time_coverage_start: 2014-07-24T09:26:52.109265Z\n title: Level 2 Low Rate Sea Surface Height Data Prod...\n wavelength: 0.008385803020979xarray.DatasetDimensions:cycle_num: 3pass_num: 456num_lines: 9866num_pixels: 71num_sides: 2Coordinates: (6)cycle_num(cycle_num)float643.0 4.0 5.0array([3., 4., 5.])latitude(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlatitude_nadir(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nlongitude(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Longitude of measurement. East longitude relative to Greenwich meridian.long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlongitude_nadir(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\npass_num(pass_num)float641.0 2.0 3.0 ... 579.0 580.0 583.0array([ 1., 2., 3., ..., 579., 580., 583.])Data variables: (91)ancillary_surface_classification_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.flag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0, 1, 2, 3, 4, 5, 6]institution :European Space Agencylong_name :surface classificationsource :MODIS/GlobCoverstandard_name :status_flagvalid_max :6valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ncorrection_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for corrections.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for correctionsstandard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ncross_track_angle(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.long_name :cross-track angle from true northunits :degreesvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\ncross_track_distance(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.long_name :cross track distanceunits :mvalid_max :75000.0valid_min :-75000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndac(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.institution :LEGOS/CNES/CLSlong_name :dynamic atmospheric correctionsource :MOG2Dunits :mvalid_max :12000valid_min :-12000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndepth_or_elevation(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.institution :European Space Agencylong_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2units :mvalid_max :10000valid_min :-12000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndistance_to_coast(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Approximate distance to the nearest coast point along the Earth surface.institution :European Space Agencylong_name :distance to coastsource :MODIS/GlobCoverunits :mvalid_max :21000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ndoppler_centroid(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.long_name :doppler centroid estimated by KaRInunits :1/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\ndynamic_ice_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Dynamic ice flag for the location of the KaRIn measurement.flag_meanings :no_ice probable_ice iceflag_values :[0, 1, 2]institution :EUMETSATlong_name :dynamic ice flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilitystandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ngeoid(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).long_name :geoid heightsource :EGM2008 (Pavlis et al., 2012)standard_name :geoid_height_above_reference_ellipsoidunits :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nheading_to_coast(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.long_name :heading to coastunits :degreesvalid_max :35999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nheight_cor_xover(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height correction from KaRIn crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.long_name :height correction from KaRIn crossoversunits :mvalid_max :100000valid_min :-100000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nice_conc(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Concentration of sea ice from model.institution :EUMETSATlong_name :concentration of sea icesource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilitystandard_name :sea_ice_area_fractionunits :%valid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninternal_tide_hret(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninternal_tide_sol2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Coherent internal tide.long_name :coherent internal tide (Model 2)source :TBDunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ninv_bar_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.long_name :static inverse barometer effect on sea surface heightunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\niono_cor_gim_ka(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.institution :JPLlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsunits :mvalid_max :0valid_min :-5000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlatitude_avg_ssh(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_max :80000000valid_min :-80000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nload_tide_fes(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).institution :LEGOS/CNESlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nload_tide_got(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).institution :GSFClong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nlongitude_avg_ssh(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_dynamic_topography(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean dynamic topography above the geoid.institution :CNES/CLSlong_name :mean dynamic topographysource :CNES_CLS_18units :mvalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_dynamic_topography_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean dynamic topography.institution :CNES/CLSlong_name :mean dynamic topography accuracysource :CNES_CLS_18units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_cnescls(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).institution :CNES/CLSlong_name :mean sea surface height (CNES/CLS)source :CNES_CLS_15units :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_cnescls_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).institution :CNES/CLSlong_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_15units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_dtu(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).institution :DTUlong_name :mean sea surface height (DTU)source :DTU18units :mvalid_max :1500000valid_min :-1500000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_sea_surface_dtu_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)institution :DTUlong_name :mean sea surface height accuracy (DTU)source :DTU18units :mvalid_max :10000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_wave_direction(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Mean sea surface wave direction.institution :Meteo Francelong_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)units :degreevalid_max :36000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmean_wave_period_t02(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface wind wave mean period from model spectral density second moment.institution :Meteo Francelong_name :sea surface wind wave mean periodsource :Meteo France Wave Model (MF-WAM)standard_name :sea_surface_wave_significant_periodunits :svalid_max :100valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmodel_dry_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.institution :ECMWFlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsunits :mvalid_max :-15000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nmodel_wet_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.institution :ECMWFlong_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsunits :mvalid_max :0valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nnum_pt_avg(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.long_name :number of samples averagedunits :1valid_max :289valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nobp_ref_surface(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.long_name :height of reference surface used by on-board-processorunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_eq(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).long_name :equilibrium long-period ocean tide heightunits :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_fes(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).institution :LEGOS/CNESlong_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)units :mvalid_max :300000valid_min :-300000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_got(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).institution :GSFClong_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)units :mvalid_max :300000valid_min :-300000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nocean_tide_non_eq(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.institution :LEGOS/CNESlong_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\norbit_alt_rate(cycle_num, pass_num, num_lines)float32dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Orbital altitude rate with respect to the mean sea surface.long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_max :3500valid_min :-3500\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.49 MiB\n38.54 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\norbit_qual(cycle_num, pass_num, num_lines)float32dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Orbit quality flag.long_name :orbit quality flag standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.49 MiB\n38.54 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nphase_bias_ref_surface(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.long_name :height of reference surface used for phase bias calculationunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\npolarization_karin(cycle_num, pass_num, num_lines, num_sides)objectdask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.long_name :polarization for each side of the KaRIn swath\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n205.94 MiB\n154.16 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nobject\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\npole_tide(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_max :2000valid_min :-2000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrad_cloud_liquid_water(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Integrated cloud liquid water content from radiometer measurements.long_name :liquid water content from radiometersource :Advanced Microwave Radiometerstandard_name :atmosphere_cloud_liquid_water_content units :kg/m^2valid_max :2000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_surface_type_flag(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.flag_meanings :open_ocean coastal_ocean landflag_values :[0, 1, 2]long_name :radiometer surface type flagsource :Advanced Microwave Radiometerstandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_187(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 18.7 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :25000valid_min :13000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_238(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 23.8 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :25000valid_min :13000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_tmb_340(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).long_name :radiometer main beam brightness temperature at 34.0 GHzsource :Advanced Microwave Radiometerstandard_name :toa_brightness_temperatureunits :Kvalid_max :28000valid_min :15000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_water_vapor(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Integrated water vapor content from radiometer measurements.long_name :water vapor content from radiometersource :Advanced Microwave Radiometerstandard_name :atmosphere_water_vapor_content units :kg/m^2valid_max :15000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nrad_wet_tropo_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mvalid_max :0valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrain_flag(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Flag indicates that signal is attenuated, probably from rain.flag_meanings :no_rain probable_rain rainflag_values :[0, 1, 2]long_name :rain flagstandard_name :status_flagvalid_max :2valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nrain_rate(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Rain rate from weather model.institution :ECMWFlong_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsunits :mm/hrvalid_max :200valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsc_altitude(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Altitude of the KMSF origin.long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mvalid_max :2000000000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_pitch(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_roll(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude roll angle; positive values move the +y antenna down.long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsc_yaw(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesvalid_max :1800000valid_min :-1799999\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nsea_state_bias_cor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea state bias correction to ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.long_name :sea state bias correction to heightsource :TBDunits :mvalid_max :0valid_min :-6000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsea_state_bias_cor_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea state bias correction to ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.long_name :sea state bias correction to heightsource :TBDunits :mvalid_max :0valid_min :-6000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_cor_atmos_model(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.institution :ECMWFlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsunits :1valid_max :10.0valid_min :1.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_cor_atmos_rad(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1valid_max :10.0valid_min :1.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1valid_max :10000000.0valid_min :-1000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1valid_max :10000000.0valid_min :-1000.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for sigma0 from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsig0_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on sigma0 from KaRIn.long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_max :1000.0valid_min :0.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_baseline_dilation(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to baseline mast dilationunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :KaRIn errorunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_orbital(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to orbital perturbationsunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_phase(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to phaseunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_roll(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Error due to rollunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_error_timing(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>long_name :Timing errorunits :m\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsimulated_true_ssh_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Height of the sea surface free of measurement errors.long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nsolid_earth_tide(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_max :10000valid_min :-10000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin_2(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mvalid_max :150000000valid_min :-15000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssh_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.long_name :sea surface height anomaly uncertaintyunits :mvalid_max :60000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.long_name :sea surface height anomalyunits :mvalid_max :1000000valid_min :-1000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin_2(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.long_name :sea surface height anomalyunits :mvalid_max :1000000valid_min :-1000000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nssha_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for the SSHA from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :sea surface height quality flagstandard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height from KaRIn volumetric correlation.long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin_qual(cycle_num, pass_num, num_lines, num_pixels)float64dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Quality flag for significant wave height from KaRIn.flag_meanings :good badflag_values :[0, 1]long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagvalid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n7.14 GiB\n5.34 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_karin_uncert(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :1-sigma uncertainty on significant wave height from KaRIn.long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_model(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height from model.institution :ECMWFlong_name :significant wave height from wave modelsource :European Centre for Medium-Range Weather Forecastsstandard_name :sea_surface_wave_significant_heightunits :mvalid_max :30000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nswh_sea_state_bias(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Significant wave height used in sea state bias correction.long_name :SWH used in sea state bias correctionunits :mvalid_max :25000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\ntime(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>calendar :gregoriancomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.leap_second :YYYY-MM-DDThh:mm:ssZlong_name :time in UTCstandard_name :timetai_utc_difference :35.0units :seconds since 2000-01-01 00:00:00.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\ntime_tai(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>calendar :gregoriancomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].long_name :time in TAIstandard_name :timetai_utc_difference :[Value of TAI-UTC at time of first record]units :seconds since 2000-01-01 00:00:00.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nvelocity_heading(cycle_num, pass_num, num_lines)float64dask.array<chunksize=(1, 1, 9866), meta=np.ndarray>comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesvalid_max :359999999valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866)\n(1, 1, 9866)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 456 3\n\n\n\n\nwind_speed_karin(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Wind speed from KaRIn computed from sig0_karin.long_name :wind speed from KaRIn source :TBDstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_karin_2(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Wind speed from KaRIn computed from sig0_karin_2.long_name :wind speed from KaRIn source :TBDstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_model_u(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Eastward component of the atmospheric model wind vector at 10 meters.institution :ECMWFlong_name :u component of model windsource :European Centre for Medium-Range Weather Forecastsstandard_name :eastward_windunits :m/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_model_v(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Northward component of the atmospheric model wind vector at 10 meters.institution :ECMWFlong_name :v component of model windsource :European Centre for Medium-Range Weather Forecastsstandard_name :northward_windunits :m/svalid_max :30000valid_min :-30000\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nwind_speed_rad(cycle_num, pass_num, num_lines, num_sides)float32dask.array<chunksize=(1, 1, 9866, 2), meta=np.ndarray>comment :Wind speed from radiometer measurements.long_name :wind speed from radiometersource :Advanced Microwave Radiometerstandard_name :wind_speedunits :m/svalid_max :65000valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n102.97 MiB\n77.08 kiB\n\n\nShape\n(3, 456, 9866, 2)\n(1, 1, 9866, 2)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 2 9866 456\n\n\n\n\nx_factor(cycle_num, pass_num, num_lines, num_pixels)float32dask.array<chunksize=(1, 1, 9866, 71), meta=np.ndarray>comment :Radiometric calibration X factor as a linear power ratio.long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_max :1.0000000200408773e+20valid_min :0.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.57 GiB\n2.67 MiB\n\n\nShape\n(3, 456, 9866, 71)\n(1, 1, 9866, 71)\n\n\nCount\n1369 Tasks\n1368 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3 1 71 9866 456\n\n\n\n\nAttributes: (32)Conventions :CF-1.7contact :CNES aviso@altimetry.fr, JPL podaac@podaac.jpl.nasa.govcycle_number :5ellipsoid_flattening :0.003352810664781205ellipsoid_semi_major_axis :6378137.0equator_longitude :206.06188772087626equator_time :2014-07-24T09:52:36.962185Zgeospatial_lat_max :78.29189230598696geospatial_lat_min :-78.29203183241484geospatial_lon_max :289.6585533138908geospatial_lon_min :122.7028213028531history :2021-09-10 10:00:06Z : Creationinstitution :CNES/JPLleft_first_latitude :-77.032982418125left_first_longitude :122.7028213028531left_last_latitude :78.29189230598696left_last_longitude :289.65746162390826orbit_solution :POEpass_number :545platform :SWOTproduct_version :1.1.0.dev33reference_document :D-56407_SWOT_Product_Description_L2_LR_SSHreferences :Gaultier, L., C. Ubelmann, and L.-L. Fu, 2016: The Challenge of Using Future SWOT Data for Oceanic Field Reconstruction. J. Atmos. Oceanic Technol., 33, 119-126, doi:10.1175/jtech-d-15-0160.1. http://dx.doi.org/10.1175/JTECH-D-15-0160.1.right_first_latitude :-78.29203183241484right_first_longitude :122.70935482261133right_last_latitude :77.03284214129418right_last_longitude :289.6585533138908source :Simulate producttime_coverage_end :2014-07-24T10:18:18.533147Ztime_coverage_start :2014-07-24T09:26:52.109265Ztitle :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Wavewavelength :0.008385803020979", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#parallel-computations-with-dask", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#parallel-computations-with-dask", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "4. Parallel computations with Dask", + "text": "4. Parallel computations with Dask\nSections 1 and 2 need to be run prior to this.\nThe previous section showed that analyzing a year’s worth of data at 0.5 x 0.5 degree output resolution would take hours. In this section, we use dask.delayed() and a local cluster to complete this task in 7 - 20 minutes, depending on the VM type used.\nFirst, define a wrapper function which calls spatial_corrmap() for a pair of SSH, SST files and saves the output to a netCDF file. We will parallelize this function rather than spatial_corrmap():\n\ndef corrmap_tofile(grans, dir_results=\"./\", lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and saves the results to a netCDF file.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n corrmap_da = xr.DataArray(\n data=coef, dims=[\"lat\", \"lon\"], \n coords=dict(lon=lons, lat=lats), \n name='corr_ssh_sst'\n )\n corrmap_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n return\n\nNext, some prep work:\n\n# All output will be saved to this local directory:\ndir_results = \"results/\"\nos.makedirs(dir_results, exist_ok=True)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80, 0.5)\nlons = np.arange(0, 359, 0.5)\n\nStart up the cluster. We used a c7i.24xlarge EC2 instance type, which has 96 vCPU’s, and therefore we are able to start up 73 workers. If you use a smaller instance type in the C7i series, change the n_workers arg as needed.\n\nclient = Client(n_workers=73, threads_per_worker=1)\nprint(client.cluster)\nprint(client.dashboard_link)\n\nThis block of code will give each worker our EDL credentials (even though we logged in with earthaccess() this is necessary to get creds to each worker):\n\ndef auth_env(auth): # this gets executed on each worker\n os.environ[\"EARTHDATA_USERNAME\"] = auth[\"EARTHDATA_USERNAME\"]\n os.environ[\"EARTHDATA_PASSWORD\"] = auth[\"EARTHDATA_PASSWORD\"]\n \n_ = client.run(auth_env, auth=earthaccess.auth_environ())\n\nthen setup the parallel computations and run! (At the time this notebook was written, earthaccess produces a lot of output each time a file is opened, and so the output from this cell is long):\n\nt1 = time.time()\n\n# Process granules in parallel using Dask:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\ncorrmap_tofile_parallel = delayed(corrmap_tofile)\ntasks = [\n corrmap_tofile_parallel(g2, dir_results=\"results/\", lats=lats, lons=lons, f_notnull=0.5) \n for g2 in grans_2tuples[:]\n ] # Sets up the computations (relatively quick)\n_ = da.compute(*tasks) # Performs the computations (takes most of the time)\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 451.97 seconds = 7.5328333333333335 minutes.\n\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 121, lat: 321, lon: 718)>\ndask.array<concatenate, shape=(121, 321, 718), dtype=float64, chunksize=(1, 321, 718), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.5 1.0 1.5 2.0 ... 356.5 357.0 357.5 358.0 358.5\n * lat (lat) float64 -80.0 -79.5 -79.0 -78.5 -78.0 ... 78.5 79.0 79.5 80.0\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 121lat: 321lon: 718dask.array<chunksize=(1, 321, 718), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n212.77 MiB\n1.76 MiB\n\n\nShape\n(121, 321, 718)\n(1, 321, 718)\n\n\nDask graph\n121 chunks in 666 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 718 321 121\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.5 1.0 ... 357.5 358.0 358.5array([ 0. , 0.5, 1. , ..., 357.5, 358. , 358.5])lat(lat)float64-80.0 -79.5 -79.0 ... 79.5 80.0array([-80. , -79.5, -79. , ..., 79. , 79.5, 80. ])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5,\n ...\n 354.0, 354.5, 355.0, 355.5, 356.0, 356.5, 357.0, 357.5, 358.0, 358.5],\n dtype='float64', name='lon', length=718))latPandasIndexPandasIndex(Index([-80.0, -79.5, -79.0, -78.5, -78.0, -77.5, -77.0, -76.5, -76.0, -75.5,\n ...\n 75.5, 76.0, 76.5, 77.0, 77.5, 78.0, 78.5, 79.0, 79.5, 80.0],\n dtype='float64', name='lat', length=321))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#alternate-large-amount-of-s3-netcdfs-to-combined-kerchunk-json-auto_dask", - "href": "external/SWOT_to_kerchunk.html#alternate-large-amount-of-s3-netcdfs-to-combined-kerchunk-json-auto_dask", - "title": "Kerchunk JSON Generation", - "section": "Alternate: Large amount of s3 netCDF’s to combined kerchunk JSON (auto_dask)", - "text": "Alternate: Large amount of s3 netCDF’s to combined kerchunk JSON (auto_dask)\n\n%%time\n# Create combined kerchunk/zarr reference. Reads cycle_number and pass_number from attributes of each netCDF\n# Concats along new dimensions cycle_number and pass_number\nout_dir = f\"{collection}_kerchunk_DEMO\"\njson_files = os.listdir(out_dir)\njson_files = [f\"{out_dir}/{f}\" for f in json_files if f.endswith(\".json\")]\nauto_dask(urls=json_files,\n n_batches=4,\n single_driver=JustLoad,\n single_kwargs={},\n mzz_kwargs={\"coo_map\": {\"cycle_num\": \"attr:cycle_number\", \"pass_num\": \"attr:pass_number\"}, \"concat_dims\": [\"cycle_num\", \"pass_num\"]},\n remote_protocol=\"s3\",\n remote_options={\"anon\": False, \"key\": creds['accessKeyId'], \"secret\": creds['secretAccessKey'], \"token\": creds[\"sessionToken\"]},\n filename=f'{collection}_kerchunk_CYCLE_3.json'\n )", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#other-notes", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#other-notes", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "Other notes", + "text": "Other notes\n\nWhy C7i instance types? Notice that the size of our data files are relatively small, about 10 MB per pair of files. Yet, the computations we perform on them are complex enough that it takes ~5-7 minutes per pair of files (and this is only at 0.5 degree output resolution, multiply this by 4x for the 0.25 degree resolution in Section 5!). This type of computation is referred to as “compute limited”, because the limiting factor in the time for completion is churning through the computation itself. Contrast this to e.g. a “memory limited” computation, where perhaps the computation is simple but the size of each file is large (an example would be taking the global average of a MUR 0.01 degree file). As per Amazon’s page describing the different classes of EC2 types, the C7i series are compute optimized, and therefore well suited to this problem. For a given amount of total memory in the VM, we get a lot of high performance processors, and each one can churn through the computations per pair of SST-SSH files. Please take this explanation with a grain of salt. The author is not a computer scientist and is learning these complex topics himself!", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules-faster-metadata-approach", - "href": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules-faster-metadata-approach", - "title": "Kerchunk JSON Generation", - "section": "Generate list of matching size granules (faster metadata approach)", - "text": "Generate list of matching size granules (faster metadata approach)\n\ns3 = s3fs.S3FileSystem(anon=False)\ns3path = 's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/*.dmrpp'\nremote_files = s3.glob(s3path)\nprint(len(remote_files))\n\n17564\n\n\nRead DMR++ metadata to get granule dimensions\n\nmatches = []\npbar = tqdm(remote_files, desc=\"Found 0 matches\")\nfor file in pbar:\n with s3.open(file, 'r') as f:\n xml_str: str = f.read()\n xml = ET.fromstring(xml_str)\n if xml[0].attrib['size'] == \"9866\" and xml[1].attrib['size'] == \"71\":\n matches.append(file)\n pbar.set_description(f\"Found {len(matches)} matches\")\n\n\nflist = ['s3://' + f.removesuffix(\".dmrpp\") for f in tqdm(matches)]\nprint(flist[0])\n\n\n\n\ns3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_paths.txt','w')\nfor item in tqdm(flist):\n file.write(item + \"\\n\")\nfile.close()", + "objectID": "notebooks/Advanced_cloud/dask_delayed_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", + "href": "notebooks/Advanced_cloud/dask_delayed_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", + "title": "Parallel Computing with Earthdata and Dask: An Example of Replicating a Function Over Many Files", + "section": "5. Optional: Parallel computation on full record at 0.25 degree resolution", + "text": "5. Optional: Parallel computation on full record at 0.25 degree resolution\nOnly Section 1 needs to be run prior to this. Sections 2-4 can be skipped.\nThis section mirrors the workflow of Section 4, but processes all 1808 pairs of files, spanning a little over two decades, at higher resolution. To get an estimate of how long this would take without parallel computing, you can re-run section 3 but replace a value of 0.5 for the higher_res variable with 0.25 (in the part where we estimate comp times). Trying this on a few machines, we get that it would take anywhere from 21 to 34 hours to process the record over a single year, which means for 22 years it would take 19 to 31 days to complete the entire record. When we used this code to run the computation in parallel on a c7i.24xlarge instance, computation took us instead ~10.5 hours and cost ~$45, obtaining the following mean map for the full record:\n\n\n\nimage.png\n\n\nFirst, we duplicate most of the code in Section 2, this time getting granule info objects for the entire record:\n\nearthaccess.login()\n\n## Granule info for all files in both collections:\ngrans_ssh = earthaccess.search_data(short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\")\ngrans_sst = earthaccess.search_data(short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\")\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nGranules found: 2207\nGranules found: 9039\n\n\nSame wrapper function as in section 4:\n\ndef corrmap_tofile(grans, dir_results=\"./\", lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and saves the results to a netCDF file.\n \"\"\"\n coef, lats, lons = spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=lats, lons=lons, f_notnull=0.5)\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n corrmap_da = xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n corrmap_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n return\n\nSome prep work:\n\n# Re-create the local directory to store results in:\ndir_results = \"results/\"\nif os.path.exists(dir_results) and os.path.isdir(dir_results):\n shutil.rmtree(dir_results)\nos.makedirs(dir_results)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80.1, 0.25)\nlons = np.arange(0, 360, 0.25)\n\nDefine function that will pass each worker our EDL credentials:\n\ndef auth_env(auth): # this gets executed on each worker\n os.environ[\"EARTHDATA_USERNAME\"] = auth[\"EARTHDATA_USERNAME\"]\n os.environ[\"EARTHDATA_PASSWORD\"] = auth[\"EARTHDATA_PASSWORD\"]\n\n\nSlightly altered method of setting up the parallel computations\nIn theory, we would like to have the simplest parallel workflow of: 1. Start up cluster 2. Map all of our file pairs to the cluster workers\nAnd in fact this is how we did it in Section 4. However, we found when processing the full record that as the workers complete more of the file pairs, the computation time for each pair is progressively longer. From the error messages, we think this may have something to do with memory usage and garbage collection. In short, a fraction of the VM memory is not released by each worker after they finish a pair of files, and our guess is this build up over 100’s of files has a performance impact.\nTo get around this, we use the follwing workflow: 1. Split the list of file-pairs into “batches” 2. In a for-loop: >* Start a new cluster >* Map a file-pairs for one of the batches to the cluster workers >* Close the cluster\nWhile less elegant, we find that is does keep the computation times more consistent throughout the 1808 file-pairs.\n\n## Nice to check how many CPU's are on this machine before setting worker number:\nprint(multiprocessing.cpu_count())\n\n96\n\n\n\n## Create list of integers which will be start/end indexes for each file batch:\nn_workers=96\nn_batches = int(np.ceil(len(grans_ssh_analyze)/n_workers))\ni_batches = [n_workers*i for i in (range(n_batches+1))]\n\nSetup parallel computations and run (At the time this notebook was written, earthaccess produces a lot of output each time a file is opened, and so the output from this cell is long):\n\nt1 = time.time()\n\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\n\ndask.config.set({\"distributed.admin.system-monitor.gil.enabled\": False}) # Adjust settings to suppress noisy output when closing cluster\nfor i in range(len(i_batches)-1):\n\n # Start new cluster and pass Earthdata Login creds to each worker:\n client = Client(n_workers=n_workers, threads_per_worker=1)\n print(client.cluster, '\\n', client.dashboard_link)\n _ = client.run(auth_env, auth=earthaccess.auth_environ()) \n \n # Process granules in parallel using Dask:\n corrmap_tofile_parallel = delayed(corrmap_tofile)\n tasks = [\n corrmap_tofile_parallel(g2, dir_results=\"results/\", lats=lats, lons=lons, f_notnull=0.5) \n for g2 in grans_2tuples[i_batches[i]:i_batches[i+1]]\n ] # Sets up the computations (relatively quick)\n _ = da.compute(*tasks) # Performs the computations (takes most of the time)\n\n # Close cluster:\n client.cluster.close()\n client.close()\n print(\"Time elapsed =\", str(round(time.time() - t1)/60), \"minutes.\")\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 37563.47 seconds = 626.0578333333334 minutes.\n\n\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 1808, lat: 641, lon: 1440)>\ndask.array<concatenate, shape=(1808, 641, 1440), dtype=float64, chunksize=(1, 641, 1440), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.25 0.5 0.75 1.0 ... 359.0 359.2 359.5 359.8\n * lat (lat) float64 -80.0 -79.75 -79.5 -79.25 ... 79.25 79.5 79.75 80.0\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 1808lat: 641lon: 1440dask.array<chunksize=(1, 641, 1440), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n12.43 GiB\n7.04 MiB\n\n\nShape\n(1808, 641, 1440)\n(1, 641, 1440)\n\n\nDask graph\n1808 chunks in 5425 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 1440 641 1808\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.25 0.5 ... 359.2 359.5 359.8array([0.0000e+00, 2.5000e-01, 5.0000e-01, ..., 3.5925e+02, 3.5950e+02,\n 3.5975e+02])lat(lat)float64-80.0 -79.75 -79.5 ... 79.75 80.0array([-80. , -79.75, -79.5 , ..., 79.5 , 79.75, 80. ])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0,\n 2.25,\n ...\n 357.5, 357.75, 358.0, 358.25, 358.5, 358.75, 359.0, 359.25, 359.5,\n 359.75],\n dtype='float64', name='lon', length=1440))latPandasIndexPandasIndex(Index([ -80.0, -79.75, -79.5, -79.25, -79.0, -78.75, -78.5, -78.25, -78.0,\n -77.75,\n ...\n 77.75, 78.0, 78.25, 78.5, 78.75, 79.0, 79.25, 79.5, 79.75,\n 80.0],\n dtype='float64', name='lat', length=641))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", "crumbs": [ "Advanced Cloud", - "Kerchunk" + "Dask and Coiled", + "Dask Function Replication Example" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#find-the-cycles-with-the-most-passes-size-9866-swath", - "href": "external/SWOT_to_kerchunk.html#find-the-cycles-with-the-most-passes-size-9866-swath", - "title": "Kerchunk JSON Generation", - "section": "Find the cycles with the most passes (size 9866 swath)", - "text": "Find the cycles with the most passes (size 9866 swath)\n\ncycles = {}\nz = glob.glob(\"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_kerchunk_CYCLE_3/*Expert_003_*\")\nlen(z)\n\n456\n\n\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_CYCLE_3.txt','w')\nfor item in tqdm(all_urls):\n file.write(\"%s\\n\" % item)", + "objectID": "notebooks/Advanced_cloud/basic_dask.html#import-packages", + "href": "notebooks/Advanced_cloud/basic_dask.html#import-packages", + "title": "Basics of Xarray with Dask Parallization for Earth Data", + "section": "Import packages", + "text": "Import packages\n\nimport time\n\nimport earthaccess\nimport xarray as xr\nimport numpy as np\n\nimport dask\nfrom dask.distributed import Client, LocalCluster\nfrom dask import delayed\nimport dask.array as da\n\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f3e8b374550>", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "GHRSST", + "MUR with Dask" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules", - "href": "external/SWOT_to_kerchunk.html#generate-list-of-matching-size-granules", - "title": "Kerchunk JSON Generation", - "section": "Generate list of matching size granules", - "text": "Generate list of matching size granules\n\ns3 = s3fs.S3FileSystem(anon=False)\ns3path = 's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/*.nc'\nremote_files = s3.glob(s3path)\nprint(len(remote_files))\n\n17564", + "objectID": "notebooks/Advanced_cloud/basic_dask.html#other-notes", + "href": "notebooks/Advanced_cloud/basic_dask.html#other-notes", + "title": "Basics of Xarray with Dask Parallization for Earth Data", + "section": "Other notes", + "text": "Other notes\n\nOne convenience of this parallelization method that it doesn’t require code to be restructured much (often times, not at all). E.g. as long as your code can be wrapped into a function, a few additional lines of code can be used to parallelize it.\nFor one’s own applications, figuring out how much memory their processing code requires for a single worker is important to determine how many workers can be spun up with a particular EC2 instance.\nThe authors found that for local clusters, Dask seems to not manage memory optimally. For example, try running the above code with enough workers that each has ~8GB of memory, and see the memory warnings which appear. Nonetheless, the computations will finish successfully.", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "GHRSST", + "MUR with Dask" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#connect-to-s3-netcdfs", - "href": "external/SWOT_to_kerchunk.html#connect-to-s3-netcdfs", - "title": "Kerchunk JSON Generation", - "section": "Connect to s3 netCDF’s", - "text": "Connect to s3 netCDF’s\n\n17564 granules takes around 5 mins\n\n\n%%time\nfileset = [s3.open(file) for file in remote_files]", + "objectID": "notebooks/Advanced_cloud/basic_dask.html#loading-data-and-chunking", + "href": "notebooks/Advanced_cloud/basic_dask.html#loading-data-and-chunking", + "title": "Basics of Xarray with Dask Parallization for Earth Data", + "section": "3.1 Loading data and chunking", + "text": "3.1 Loading data and chunking\nFirst, load the data for multiple timestamps into one Xarray dataset (the MUR data set is appropriately formatted, so Xarray can combine the data from multiple files along the time dimension):\n\nsstdata = xr.open_mfdataset(fileobjs[:10])\nsstdata['analysed_sst']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 10, lat: 17999, lon: 36000)>\ndask.array<concatenate, shape=(10, 17999, 36000), dtype=float32, chunksize=(1, 1023, 2047), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-10T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 10lat: 17999lon: 36000dask.array<chunksize=(1, 1023, 2047), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n24.14 GiB\n7.99 MiB\n\n\nShape\n(10, 17999, 36000)\n(1, 1023, 2047)\n\n\nDask graph\n3240 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 10\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-01-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nXarray has also chunked the data arrays, which is important for parallel processing. The concept of chunks is covered in the prerequisite material linked to in the header, but in short they are the subsets of data that processors will work on in parallel.\nHowever, note that in the above chunking strategy (defaulted to by Xarray) there are 2 hang ups. First, the time dimension has a small chunk size, which is not efficient if we are looking to perform computations primarily along that axis. Second, the chunk sizes are too small - a good rule of thumb is to make chunk sizes ~100 MB. Therefore, we rechunk to something more efficient:\n\nsstdata = sstdata.chunk(chunks={'lat': 1000, 'lon': 3000, 'time': 10})\nsstdata['analysed_sst']\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 10, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(10, 17999, 36000), dtype=float32, chunksize=(10, 1000, 3000), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-01-10T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 10lat: 17999lon: 36000dask.array<chunksize=(10, 1000, 3000), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n24.14 GiB\n114.44 MiB\n\n\nShape\n(10, 17999, 36000)\n(10, 1000, 3000)\n\n\nDask graph\n216 chunks in 22 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 10\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-01-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "GHRSST", + "MUR with Dask" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#find-matching-size-granules-dask", - "href": "external/SWOT_to_kerchunk.html#find-matching-size-granules-dask", - "title": "Kerchunk JSON Generation", - "section": "Find matching size granules (dask)", - "text": "Find matching size granules (dask)\n\n# Define a function to check the condition and return remote_files if condition is met\ndef is_match(f):\n ds = xr.open_dataset(f, engine=\"h5netcdf\")\n if ds['simulated_true_ssh_karin'].encoding['chunksizes'] == (9866, 71):\n return f.path\n return None\n\n# Create a Dask bag from the fileset\nfileset_bag = dask.bag.from_sequence(fileset)\n\n# Use Dask to parallelize the processing and filter matches\nwith dask.diagnostics.ProgressBar():\n matches_bag = fileset_bag.map(is_match).filter(lambda x: x is not None)\n matches = matches_bag.compute()\n\nprint(f\"{len(matches)} matches found\")", + "objectID": "notebooks/Advanced_cloud/basic_dask.html#computations", + "href": "notebooks/Advanced_cloud/basic_dask.html#computations", + "title": "Basics of Xarray with Dask Parallization for Earth Data", + "section": "3.2 Computations", + "text": "3.2 Computations\nThe above array loaded into memory is quite large (~24 GiB). Calling the following command (commented out by default) to get the temporal mean at each grid point took us a little over 5 minutes:\n\n#%%time\n#sstdata['analysed_sst'].mean(dim='time').compute() # Un-comment to test computation time.\n\nHowever, using a local cluster speeds up the computations to under a minute (we used an m6i.4xlarge EC2 instance type). For this type of parallelization, we can start up the local cluster as in the previous section, and then run Xarray built in functions as usual, calling compute() at the end.\n\nclient = Client(n_workers=12, threads_per_worker=1)\n\n\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(e42eb811, 'tcp://127.0.0.1:37033', workers=12, threads=12, memory=60.88 GiB)\n\n\n'https://cluster-inqaz.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\nmeansst_2dmap = sstdata['analysed_sst'].mean(dim='time').compute()\nmeansst_2dmap\n\nCPU times: user 16 s, sys: 4.06 s, total: 20.1 s\nWall time: 55.1 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (lat: 17999, lon: 36000)>\narray([[ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n ...,\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004]], dtype=float32)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0xarray.DataArray'analysed_sst'lat: 17999lon: 36000nan nan nan nan nan nan nan ... 271.4 271.4 271.4 271.4 271.4 271.4array([[ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n [ nan, nan, nan, ..., nan, nan,\n nan],\n ...,\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004],\n [271.35004, 271.35004, 271.35004, ..., 271.35004, 271.35004,\n 271.35004]], dtype=float32)Coordinates: (2)lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (2)latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (0)\n\n\nPlot a subset of the mean map:\n\nsub = meansst_2dmap.sel(lat=slice(25, 40), lon=slice(-90, -50))\n\nplt.figure(figsize=(8,4))\nplt.contourf(sub['lon'], sub['lat'], sub.values, levels=np.arange(284, 304, 1))\nplt.colorbar(label=\"Mean SST (K)\")\nplt.title(\"Mean SST off the east coast of the U.S.\")\n\nText(0.5, 1.0, 'Mean SST off the east coast of the U.S.')\n\n\n\n\n\n\n\n\n\n\ndask.config.set({\"distributed.admin.system-monitor.gil.enabled\": False}) # Adjust settings to suppress noisy output when closing cluster\nclient.close()\n\n\nsstdata.close()", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "GHRSST", + "MUR with Dask" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#find-matching-size-granules", - "href": "external/SWOT_to_kerchunk.html#find-matching-size-granules", - "title": "Kerchunk JSON Generation", - "section": "Find matching size granules", - "text": "Find matching size granules\n\nmatches = []\npbar = tqdm(fileset, desc=\"Found 0 matches\")\nfor i, f in enumerate(pbar):\n ds = xr.open_dataset(f, engine=\"h5netcdf\")\n if ds['ancillary_surface_classification_flag'].encoding['chunksizes'] == (9866, 71):\n matches.append(remote_files[i])\n pbar.set_description(f\"Found {len(matches)} matches\")\nprint(matches[0])\n\n\n\n\npodaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\n\nflist = ['s3://' + f for f in tqdm(matches)]\nprint(flist[0])\n\n\n\n\ns3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_001_20140412T120000_20140412T125126_DG10_01.nc\n\n\nWrite file\n\nfile = open('SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_paths.txt','w')\nfor item in tqdm(flist):\n file.write(item + \"\\n\")\nfile.close()\n\nRead file\n\nf = open(\"SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1_9866_same_passes_paths.txt\", \"r\")\nremote_urls = f.read().splitlines()\n# remote_urls = remote_urls.split(\"\\n\")\n# remote_urls.pop() # remove extra '' for EOF\nf.close()\nprint(len(remote_urls))\nremote_urls[0]\n\n13680\n\n\n's3://podaac-ops-cumulus-protected/SWOT_SIMULATED_L2_KARIN_SSH_GLORYS_SCIENCE_V1/SWOT_L2_LR_SSH_Expert_001_140_20140417T111107_20140417T120233_DG10_01.nc'", + "objectID": "notebooks/Advanced_cloud/basic_dask.html#other-notes-1", + "href": "notebooks/Advanced_cloud/basic_dask.html#other-notes-1", + "title": "Basics of Xarray with Dask Parallization for Earth Data", + "section": "Other notes", + "text": "Other notes\n\nThis method requires code to be written in a specific way, typically utilizing NumPy and Xarray. That is, one cannot start up a cluster and expect an arbitrarily written block of code to work in parallel on the cluster. For example, in the computation above, we used an Xarray built-in function, which is already set up to work with clusters. In general, for many Earthdata researchers starting with Dask, the following plan of attack is beneficial:\n\nSee if the computation you want to perform can be done with an Xarray built-in function, all of which should work with Dask.\nIf there is no Xarray built-in function, look for a built-in function in another library such as NumPy or SciPy (or a library built on top of these), and read the docs to check whether the function was intended to work with Dask. Generally, NumPy functions should work. SciPy functions are hit or miss in the author’s experience.\nIf no built-in function can be found, write your own function using Dask Arrays which are an extension of NumPy arrays. Tutorials on working with Dask Arrays can be found elsewhere.\n\nChunking can have a significant effect on performance. Here are additional notes on chunking from the Dask documentation: https://docs.dask.org/en/latest/array-chunks.html\nIt turns out that the majority of time is spent opening/locating/streaming the data within the files - comparatively little time is spent actually computing the mean. We can make our computations even faster if we have more efficient access to the data, e.g. using kerchunk, which is covered elsewhere.", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "GHRSST", + "MUR with Dask" ] }, { - "objectID": "external/SWOT_to_kerchunk.html#s3-netcdfs-to-kerchunk-loop", - "href": "external/SWOT_to_kerchunk.html#s3-netcdfs-to-kerchunk-loop", - "title": "Kerchunk JSON Generation", - "section": "s3 NetCDF’s to Kerchunk (loop)", - "text": "s3 NetCDF’s to Kerchunk (loop)\n\n%%time\nsingles = []\nfor i, u in enumerate(tqdm(remote_urls[:20])):\n with fsspec.open(u, mode=\"rb\", anon=False, key=creds['accessKeyId'], secret=creds['secretAccessKey'], token=creds[\"sessionToken\"]) as inf:\n single = SingleHdf5ToZarr(inf, u, inline_threshold=0)\n filename = re.sub(r'.*/', '', u)\n singles.append(single.translate())\n\n ## kerchunk auto_dask definition - Note: this is built in to kerchunk as of v0.1.0 using from kerchunk.combine import auto_dask\n\n# Author: Martin Durant\n# https://fsspec.github.io/kerchunk/_modules/kerchunk/combine.html#auto_dask\nfrom typing import List\ndef auto_dask(\n urls: List[str],\n single_driver: str,\n single_kwargs: dict,\n mzz_kwargs: dict,\n n_batches: int,\n remote_protocol=None,\n remote_options=None,\n filename=None,\n output_options=None,\n):\n \"\"\"Batched tree combine using dask.\n\n If you wish to run on a distributed cluster (recommended), create\n a client before calling this function.\n\n Parameters\n ----------\n urls: list[str]\n input dataset URLs\n single_driver: class\n class with ``translate()`` method\n single_kwargs: to pass to single-input driver\n mzz_kwargs: passed to ``MultiZarrToZarr`` for each batch\n n_batches: int\n Number of MZZ instances in the first combine stage. Maybe set equal\n to the number of dask workers, or a multple thereof.\n remote_protocol: str | None\n remote_options: dict\n To fsspec for opening the remote files\n filename: str | None\n Ouput filename, if writing\n output_options\n If ``filename`` is not None, open it with these options\n\n Returns\n -------\n reference set\n \"\"\"\n import dask\n\n # make delayed functions\n single_task = dask.delayed(lambda x: single_driver(x, **single_kwargs).translate())\n post = mzz_kwargs.pop(\"postprocess\", None)\n inline = mzz_kwargs.pop(\"inline_threshold\", None)\n # TODO: if single files produce list of reference sets (e.g., grib2)\n batch_task = dask.delayed(\n lambda u, x: MultiZarrToZarr(\n u,\n indicts=x,\n remote_protocol=remote_protocol,\n remote_options=remote_options,\n **mzz_kwargs,\n ).translate()\n )\n\n # sort out kwargs\n dims = mzz_kwargs.get(\"concat_dims\", [])\n dims += [k for k in mzz_kwargs.get(\"coo_map\", []) if k not in dims]\n kwargs = {\"concat_dims\": dims}\n if post:\n kwargs[\"postprocess\"] = post\n if inline:\n kwargs[\"inline_threshold\"] = inline\n for field in [\"remote_protocol\", \"remote_options\", \"coo_dtypes\", \"identical_dims\"]:\n if field in mzz_kwargs:\n kwargs[field] = mzz_kwargs[field]\n final_task = dask.delayed(\n lambda x: MultiZarrToZarr(\n x, remote_options=remote_options, remote_protocol=remote_protocol, **kwargs\n ).translate(filename, output_options)\n )\n\n # make delayed calls\n tasks = [single_task(u) for u in urls]\n tasks_per_batch = -(-len(tasks) // n_batches)\n tasks2 = []\n for batch in range(n_batches):\n in_tasks = tasks[batch * tasks_per_batch : (batch + 1) * tasks_per_batch]\n u = urls[batch * tasks_per_batch : (batch + 1) * tasks_per_batch]\n # if in_tasks:\n # skip if on last iteration and no remaining tasks\n # tasks2.append(batch_task(u, in_tasks))\n return dask.compute(final_task(tasks2))[0]\n\n\n\nclass JustLoad:\n \"\"\"For auto_dask, in the case that single file references already exist\"\"\"\n\n def __init__(self, url, storage_options=None):\n self.url = url\n self.storage_options = storage_options or {}\n\n def translate(self):\n with fsspec.open(self.url, mode=\"rt\", **self.storage_options) as f:\n return ujson.load(f)", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#summary", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#summary", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Summary", + "text": "Summary\n\nThis notebook will show direct access of PO.DAAC archived products in the Earthdata Cloud in AWS Simple Storage Service (S3).\n\n\nIn this demo, we will showcase the usage of the Sentinel 6 product:\n\n\nSentinel-6A MF Jason-CS L2 P4 Altimeter Low Resolution (LR) NTC Ocean Surface Topography F08 Data Product - shortname JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08\n\n\nWe will access the data from inside the AWS cloud (us-west-2 region, specifically) and plot the sea surface height anomaly.", "crumbs": [ - "Advanced Cloud", - "Kerchunk" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/Subscriber.html#run-the-script", - "href": "external/Subscriber.html#run-the-script", - "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", - "section": "Run the Script", - "text": "Run the Script\nUsage:\nusage: PO.DAAC data subscriber [-h] -c COLLECTION -d OUTPUTDIRECTORY [-f] [-sd STARTDATE] [-ed ENDDATE] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-m MINUTES] [-e EXTENSIONS] [--process PROCESS_CMD] [--version] [--verbose] [-p PROVIDER] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n-m MINUTES, --minutes MINUTES\n How far back in time, in minutes, should the script look for data. If running this script as a cron, this value should be equal to or greater than how often your cron runs. \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --minutes must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the subscriber.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nEvery time the script runs successfully (that is, no errors), a .update__<collectionname> file is created in your download directory with the last run timestamp. This timestamp will be used the next time the script is run. It will look for data between the timestamp in that file and the current time to determine new files to download." - }, - { - "objectID": "external/Subscriber.html#note-cmr-times", - "href": "external/Subscriber.html#note-cmr-times", - "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", - "section": "Note: CMR times", - "text": "Note: CMR times\nThere are numerous ‘times’ available to query on in CMR. For the default subscriber, we look at the ‘created at’ field, which will look for when a granule file was ingested into the archive. This means as PO.DAAC gets data, your subscriber will also get data, regardless of the time range within the granule itself." - }, - { - "objectID": "external/Subscriber.html#note-netrc-file", - "href": "external/Subscriber.html#note-netrc-file", - "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", - "section": "Note: netrc file", - "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" - }, - { - "objectID": "external/Subscriber.html#advanced-usage", - "href": "external/Subscriber.html#advanced-usage", - "title": "Data Subscriber: Continual, Scripted Access to PODAAC data", - "section": "Advanced Usage", - "text": "Advanced Usage\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nSubscriber behavior when a file already exists\nBy default, when the subscriber is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the subscriber will skip downloading that file.\nThis can drastically reduce the time for the subscriber to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the subscriber to always download matching files, by using –force/-f.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -f\n\n\nRunning as a Cron job\nTo automatically run and update a local file system with data files from a collection, one can use a syntax like the following:\n10 * * * * podaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d /path/to/data/VIIRS_N20-OSPO-L2P-v2.61 -e .nc -e .h5 -m 60 -b=\"-180,-90,180,90\" --verbose >> ~/.subscriber.log\n\nThis will run every hour at ten minutes passed, and output will be appended to a local file called ~/.subscriber.log\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\"\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov" - }, - { - "objectID": "external/insitu_dataviz_demo.html", - "href": "external/insitu_dataviz_demo.html", - "title": "S-MODE Workshop: Science Case Study In Situ", - "section": "", - "text": "imported on: 2024-07-22\nThis notebook is from a different repository in NASA’s PO.DAAC, 2022-SMODE-Open-Data-Workshop\nimport glob\nfrom netCDF4 import Dataset\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimport gsw", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#requirement", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#requirement", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Requirement", + "text": "Requirement\n\nThis tutorial can only be run in an AWS cloud instance running in us-west-2 region.", "crumbs": [ "Tutorials", "Dataset Specific", - "S-MODE", - "Case Study In Situ" + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/insitu_dataviz_demo.html#compare-saildrone-adcp-data-with-rv-oceanus-data", - "href": "external/insitu_dataviz_demo.html#compare-saildrone-adcp-data-with-rv-oceanus-data", - "title": "S-MODE Workshop: Science Case Study In Situ", - "section": "Compare saildrone ADCP data with R/V Oceanus data", - "text": "Compare saildrone ADCP data with R/V Oceanus data\nA major goal of the S-MODE Pilot was to compare saildrone ADCP data. Here’s one example of a simple saildrone-Oceanus velocity comparison.\n\n# this is not working for the Oceanus ADCP\nstart_time = '2021-10-20T00:00:00Z'\nstart_time = '2021-08-01T00:00:00Z'\nend_time = '2021-11-08T00:00:00Z'\n\nshort_name = 'SMODE_LX_SHIPBOARD_ADCP_V1'\n!podaac-data-downloader -c $short_name -d data/$short_name --start-date $start_time --end-date $end_time -e .nc4\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (5.0.0)/charset_normalizer (2.0.4) doesn't match a supported version!\n warnings.warn(\"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported \"\n[2022-11-28 19:46:35,848] {podaac_data_downloader.py:243} INFO - Found 2 total files to download\n[2022-11-28 19:46:35,885] {podaac_data_downloader.py:268} INFO - 2022-11-28 19:46:35.885322 SKIPPED: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_os75nb.nc4\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:268} INFO - 2022-11-28 19:46:35.967540 SKIPPED: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:287} INFO - Downloaded Files: 0\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:288} INFO - Failed Files: 0\n[2022-11-28 19:46:35,967] {podaac_data_downloader.py:289} INFO - Skipped Files: 2\n[2022-11-28 19:46:36,245] {podaac_access.py:122} INFO - CMR token successfully deleted\n[2022-11-28 19:46:36,245] {podaac_data_downloader.py:299} INFO - END\n\n\n\n\n\nds = xr.open_dataset('data/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4',drop_variables='depth').isel(trajectory=0)\nds['depth'] = Dataset('data/SMODE_LX_SHIPBOARD_ADCP_V1/S-MODE_PFC_OC2108A_adcp_wh300.nc4')['depth'][0]\n\n\nsubset_oceanus = ds.where((ds.time>=t0)&(ds.time<=t1),drop=True) \n\n\n# interpolate to subset72 time\n# TODO: try to resample with averaging to 5 minutes before interpolating (e.g., subset_oceanus.resample(time='5min').mean())\nsubset_oceanus = subset_oceanus.interp({'time': subset72.time})\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:562: FutureWarning: Passing method to DatetimeIndex.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imin = index.get_loc(minval, method=\"nearest\")\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:563: FutureWarning: Passing method to DatetimeIndex.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imax = index.get_loc(maxval, method=\"nearest\")\n\n\n\n# interpolate to saildrone depth to oceanus depth\nsubset72['depth'] = subset72.cell_depth + 1.9 # add depth of the instrument 1.9\nsubset72 = subset72.swap_dims({'cell_depth': 'depth'})\nsubset72 = subset72.interp({'depth': subset_oceanus.depth})\n\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:562: FutureWarning: Passing method to Float64Index.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imin = index.get_loc(minval, method=\"nearest\")\n/Users/crocha/miniconda3/lib/python3.9/site-packages/xarray/core/missing.py:563: FutureWarning: Passing method to Float64Index.get_loc is deprecated and will raise in a future version. Use index.get_indexer([item], method=...) instead.\n imax = index.get_loc(maxval, method=\"nearest\")\n\n\n\nVisual comparison\n\ndepth_bin = 1\nsc = 6\n\nfig, ax = plt.subplots(figsize=(12,8))\n\nq1 = plt.quiver(\n subset72.longitude,\n subset72.latitude,\n subset72.vel_east.isel(depth=depth_bin),\n subset72.vel_north.isel(depth=depth_bin),\n color='C00',scale=sc\n)\n\n\nq2 = plt.quiver(\n subset_oceanus.longitude,\n subset_oceanus.latitude,\n subset_oceanus.zonal_velocity_component.isel(depth=depth_bin),\n subset_oceanus.meridional_velocity_component.isel(depth=depth_bin),\n color='C02', scale=sc\n)\n\nplt.quiverkey(q1, .1, 0.815, .5, 'SD-1072',)\nplt.quiverkey(q2, .1, 0.620, .5, 'R/V Oceanus',)\n\nax.set_ylim(37.18,37.26)\nax.set_aspect(np.cos(37.22*np.pi/180))\n\n\n\n\n\n\n\n\n\nfig, axs = plt.subplots(2,1,figsize=(12,14))\n\nkw = {'vmin': -.4,'vmax': +.4,'cmap': 'RdBu_r'}\n\nsubset_oceanus.zonal_velocity_component.plot(x='time',y='depth',ax=axs[0],**kw)\nsubset72.vel_east.plot(x='time',y='depth',ax=axs[1])\n\naxs[0].set_title('R/V Oceanus')\naxs[1].set_title('SD-1072')\n\n[ax.set_ylim(80,0) for ax in axs]\n\n\n\n\n\n\n\n\n\n\nQuantitative comparison: calculate and plot velocity differences\n\nsubset_oceanus = subset_oceanus.where(subset_oceanus.depth<=70)\nsubset72 = subset72.where(subset_oceanus.depth<=70)\n\n\ndu = subset_oceanus.zonal_velocity_component-subset72.vel_east\ndv = subset_oceanus.meridional_velocity_component-subset72.vel_north\n\n\n_ = plt.hist(dv.values.flatten(),bins=np.arange(-.15,.156,.01))\n\n\n\n\n\n\n\n\n\ndu.mean().values, dv.mean().values\n\n(array(-0.01207606), array(0.00744287))\n\n\n\ndu.std().values, dv.std().values\n\n(array(0.03616049), array(0.04748247))", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#learning-objectives", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#learning-objectives", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Learning Objectives:", + "text": "Learning Objectives:\n\nAuthenticate for earthaccess Python Library using your NASA Earthdata Login.\n\n\nAccess DAAC data directly from the in-region S3 bucket without moving or downloading any files to your local (cloud) workspace.\n\n\nNote: no files are being downloaded off the cloud, rather, we are working with the data in the AWS cloud.", "crumbs": [ "Tutorials", "Dataset Specific", - "S-MODE", - "Case Study In Situ" + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/access-cloud-python.html#direct-access", - "href": "external/access-cloud-python.html#direct-access", - "title": "How do I access data stored in Earthdata Cloud in Python?", - "section": "Direct Access", - "text": "Direct Access\nWhen you have found the data you want to use, you have two options. You can download the data to work locally, or access the data directly to work in the cloud. This second way of working is called “Direct Cloud Access” or simply, “Direct Access”. Your compute instance needs to be in Amazon Web Services (AWS) Region us-west-2 in order for the code to run successfully. We authenticate using a netrc file and an Earthdata Login, see the appendix for more information on Earthdata Login and netrc setup.", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#libraries-needed", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#libraries-needed", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Libraries Needed:", + "text": "Libraries Needed:\n\nimport xarray as xr\nimport s3fs\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom matplotlib import pyplot as plt\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n%matplotlib inline", "crumbs": [ - "How To", - "Access Data", - "in the Cloud" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/access-cloud-python.html#python", - "href": "external/access-cloud-python.html#python", - "title": "How do I access data stored in Earthdata Cloud in Python?", - "section": "Python", - "text": "Python\nWe can use the earthaccess python library to grab the file URLs and then access them with the xarray library.\n\n#Import packages\nimport earthaccess\nimport xarray as xr\n\n\n#Authentication with Earthdata Login\nauth = earthaccess.login(strategy=\"netrc\")\n\n\n#Access land ice height from ATLAS/ICESat-2 V005 (10.5067/ATLAS/ATL06.005), searching for data over western Greenland coast over two weeks in July 2022. The data are provided as HDF5 granules (files) that span about 1/14th of an orbit.\n\nresults = earthaccess.search_data(short_name=\"ATL06\",\n version=\"006\",\n cloud_hosted=True,\n temporal = (\"2022-07-17\",\"2022-07-31\"),\n bounding_box = (-51.96423,68.10554,-48.71969,70.70529))\n\nGranules found: 5\n\n\n\n#Use xarray to load the data as a multifile dataset for a single group in the HDF5 file, in this case land ice segments:\nds = xr.open_mfdataset(earthaccess.open(results), group='/gt1l/land_ice_segments')\nds\n\n Opening 5 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (delta_time: 241711)\nCoordinates:\n * delta_time (delta_time) datetime64[ns] 2022-07-18T01:00:46.67...\n latitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n longitude (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\nData variables:\n atl06_quality_summary (delta_time) int8 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n h_li_sigma (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\n segment_id (delta_time) float64 dask.array<chunksize=(78325,), meta=np.ndarray>\n sigma_geo_h (delta_time) float32 dask.array<chunksize=(78325,), meta=np.ndarray>\nAttributes:\n Description: The land_ice_height group contains the primary set of deriv...\n data_rate: Data within this group are sparse. Data values are provide...xarray.DatasetDimensions:delta_time: 241711Coordinates: (3)delta_time(delta_time)datetime64[ns]2022-07-18T01:00:46.678760592 .....contentType :referenceInformationdescription :Number of GPS seconds since the ATLAS SDP epoch. The ATLAS Standard Data Products (SDP) epoch offset is defined within /ancillary_data/atlas_sdp_gps_epoch as the number of GPS seconds between the GPS epoch (1980-01-06T00:00:00.000000Z UTC) and the ATLAS SDP epoch. By adding the offset contained within atlas_sdp_gps_epoch to delta time parameters, the time in gps_seconds relative to the GPS epoch can be computed.long_name :Elapsed GPS secondssource :section 4.4standard_name :timearray(['2022-07-18T01:00:46.678760592', '2022-07-18T01:00:46.681322640',\n '2022-07-18T01:00:46.684008720', ..., '2022-07-26T00:49:18.826637808',\n '2022-07-26T00:49:18.829449568', '2022-07-26T00:49:18.832263232'],\n dtype='datetime64[ns]')latitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Latitude of segment center, WGS84, North=+,long_name :Latitudesource :section 3.10standard_name :latitudeunits :degrees_northvalid_max :90.0valid_min :-90.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nlongitude(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Longitude of segment center, , WGS84, East=+long_name :Longitudesource :section 3.10standard_name :longitudeunits :degrees_eastvalid_max :180.0valid_min :-180.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nData variables: (5)atl06_quality_summary(delta_time)int8dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :The ATL06_quality_summary parameter indicates the best-quality subset of all ATL06 data. A zero in this parameter implies that no data-quality tests have found a problem with the segment, a one implies that some potential problem has been found. Users who select only segments with zero values for this flag can be relatively certain of obtaining high-quality data, but will likely miss a significant fraction of usable data, particularly in cloudy, rough, or low-surface-reflectance conditions.flag_meanings :best_quality potential_problemflag_values :[0 1]long_name :ATL06_Quality_Summarysource :section 4.3units :1valid_max :1valid_min :0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n236.05 kiB\n76.49 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :physicalMeasurementdescription :Standard land-ice segment height determined by land ice algorithm, corrected for first-photon bias, representing the median- based height of the selected PEslong_name :Land Ice heightsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nh_li_sigma(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Propagated error due to sampling error and FPB correction from the land ice algorithmlong_name :Expected RMS segment misfitsource :section 4.4units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsegment_id(delta_time)float64dask.array<chunksize=(78325,), meta=np.ndarray>contentType :referenceInformationdescription :Segment number, counting from the equator. Equal to the segment_id for the second of the two 20m ATL03 segments included in the 40m ATL06 segmentlong_name :Reference Point, msource :section 3.1.2.1units :1\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.84 MiB\n611.91 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nsigma_geo_h(delta_time)float32dask.array<chunksize=(78325,), meta=np.ndarray>contentType :qualityInformationdescription :Total vertical geolocation error due to PPD and POD, including the effects of horizontal geolocation error on the segment vertical error.long_name :Vertical Geolocation Errorsource :ATBD Section 3.10units :meters\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.92 MiB\n305.96 kiB\n\n\nShape\n(241711,)\n(78325,)\n\n\nDask graph\n5 chunks in 11 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 241711 1\n\n\n\n\nIndexes: (1)delta_timePandasIndexPandasIndex(DatetimeIndex(['2022-07-18 01:00:46.678760592',\n '2022-07-18 01:00:46.681322640',\n '2022-07-18 01:00:46.684008720',\n '2022-07-18 01:00:46.686753504',\n '2022-07-18 01:00:46.689526560',\n '2022-07-18 01:00:46.692315280',\n '2022-07-18 01:00:46.695049040',\n '2022-07-18 01:00:46.700724096',\n '2022-07-18 01:00:46.703545872',\n '2022-07-18 01:00:46.706366832',\n ...\n '2022-07-26 00:49:18.806914512',\n '2022-07-26 00:49:18.809737328',\n '2022-07-26 00:49:18.812559600',\n '2022-07-26 00:49:18.815380608',\n '2022-07-26 00:49:18.818200224',\n '2022-07-26 00:49:18.821015744',\n '2022-07-26 00:49:18.823827088',\n '2022-07-26 00:49:18.826637808',\n '2022-07-26 00:49:18.829449568',\n '2022-07-26 00:49:18.832263232'],\n dtype='datetime64[ns]', name='delta_time', length=241711, freq=None))Attributes: (2)Description :The land_ice_height group contains the primary set of derived ATL06 products. This includes geolocation, height, and standard error and quality measures for each segment. This group is sparse, meaning that parameters are provided only for pairs of segments for which at least one beam has a valid surface-height measurement.data_rate :Data within this group are sparse. Data values are provided only for those ICESat-2 20m segments where at least one beam has a valid land ice height measurement.", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#earthdata-login", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#earthdata-login", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Earthdata Login", + "text": "Earthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()", "crumbs": [ - "How To", - "Access Data", - "in the Cloud" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/access-cloud-python.html#end-user-license-agreement-eula", - "href": "external/access-cloud-python.html#end-user-license-agreement-eula", - "title": "How do I access data stored in Earthdata Cloud in Python?", - "section": "End User License Agreement (EULA)", - "text": "End User License Agreement (EULA)\nSometimes, accessing data in NASA Earthdata Cloud requires an End-User License Agreement (EULA). If you cannot access a dataset, this may be your issue! See these instructions for how to authorize EULAs.", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#sentinel-6a-sea-surface-height-anomaly-data", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#sentinel-6a-sea-surface-height-anomaly-data", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "1. Sentinel 6A Sea Surface Height Anomaly Data", + "text": "1. Sentinel 6A Sea Surface Height Anomaly Data", "crumbs": [ - "How To", - "Access Data", - "in the Cloud" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/access-cloud-python.html#alternative-access-method-without-earthaccess", - "href": "external/access-cloud-python.html#alternative-access-method-without-earthaccess", - "title": "How do I access data stored in Earthdata Cloud in Python?", - "section": "Alternative Access Method without earthaccess", - "text": "Alternative Access Method without earthaccess\nAn alternative approach to accessing data is outlined in some notebooks in the Earthdata Cloud Cookbook Appendix! The earthaccess package uses these methods for it’s back end. See this GitHub folder.", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#access-files-without-any-downloads-to-your-running-instance", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#access-files-without-any-downloads-to-your-running-instance", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Access Files without any Downloads to your running instance", + "text": "Access Files without any Downloads to your running instance\n\nHere, we use the earthaccess Python library to search for without downloading any files.\n\n#contain links for each granules\nssh_data = earthaccess.search_data(short_name = 'JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08',\n temporal = (\"2023-02-18 12:00:00\", \"2023-02-19 12:00:00\"),\n )\n\nGranules found: 22", "crumbs": [ - "How To", - "Access Data", - "in the Cloud" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "external/zarr-eosdis-store.html", - "href": "external/zarr-eosdis-store.html", - "title": "Zarr Example", - "section": "", - "text": "imported on: 2024-07-22\n\nThis notebook is from NASA’s Zarr EOSDIS store notebook\n\n\nThe original source for this document is https://github.com/nasa/zarr-eosdis-store/blob/main/presentation/example.ipynb\n\n\nzarr-eosdis-store example\nInstall dependencies\n\nimport sys\n\n# zarr and zarr-eosdis-store, the main libraries being demoed\n!{sys.executable} -m pip install zarr zarr-eosdis-store\n\n# Notebook-specific libraries\n!{sys.executable} -m pip install matplotlib\n\nImportant: To run this, you must first create an Earthdata Login account (https://urs.earthdata.nasa.gov) and place your credentials in ~/.netrc e.g.:\n machine urs.earthdata.nasa.gov login YOUR_USER password YOUR_PASSWORD\nNever share or commit your password / .netrc file!\nBasic usage. After these lines, we work with ds as though it were a normal Zarr dataset\n\nimport zarr\nfrom eosdis_store import EosdisStore\n\nurl = 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/20210715090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'\n\nds = zarr.open(EosdisStore(url))\n\nView the file’s variable structure\n\nprint(ds.tree())\n\n/\n ├── analysed_sst (1, 17999, 36000) int16\n ├── analysis_error (1, 17999, 36000) int16\n ├── dt_1km_data (1, 17999, 36000) int16\n ├── lat (17999,) float32\n ├── lon (36000,) float32\n ├── mask (1, 17999, 36000) int16\n ├── sea_ice_fraction (1, 17999, 36000) int16\n ├── sst_anomaly (1, 17999, 36000) int16\n └── time (1,) int32\n\n\nFetch the latitude and longitude arrays and determine start and end indices for our area of interest. In this case, we’re looking at the Great Lakes, which have a nice, recognizeable shape. Latitudes 41 to 49, longitudes -93 to 76.\n\nlats = ds['lat'][:]\nlons = ds['lon'][:]\nlat_range = slice(lats.searchsorted(41), lats.searchsorted(49))\nlon_range = slice(lons.searchsorted(-93), lons.searchsorted(-76))\n\nGet the analysed sea surface temperature variable over our area of interest and apply scale factor and offset from the file metadata. In a future release, scale factor and add offset will be automatically applied.\n\nvar = ds['analysed_sst']\nanalysed_sst = var[0, lat_range, lon_range] * var.attrs['scale_factor'] + var.attrs['add_offset']\n\nDraw a pretty picture\n\nfrom matplotlib import pyplot as plt\n\nplt.rcParams[\"figure.figsize\"] = [16, 8]\nplt.imshow(analysed_sst[::-1, :])\nNone\n\n\n\n\n\n\n\n\nIn a dozen lines of code and a few seconds, we have managed to fetch and visualize the 3.2 megabyte we needed from a 732 megabyte file using the original archive URL and no processing services", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#extract-and-grab-first-link", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#extract-and-grab-first-link", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Extract and grab first link", + "text": "Extract and grab first link\n\n# extracting links (url)\ndata_links = [granule.data_links(access=\"direct\") for granule in ssh_data]\n\n#picks first link\nfile_path = data_links[0] \nfile_path\n\n['s3://podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08/S6A_P4_2__LR_STD__NT_084_001_20230218T160856_20230218T170509_F08.nc']", "crumbs": [ "Tutorials", - "Cloud Optimized Examples", - "zarr-eosdis-store library" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "quarto_text/TechGuides.html#cloning-this-github-repository", - "href": "quarto_text/TechGuides.html#cloning-this-github-repository", - "title": "Tech Guides", - "section": "Cloning this GitHub Repository", - "text": "Cloning this GitHub Repository\nCloning the podaac/tutorials repository allows you to have a copy of all the PO.DAAC Cookbook Notebook tutorials on your own machine to use. Follow these instructions to clone our repository from GitHub documentation, selecting your machine type and what method you would like to use to clone at the top (GitHub Desktop is a useful interface if you would rather not use the command line).\nThe link for this particular repository is: https://github.com/podaac/tutorials.git In the command line or Git Bash change the working directory to the location where you would want the cloned directory and then type:\n$ git clone https://github.com/podaac/tutorials", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#authenticate-from-aws", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#authenticate-from-aws", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Authenticate from AWS", + "text": "Authenticate from AWS\n\n#authenticate and get short term credientials to bucket (podaac-ops...)\nfs_s3 = earthaccess.get_s3fs_session(results=ssh_data)", "crumbs": [ - "Tech Guides" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "quarto_text/TechGuides.html#tech-how-tos-useful-introductions", - "href": "quarto_text/TechGuides.html#tech-how-tos-useful-introductions", - "title": "Tech Guides", - "section": "Tech How To’s & Useful Introductions", - "text": "Tech How To’s & Useful Introductions\n\nHow to Set Up an EC2 Instance - Earthdata Webinar outlining how to set up your own AWS cloud computer, an Elastic Computer Cloud (EC2)\nNASA earthaccess - a Python package to search, preview and access NASA datasets (on-prem or in the cloud) with a few lines of code\nGet started with GitHub - develop and share code in a collaborative environment\nIntroduction to Xarray - A useful Python Package while working with NASA Earthdata\nJupyter Lab, RStudio Desktop, or Visual Studio Code - useful coding workspaces\nHow to scale your NASA data workflows on the cloud, in parallel - a Coiled example - Guide for NASA Cloud computing at scale. How to run existing NASA data workflows on the cloud, in parallel, with minimal code changes using Coiled. (Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.)", - "crumbs": [ - "Tech Guides" - ] - }, - { - "objectID": "quarto_text/TechGuides.html#a-growing-list-of-resources", - "href": "quarto_text/TechGuides.html#a-growing-list-of-resources", - "title": "Tech Guides", - "section": "A Growing List of Resources", - "text": "A Growing List of Resources\n\nNASA Earthdata Cloud Cookbook - Tutorials & data recipes applicable to all NASA datasets\nNASA Earthdata: How to Cloud\nNASA Earthdata Cloud Primer - AWS cloud primer: helpful tutorials for how to set up your own EC2 cloud instance in AWS, attach storage, move files back and forth, and more.\nSetting up Jupyter Notebooks in a user EC2 instance in AWS - helpful blog post for setting up jupyter notebooks in an EC2 instance in AWS. (Builds on the Cloud Primer tutorials, which are missing that next step)\nRunning the NASA Cloud Workshop notebooks with mybinder.org - by Eli Holmes, 2021 Cloud Hackathon Participant who then set up working in Binder\nCloud Optimized Geospatial Formats Guide - Methods for Generating and Testing Cloud-Optimized Geospatial Formats", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#read-file", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#read-file", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Read file", + "text": "Read file\n\n#reading file into memory\nfs_s3.open(file_path[0])\n\n<File-like object S3FileSystem, podaac-ops-cumulus-protected/JASON_CS_S6A_L2_ALT_LR_STD_OST_NTC_F08/S6A_P4_2__LR_STD__NT_084_001_20230218T160856_20230218T170509_F08.nc>", "crumbs": [ - "Tech Guides" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "quarto_text/GIS.html#gis-storymaps-of-select-datasets", - "href": "quarto_text/GIS.html#gis-storymaps-of-select-datasets", - "title": "GIS", - "section": "GIS StoryMaps of Select Datasets:", - "text": "GIS StoryMaps of Select Datasets:\n\nPO.DAAC GIS StoryMap Collection Page\n\nExploring Water Surface Extent with Satellite Data\nSWOT: Through a GIS Lens\nUtilizing GRACE data over the Colorado River Basin\nThe Oceans & Melting Glaciers: OMG & GRACE", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#load-with-xarray", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#load-with-xarray", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Load with xarray", + "text": "Load with xarray\n\nThe variable ‘ssha’ is located in the group ‘data_01’ and within the subgroup of ‘ku’. Here, we create variables that will access the group and the subgroups.\n\n# Load the netCDF file using xarray\nku_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01/ku')\nc_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01/c')\ndata01_ds = xr.open_dataset(fs_s3.open(file_path[0]), group = 'data_01')", "crumbs": [ "Tutorials", - "GIS" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "quarto_text/GIS.html#gis-walkthroughs", - "href": "quarto_text/GIS.html#gis-walkthroughs", - "title": "GIS", - "section": "GIS Walkthroughs", - "text": "GIS Walkthroughs\n\nMapping Sea Surface Temperature Anomalies in QGIS", + "objectID": "notebooks/sentinel-6/S6_Cloud_Notebook.html#plot-sea-surface-height-anomaly-ssha", + "href": "notebooks/sentinel-6/S6_Cloud_Notebook.html#plot-sea-surface-height-anomaly-ssha", + "title": "Access Sentinel 6 Data in the Cloud", + "section": "Plot sea surface height anomaly (ssha)", + "text": "Plot sea surface height anomaly (ssha)\n\n# Access the 'ssha' variable under 'data_01' and 'ku'\nssha = ku_ds['ssha']\n\n# Plot the 'ssha'\nplt.figure(figsize=(10, 5))\nplt.scatter(data01_ds.longitude, data01_ds.latitude, c = ssha, cmap = 'coolwarm', vmin=-0.2, vmax=0.2)\nplt.colorbar(label='Sea Surface Height Anomaly (ssha)')\nplt.title('Sea Surface Height Anomaly (ssha)')\nplt.xlabel('Longitude Index')\nplt.ylabel('Latitude Index')\nplt.show()\n\n\n\n\n\n\n\n\n\nssha.plot()\n\n\n\n\n\n\n\n\n\n# Create a plot with a specific projection\nfig = plt.figure(figsize=(10, 5))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\nax.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree()) # Set the extent to global\n\n# Add features to the map\nax.add_feature(cfeature.LAND)\nax.add_feature(cfeature.OCEAN) # Correct attribute for oceans\nax.add_feature(cfeature.COASTLINE)\nax.add_feature(cfeature.BORDERS, linestyle=':')\n\n# Plot the 'ssha' with longitude and latitude from your dataset\nscatter = ax.scatter(data01_ds.longitude, data01_ds.latitude, c=ssha, cmap='coolwarm', transform=ccrs.PlateCarree())\n\n# Add a colorbar\ncbar = plt.colorbar(scatter, ax=ax, orientation='vertical', fraction=0.046, pad=0.04)\ncbar.set_label('Sea Surface Height Anomaly (ssha)')\n\n# Set titles and labels\nplt.title('Sea Surface Height Anomaly (ssha)')\nax.set_xlabel('Longitude')\nax.set_ylabel('Latitude')\n\n# Show the plot\nplt.show()", "crumbs": [ "Tutorials", - "GIS" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access in Cloud" ] }, { - "objectID": "quarto_text/GIS.html#gis-jupyter-notebook-tutorials", - "href": "quarto_text/GIS.html#gis-jupyter-notebook-tutorials", - "title": "GIS", - "section": "GIS Jupyter Notebook Tutorials", - "text": "GIS Jupyter Notebook Tutorials\n\nGIS SWOT shapefile exploration\nNetCDF to Geotiff Conversion: SWOT Data Example", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#before-you-start", + "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#before-you-start", + "title": "\nTable of Contents\n", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an Earthdata account: https://urs.earthdata.nasa.gov for the operations envionrment (most common) or https://uat.urs.earthdata.nasa.gov for the UAT environment.\nAccounts are free to create and take just a moment to set up.\n\nimport requests\nfrom os import makedirs\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", "crumbs": [ "Tutorials", - "GIS" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access NRT Data" ] }, { - "objectID": "quarto_text/Tutorials.html#tutorial-categories", - "href": "quarto_text/Tutorials.html#tutorial-categories", - "title": "Tutorials", - "section": "Tutorial Categories", - "text": "Tutorial Categories\n\nDataset Specific Examples\n\n\nGIS\n\n\nCloud vs. Local Workflows\n\n\nScience Data Stories\n\n\nCloud Optimized Examples", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#authentication-with-earthaccess", + "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#authentication-with-earthaccess", + "title": "\nTable of Contents\n", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", "crumbs": [ - "Tutorials" + "Tutorials", + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access NRT Data" ] }, { - "objectID": "quarto_text/CloudvsLocalWorkflows.html", - "href": "quarto_text/CloudvsLocalWorkflows.html", - "title": "Cloud vs. Local Workflows", - "section": "", - "text": "Tutorials showcasing the same workflows in in different locations: in the cloud hosted by Amazon Web Services (AWS) or on a local machine downloaded from the cloud.\nNote: NASA Earthdata is hosted in the us-west-2 region in the cloud.\n\nExamples: SWOT Oceanography & Hydrology Data Exploration\nAccess SWOT Hydrology data Cloud Version | Local Version\nAccess SWOT Oceanography data Cloud Version | Local Version\nSWOT Raster Multifile Access & Quality Flag Application Cloud Version | Local Version\n\n\nExample: Amazon Estuary Exploration\nThese tutorials explore the relationships between land water equivalent thickness, river height, sea surface salinity, and sea surface temperature in the Amazon River estuary and coastal region from multiple datasets (GRACE-FO, Pre-SWOT MEaSUREs, OISSS, & MODIS).\nCloud Version | Local Version\n\n\nExample: Lake Extent\nThese tutorials explore OPERA Dynamic Surface Water Extent (DSWx) product: how to search for, access, visualize, and mosaic OPERA data over lake Powell.\nCloud Version | Local Version\n\n\nExample: Reservoir Surface Area\nThese tutorials estimate reservoir surface area from Harmonized Landsat-Sentinel (HLS) Imagery.\nCloud Version | Local Version", + "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#hands-off-workflow", + "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#hands-off-workflow", + "title": "\nTable of Contents\n", + "section": "Hands-off workflow", + "text": "Hands-off workflow\nThis workflow/notebook can be run routinely to maintain a time series of NRT data, downloading new granules as they become available in CMR.\nThe notebook writes/overwrites a file .update to the target data directory with each successful run. The file tracks to date and time of the most recent update to the time series of NRT granules using a timestamp in the format yyyy-mm-ddThh:mm:ssZ.\nThe timestamp matches the value used for the created_at parameter in the last successful run. This parameter finds the granules created within a range of datetimes. This workflow leverages the created_at parameter to search backwards in time for new granules ingested between the time of our timestamp and now.\nThe variables in the cell below determine the workflow behavior on its initial run:\n\nmins: Initialize a new local time series by starting with the granules ingested since ___ minutes ago.\ncmr: The domain of the target CMR instance, either cmr.earthdata.nasa.gov.\nccid: The unique CMR concept-id of the desired collection.\ndata: The path to a local directory in which to download/maintain a copy of the NRT granule time series.\n\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\n# this function returns a concept id for a particular dataset\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n\n#\n# This cell accepts parameters from command line with papermill: \n# https://papermill.readthedocs.io\n#\n# These variables should be set before the first run, then they \n# should be left alone. All subsequent runs expect the values \n# for cmr, ccid, data to be unchanged. The mins value has no \n# impact on subsequent runs.\n#\n\nmins = 20\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nccid = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ndata = \"resources/nrt\"\n\nThe variable data is pointed at a nearby folder resources/nrt by default. You should change data to a suitable download path on your file system. An unlucky sequence of git commands could disappear that folder and its downloads if your not careful. Just change it.\nThe Python imports relevant to the workflow\nThe search retrieves granules ingested during the last n minutes. A file in your local data dir file that tracks updates to your data directory, if one file exists. The CMR Search falls back on the ten minute window if not.\n\ntimestamp = (datetime.utcnow()-timedelta(minutes=mins)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\ntimestamp\n\n'2023-08-02T21:08:21Z'\n\n\nThis cell will replace the timestamp above with the one read from the .update file in the data directory, if it exists.\n\nif not isdir(data):\n print(f\"NOTE: Making new data directory at '{data}'. (This is the first run.)\")\n makedirs(data)\nelse:\n try:\n with open(f\"{data}/.update\", \"r\") as f:\n timestamp = f.read()\n except FileNotFoundError:\n print(\"WARN: No .update in the data directory. (Is this the first run?)\")\n else:\n print(f\"NOTE: .update found in the data directory. (The last run was at {timestamp}.)\")\n\nWARN: No .update in the data directory. (Is this the first run?)\n\n\nThere are several ways to query for CMR updates that occured during a given timeframe. Read on in the CMR Search documentation:\n\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-new-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-revised-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-production-date (Granules)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-created-at (Granules)\n\nThe created_at parameter works for our purposes. It’s a granule search parameter that returns the records ingested since the input timestamp.\n\nparams = {\n 'scroll': \"true\",\n 'page_size': 2000,\n 'sort_key': \"-start_date\",\n 'collection_concept_id': ccid, \n 'created_at': timestamp,\n # Limit results to coverage for .5deg bbox in Gulf of Alaska:\n 'bounding_box': \"-146.5,57.5,-146,58\",\n}\n\nparams\n\n{'scroll': 'true',\n 'page_size': 2000,\n 'sort_key': '-start_date',\n 'collection_concept_id': 'C1968980576-POCLOUD',\n 'created_at': '2023-08-02T21:08:21Z',\n 'bounding_box': '-146.5,57.5,-146,58'}\n\n\nGet the query parameters as a string and then the complete search url:\n\nquery = urlencode(params)\nurl = f\"https://{cmr}/search/granules.umm_json?{query}\"\nprint(url)\n\nhttps://cmr.earthdata.nasa.gov/search/granules.umm_json?scroll=true&page_size=2000&sort_key=-start_date&collection_concept_id=C1968980576-POCLOUD&created_at=2023-08-02T21%3A08%3A21Z&bounding_box=-146.5%2C57.5%2C-146%2C58\n\n\nGet a new timestamp that represents the UTC time of the search. Then download the records in umm_json format for granules that match our search parameters:\n\nwith urlopen(url) as f:\n results = loads(f.read().decode())\n\nprint(f\"{results['hits']} new granules ingested for '{ccid}' since '{timestamp}'.\")\n\ntimestamp = datetime.utcnow().strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n0 new granules ingested for 'C1968980576-POCLOUD' since '2023-08-02T21:08:21Z'.\n\n\nNeatly print the first granule record (if one was returned):\n\nif len(results['items'])>0:\n print(dumps(results['items'][0], indent=2))\n\nThe link for http access can be retrieved from each granule record’s RelatedUrls field. The download link is identified by \"Type\": \"GET DATA\" .\nSelect the download URL for each of the granule records:\n\ndownloads = [[u['URL'] for u in r['umm']['RelatedUrls'] if u['Type']==\"GET DATA\"][0] for r in results['items']]\ndownloads\n\n[]\n\n\nFinish by downloading the files to the data directory in a loop. Overwrite .update with a new timestamp on success.\n\nfor f in downloads:\n try:\n earthaccess.download([f[0]], f\"{data}/{basename(f)}\")\n except Exception as e:\n print(f\"[{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n else:\n print(f\"[{datetime.now()}] SUCCESS: {f}\")\n\nIf there were updates to the local time series during this run and no exceptions were raised during the download loop, then overwrite the timestamp file that tracks updates to the data folder (resources/nrt/.update):\n\nif len(results['items'])>0:\n with open(f\"{data}/.update\", \"w\") as f:\n f.write(timestamp)", "crumbs": [ "Tutorials", - "Cloud vs. Local Workflows" + "Dataset Specific", + "Sentinel-6 Michael Freilich", + "Access NRT Data" ] }, { - "objectID": "quarto_text/SMAP.html#background", - "href": "quarto_text/SMAP.html#background", - "title": "SMAP", - "section": "Background", - "text": "Background\nThe Soil Moisture Active Passive (SMAP) satellite is designed to principally measure soil moisture and freeze/thaw state from space for all non-liquid water surfaces globally within the top layer of the Earth. The mission additionally provides a value-added Level 4 terrestrial carbon dataset derived from SMAP observations. More information can be found on PO.DAAC’s SMAP webpage.", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#summary", + "href": "notebooks/datasets/smap_imerg_tutorial.html#summary", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Summary:", + "text": "Summary:\nThis tutorial uses the Earthdata Search (https://search.earthdata.nasa.gov/) to download the data on your local machine. You will need to create an account in order to download the data.", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP" + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/SMAP.html#data-resources-tutorials", - "href": "quarto_text/SMAP.html#data-resources-tutorials", - "title": "SMAP", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nVisualizing Ocean Salinity as Powerful Storms Wreak Havoc in California - Data in Action Use Case Notebook Tutorial with a local machine workflow\n\nThe Data in Action Story\n\n\n\nMonitoring Changes in the Arctic Using SMAP Satellite data and Saildrone - AWS cloud tutorial that compares salinity from the SMAP satellite and Saildrone in-situ measurements", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#datasets", + "href": "notebooks/datasets/smap_imerg_tutorial.html#datasets", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Datasets:", + "text": "Datasets:\n\nJPL SMAP L3 Dataset: https://podaac.jpl.nasa.gov/dataset/SMAP_JPL_L3_SSS_CAP_8DAY-RUNNINGMEAN_V5?ids=&values=&search=Smap Level 3&provider=POCLOUD\nGPM IMERG Late Precipitation: https://disc.gsfc.nasa.gov/datasets/GPM_3IMERGDL_06/summary?keywords=gpm imerg", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP" + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/SMAP.html#additional-resources", - "href": "quarto_text/SMAP.html#additional-resources", - "title": "SMAP", - "section": "Additional Resources", - "text": "Additional Resources\nNASA Mission Page\nData in Action: Using Coastal Surface Salinity to Monitor Global Water Cycle Changes", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#learning-objectives", + "href": "notebooks/datasets/smap_imerg_tutorial.html#learning-objectives", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Learning Objectives:", + "text": "Learning Objectives:\nUses python to plot the SMAP sea surface salinity anomalies over the ocean and the IMERG precipitation over the land.", "crumbs": [ "Tutorials", "Dataset Specific", - "SMAP" + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/HowTo.html#how-do-i", - "href": "quarto_text/HowTo.html#how-do-i", - "title": "How To", - "section": "How do I", - "text": "How do I\n\nFind Data using Earthdata Search or using Code\nAuthenticate Programmatically\nAccess Data in the Cloud, locally or via OPeNDAP\nRead Data\nDownload/Subscribe to Data", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#import-needed-packages", + "href": "notebooks/datasets/smap_imerg_tutorial.html#import-needed-packages", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Import needed packages", + "text": "Import needed packages\n\nimport glob\nimport numpy as np\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom datetime import datetime\nimport os\n\n/opt/anaconda3/envs/plotting/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1\n warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"", "crumbs": [ - "How To" + "Tutorials", + "Dataset Specific", + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/HowTo.html#additional-resources", - "href": "quarto_text/HowTo.html#additional-resources", - "title": "How To", - "section": "Additional Resources", - "text": "Additional Resources\nFor more “how to” guides applicable to all NASA datasets, including PO.DAAC, visit the NASA Earthdata Cloud Cookbook.", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#load-directories", + "href": "notebooks/datasets/smap_imerg_tutorial.html#load-directories", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Load directories", + "text": "Load directories\n\n#Replace with your directory \nbase_directory = \"/Users/username\" \n\n#Replace with your directory. This will be the output for plots\noutputpath = (os.path.join(base_directory, 'Desktop/plots/'))", "crumbs": [ - "How To" + "Tutorials", + "Dataset Specific", + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/cheatsheet.html#contents", - "href": "quarto_text/cheatsheet.html#contents", - "title": "Cheatsheets & Guides", - "section": "Contents:", - "text": "Contents:\nHere are some cheatsheets and guides helping visualize what working with NASA Earthdata Cloud data looks like, and how to get started!\n\nNASA Earthdata Cloud Overview\nCloud Access Pathways\nGetting Started Roadmaps: Cloud & Local Workflows\nTools & Services Roadmap\nCloud Terminology 101\nWorkflow Cheatsheet\nCheatsheet Terminology\n\n\nWhat is the NASA Earthdata Cloud?\nNASA Earthdata Cloud is the NASA archive of Earth observations and is hosted in Amazon Web Services (AWS) cloud with DAAC tools and services built for use “next to the data.” The NASA DAACs (data centers) are currently transitioning to this cloud-based environment. All PO.DAAC data will be housed in the cloud, and can be accessed through AWS. The cloud offers a scalable and effective way to address storage, network, and data movement concerns while offering a tremendous amount of flexibility to the user. Particularly if working with large data volumes, data access and processing would be more efficient if workflows are taking place in the cloud, avoiding having to download large data volumes. Data download will continue to be freely available to users, from the Earthdata Cloud archive.\n\n\nPublished Google Slide\n\n\nCloud Access Pathways\nThree pathway examples, to interact and access data (and services) from and within the NASA Earthdata Cloud, are illustrated in the diagram. Green arrows and icons indicate working locally, after downloading data to your local machine, servers, or compute/storage space. Orange arrows and icons highlight a workflow within the cloud, setting up your own AWS EC2 cloud instance, or virtual machine, in the cloud next to the data. Blue arrows and icons also indicate a within the cloud workflow, through shareable cloud environments such as Binder or JupyterHub set up in an AWS cloud region. Note that each of these may have a range of cost models. EOSDIS data are being stored in the us-west-2 region of AWS cloud; we recommend setting up your cloud computing environment in the same region as the data for free and easy in-cloud access.\n\n\nPublished Google Slide\nA note on costing: What is free and what do I have to budget for, now that data is archived in the cloud?\n\nDownloading data from the Earthdata Cloud archive in AWS, to your local computer environment or local storage (e.g. servers) is and will continue to be free for the user.\nAccessing the data directly in the cloud (from us-west-2 S3 region) is free. Users will need a NASA Earthdata Login account and AWS credentials to access, but there is no cost associated with these authentication steps, which are in place for security reasons.\nAccessing data in the cloud via EOSDIS or DAAC cloud-based tools and services such as the CMR API, Harmony API, OPenDAP API (from us-west-2 S3 region) is free to the user. Having the tools and services “next to the data” in the cloud enables DAACs to support data reduction and transformation, more efficiently, on behalf of the user, so users only access the data they need.\nCloud computing environments (i.e. virtual machines in the cloud) for working with data in the cloud (beyond direct or via services provided access) such as data analysis or running models with the data, is user responsibility, and should be considered in budgeting. I.e. User would need to set up a cloud compute environment (such as an EC2 instance or JupyterLab) and are responsible for any storage and computing costs.\n\nThis means that even though direct data access in the cloud is free to the user, they would first need to have a cloud computing environment/machine to execute the data access step from, and then continue their analysis.\nDepending on whether that cloud environment is provided by the user themselves, user’s institution, community hubs like Pangeo or NASA Openscapes JupyterLab sandbox, this element of the workflow may require user accountability, budgeting and user financial maintenance.\n\n\n\n\nGetting Started Roadmap\n\nCloud Workflow\nThe following is a conceptual roadmap for users getting started with NASA Earth Observations cloud-archived data using an in-cloud workflow (i.e. bringing user code into the cloud, avoiding data download and performing data workflows “next to the data”).\n\n\nPublished Google Slide\n\n\nLocal Workflow\nThe following is a conceptual roadmap for users getting started with NASA Earth Observations cloud-archived data using a local machine (e.g. laptop) workflow, as data storage and computational work.\n\n\n[Published Google Slide]((https://docs.google.com/presentation/d/e/2PACX-1vSpmQBM-BfRMdtut9qT2oc4uxxTDFpulXMCN6h_9TviDlujn-MZJ4gwX8ilHK1qg1hgvwrt_JXwlaVF/pub?start=false&loop=false&delayms=3000){target=“_blank”}\n\n\n\nTools & Services Roadmap\nBelow is a practical guide for learning about and selecting helpful tools or services for a given use case, focusing on how to find and access NASA Earthdata Cloud-archived data from local compute environment (e.g. laptop) or from a cloud computing workspace, with accompanying example tutorials. Once you follow your desired pathway, click on the respective blue notebook icon to get to the example tutorial. Note: these pathways are not exhaustive, there are many ways to accomplish these common steps, but these are some of our recommendations.\n\n\nPublished Google Slide\n\n\nCloud Terminology 101\nCloud Terminology 101 for those new to commonly used cloud computing terms and phrases.\n\n\nPublished Google Slide\n\n\nWorkflow Cheatsheet\nThe following is a practical reference guide with links to tutorials and informational websites for users who are starting to take the conceptual pieces and explore and implement in their own workflows.\n\n\nPublished Google Slide\n\n\nWorkflow Cheatsheet Terminology\nTerminology cheatsheet to explain terms commonly used in cloud computing and those located on the NASA Earthdata Cloud Cheatsheet. See also NASA Earthdata Glossary.\n\n\nPublished Google Slide", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#open-subset_location-the-smap-sss-data-for-a-specified-subset", + "href": "notebooks/datasets/smap_imerg_tutorial.html#open-subset_location-the-smap-sss-data-for-a-specified-subset", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Open subset_location the SMAP SSS data for a specified subset", + "text": "Open subset_location the SMAP SSS data for a specified subset\n\n#the subset used to determine which values are plotted\nsubset_bounds = ['20221226', '20230116'] \n\n#calculates the mean over the same time period as the plotted values\nsubset_mean_bounds = subset_bounds \n\n#Replace with your directory of SMAP files\nallsubset_files = xr.open_mfdataset(os.path.join(base_directory, 'Desktop/JPL_SMAP_L3/SMAP*.nc*'))\n\n\n#grabs smap data from 12-26-2015 to 01-16-2023\nallsubset_files = allsubset_files.sel(time=(allsubset_files['time'].dt.strftime('%m%d') >= subset_mean_bounds[0][4:8]) | (allsubset_files['time'].dt.strftime('%m%d') <= subset_mean_bounds[1][4:8]))\nallsubset_files['time'].values\n\narray(['2015-12-26T12:00:00.000000000', '2015-12-27T12:00:00.000000000',\n '2015-12-28T12:00:00.000000000', '2015-12-29T12:00:00.000000000',\n '2015-12-30T12:00:00.000000000', '2015-12-31T12:00:00.000000000',\n '2016-01-01T12:00:00.000000000', '2016-01-02T12:00:00.000000000',\n '2016-01-03T12:00:00.000000000', '2016-01-04T12:00:00.000000000',\n '2016-01-05T12:00:00.000000000', '2016-01-06T12:00:00.000000000',\n '2016-01-07T12:00:00.000000000', '2016-01-08T12:00:00.000000000',\n '2016-01-09T12:00:00.000000000', '2016-01-10T12:00:00.000000000',\n '2016-01-11T12:00:00.000000000', '2016-01-12T12:00:00.000000000',\n '2016-01-13T12:00:00.000000000', '2016-01-14T12:00:00.000000000',\n '2016-01-15T12:00:00.000000000', '2016-01-16T12:00:00.000000000',\n '2016-12-26T12:00:00.000000000', '2016-12-27T12:00:00.000000000',\n '2016-12-28T12:00:00.000000000', '2016-12-29T12:00:00.000000000',\n '2016-12-30T12:00:00.000000000', '2016-12-31T12:00:00.000000000',\n '2017-01-01T12:00:00.000000000', '2017-01-02T12:00:00.000000000',\n '2017-01-03T12:00:00.000000000', '2017-01-04T12:00:00.000000000',\n '2017-01-05T12:00:00.000000000', '2017-01-06T12:00:00.000000000',\n '2017-01-07T12:00:00.000000000', '2017-01-08T12:00:00.000000000',\n '2017-01-09T12:00:00.000000000', '2017-01-10T12:00:00.000000000',\n '2017-01-11T12:00:00.000000000', '2017-01-12T12:00:00.000000000',\n '2017-01-13T12:00:00.000000000', '2017-01-14T12:00:00.000000000',\n '2017-01-15T12:00:00.000000000', '2017-01-16T12:00:00.000000000',\n '2017-12-26T12:00:00.000000000', '2017-12-27T12:00:00.000000000',\n '2017-12-28T12:00:00.000000000', '2017-12-29T12:00:00.000000000',\n '2017-12-30T12:00:00.000000000', '2017-12-31T12:00:00.000000000',\n '2018-01-01T12:00:00.000000000', '2018-01-02T12:00:00.000000000',\n '2018-01-03T12:00:00.000000000', '2018-01-04T12:00:00.000000000',\n '2018-01-05T12:00:00.000000000', '2018-01-06T12:00:00.000000000',\n '2018-01-07T12:00:00.000000000', '2018-01-08T12:00:00.000000000',\n '2018-01-09T12:00:00.000000000', '2018-01-10T12:00:00.000000000',\n '2018-01-11T12:00:00.000000000', '2018-01-12T12:00:00.000000000',\n '2018-01-13T12:00:00.000000000', '2018-01-14T12:00:00.000000000',\n '2018-01-15T12:00:00.000000000', '2018-01-16T12:00:00.000000000',\n '2018-12-26T12:00:00.000000000', '2018-12-27T12:00:00.000000000',\n '2018-12-28T12:00:00.000000000', '2018-12-29T12:00:00.000000000',\n '2018-12-30T12:00:00.000000000', '2018-12-31T12:00:00.000000000',\n '2019-01-01T12:00:00.000000000', '2019-01-02T12:00:00.000000000',\n '2019-01-03T12:00:00.000000000', '2019-01-04T12:00:00.000000000',\n '2019-01-05T12:00:00.000000000', '2019-01-06T12:00:00.000000000',\n '2019-01-07T12:00:00.000000000', '2019-01-08T12:00:00.000000000',\n '2019-01-09T12:00:00.000000000', '2019-01-10T12:00:00.000000000',\n '2019-01-11T12:00:00.000000000', '2019-01-12T12:00:00.000000000',\n '2019-01-13T12:00:00.000000000', '2019-01-14T12:00:00.000000000',\n '2019-01-15T12:00:00.000000000', '2019-01-16T12:00:00.000000000',\n '2019-12-26T12:00:00.000000000', '2019-12-27T12:00:00.000000000',\n '2019-12-28T12:00:00.000000000', '2019-12-29T12:00:00.000000000',\n '2019-12-30T12:00:00.000000000', '2019-12-31T12:00:00.000000000',\n '2020-01-01T12:00:00.000000000', '2020-01-02T12:00:00.000000000',\n '2020-01-03T12:00:00.000000000', '2020-01-04T12:00:00.000000000',\n '2020-01-05T12:00:00.000000000', '2020-01-06T12:00:00.000000000',\n '2020-01-07T12:00:00.000000000', '2020-01-08T12:00:00.000000000',\n '2020-01-09T12:00:00.000000000', '2020-01-10T12:00:00.000000000',\n '2020-01-11T12:00:00.000000000', '2020-01-12T12:00:00.000000000',\n '2020-01-13T12:00:00.000000000', '2020-01-14T12:00:00.000000000',\n '2020-01-15T12:00:00.000000000', '2020-01-16T12:00:00.000000000',\n '2020-12-26T12:00:00.000000000', '2020-12-27T12:00:00.000000000',\n '2020-12-28T12:00:00.000000000', '2020-12-29T12:00:00.000000000',\n '2020-12-30T12:00:00.000000000', '2020-12-31T12:00:00.000000000',\n '2021-01-01T12:00:00.000000000', '2021-01-02T12:00:00.000000000',\n '2021-01-03T12:00:00.000000000', '2021-01-04T12:00:00.000000000',\n '2021-01-05T12:00:00.000000000', '2021-01-06T12:00:00.000000000',\n '2021-01-07T12:00:00.000000000', '2021-01-08T12:00:00.000000000',\n '2021-01-09T12:00:00.000000000', '2021-01-10T12:00:00.000000000',\n '2021-01-11T12:00:00.000000000', '2021-01-12T12:00:00.000000000',\n '2021-01-13T12:00:00.000000000', '2021-01-14T12:00:00.000000000',\n '2021-01-15T12:00:00.000000000', '2021-01-16T12:00:00.000000000',\n '2021-12-26T12:00:00.000000000', '2021-12-27T12:00:00.000000000',\n '2021-12-28T12:00:00.000000000', '2021-12-29T12:00:00.000000000',\n '2021-12-30T12:00:00.000000000', '2021-12-31T12:00:00.000000000',\n '2022-01-01T12:00:00.000000000', '2022-01-02T12:00:00.000000000',\n '2022-01-03T12:00:00.000000000', '2022-01-04T12:00:00.000000000',\n '2022-01-05T12:00:00.000000000', '2022-01-06T12:00:00.000000000',\n '2022-01-07T12:00:00.000000000', '2022-01-08T12:00:00.000000000',\n '2022-01-09T12:00:00.000000000', '2022-01-10T12:00:00.000000000',\n '2022-01-11T12:00:00.000000000', '2022-01-12T12:00:00.000000000',\n '2022-01-13T12:00:00.000000000', '2022-01-14T12:00:00.000000000',\n '2022-01-15T12:00:00.000000000', '2022-01-16T12:00:00.000000000',\n '2022-12-26T12:00:00.000000000', '2022-12-27T12:00:00.000000000',\n '2022-12-28T12:00:00.000000000', '2022-12-29T12:00:00.000000000',\n '2022-12-30T12:00:00.000000000', '2022-12-31T12:00:00.000000000',\n '2023-01-01T12:00:00.000000000', '2023-01-02T12:00:00.000000000',\n '2023-01-03T12:00:00.000000000', '2023-01-04T12:00:00.000000000',\n '2023-01-05T12:00:00.000000000', '2023-01-06T12:00:00.000000000',\n '2023-01-07T12:00:00.000000000', '2023-01-08T12:00:00.000000000',\n '2023-01-09T12:00:00.000000000', '2023-01-10T12:00:00.000000000',\n '2023-01-11T12:00:00.000000000', '2023-01-12T12:00:00.000000000',\n '2023-01-13T12:00:00.000000000', '2023-01-14T12:00:00.000000000',\n '2023-01-15T12:00:00.000000000', '2023-01-16T12:00:00.000000000'],\n dtype='datetime64[ns]')", "crumbs": [ - "Cheatsheets & Guides" + "Tutorials", + "Dataset Specific", + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/OPERA.html#background", - "href": "quarto_text/OPERA.html#background", - "title": "OPERA", - "section": "Background", - "text": "Background\nThe Observational Products for End-Users from Remote Sensing Analysis (OPERA) product suite is designed to collect data from satellite radar and optical instruments to generate three products:\n\na near-global Dynamic Surface Water Extent (DSWx) product suite\na near-global land-surface Disturbance (DIST) product suite\na North America land-surface Displacement (DISP) product suite\n\nOnly DSWx products will be distributed through PO.DAAC. More information can be found on PO.DAAC’s OPERA webpage.", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#calculates-the-mean", + "href": "notebooks/datasets/smap_imerg_tutorial.html#calculates-the-mean", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "Calculates the mean", + "text": "Calculates the mean\n\n#subsets to the location of the pacific coast and California \nsubset_location = allsubset_files.where((allsubset_files.latitude>20)&(allsubset_files.latitude<50)&(allsubset_files.longitude>-140)&(allsubset_files.longitude<-100), drop=True)\n\n#calculates the mean for the 'smap_sss' variable\nsubset_mean_values = np.nanmean(subset_location['smap_sss'], axis=0)\n\n#gets rid of past mean value if you were to run this code again with different dates\nif 'backup_subset_mean_values' in globals():\n del backup_subset_mean_values\n \n#plots the figure and saves it to your output path\nfig = plt.figure(figsize= (16,10))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\ns = plt.pcolormesh(subset_location.longitude, subset_location.latitude, subset_mean_values, vmin = 33, vmax= 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ncb = plt.colorbar(s)\ncb.set_label('psu')\nax.set_title(f'SSS mean over 12/26 to 1/16 (2015-2023)', size = 24)\nax.grid()\nax.add_feature(cfeature.OCEAN)\nax.add_feature(cfeature.LAND)\nax.add_feature(cfeature.LAKES)\nax.add_feature(cfeature.RIVERS)\nax.add_feature(cfeature.STATES)\nax.coastlines()\nax.set_xlim(-130, -115)\nax.set_ylim(32, 42.5)\n\n#saves figure to output path \nplt.savefig(outputpath+datetime.now().strftime(\"%Y%m%d-%H%M%S\")+'.png',dpi=400, facecolor='w', transparent=False, bbox_inches='tight')\n\n/var/folders/f0/dgnqgvtx46513by9cdh6fnjw0000gq/T/ipykernel_66947/1610522150.py:5: RuntimeWarning: Mean of empty slice\n subset_mean_values = np.nanmean(subset_location['smap_sss'], axis=0)", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA" + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/OPERA.html#data-resources-tutorials", - "href": "quarto_text/OPERA.html#data-resources-tutorials", - "title": "OPERA", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nImagery Exploration\nSurface Water Extent Worldview StoryMap\nSOTO by Worldview - explore OPERA imagery in a GUI\nVideo Tutorial: Exploring OPERA Surface Water Extent Data in NASA Worldview\n\n\nSearch & Download\nVia Graphical User Interface:\nFind/download OPERA data on Earthdata Search\nVia Command Line - PO.DAAC subscriber/downloader example:\npodaac-data-subscriber -c OPERA_L3_DSWX-HLS_V1 -d ./data/OPERA_L3_DSWX-HLS_V1 --start-date 2023-04-04T00:00:00Z -e .tif\n\nSee how to Download/Subscribe for more information on how to use the PO.DAAC subscriber/downloader.\n\n\n\nWorkflow tutorials: Access & Visualization\nAWS Cloud: OPERA Dynamic Surface Water Extent (DSWx) Data - How to search for, access, visualize, and mosaic OPERA data over lake Powell while working in the cloud.\nLocal Machine: OPERA Dynamic Surface Water Extent (DSWx) Data - How to search for, download, visualize, and mosaic OPERA data over lake Powell while working on a local machine.\n\n\nGIS workflows\nStoryMap: Exploring Water Surface Extent with Satellite Data\nOPERA ArcGIS Toolbox - GitHub repository with three geoprocessing tools: OPERA Granule Download, OPERA Granule Filter, and OPERA Raster Mosaic", + "objectID": "notebooks/datasets/smap_imerg_tutorial.html#plot-the-anomalies-for-subset-bounds", + "href": "notebooks/datasets/smap_imerg_tutorial.html#plot-the-anomalies-for-subset-bounds", + "title": "SMAP Sea Surface Salinity and IMERG Precipitation Tutorial", + "section": "plot the anomalies for subset bounds", + "text": "plot the anomalies for subset bounds\n\n#Plots precip data only over land, using a colorscale\nmode_choice = 2 \n\n#currently, the line below is commented but you can uncomment this line and it will display raw SSS values (doesnt calculate anomalies) \n#calc_anomaly = 0 \n\n#calculate anomalies relative to the mean\ncalc_anomaly = 1 \n\n#Replace with your dictory for IMERG precip data\ndirectory = os.path.join(base_directory, 'Desktop/imerg_precip')\nif 'backup_subset_mean_values' not in globals():\n backup_subset_mean_values = subset_mean_values\n\n#raw sss values\nif calc_anomaly == 0:\n subset_mean_values = 0\n smin = 31\n smax = 34.5 \n smap = 'rainbow'\n\n#anomaly values\nif calc_anomaly != 0:\n subset_mean_values = backup_subset_mean_values \n smin = -1\n smax = +1 \n smap = 'seismic'\n\n#Replace with your directory \nsss_subset = sorted(glob.glob(os.path.join(base_directory, 'Desktop/jpl_smap_l3/SMAP*.nc*')))\n\n#grabs the sss file date for the subset location and plots anomalies\nfor filename in sss_subset:\n file_date = filename.split('_')[-3].replace('.nc', '')\n updated_file_date = file_date[0:4]+'-'+file_date[4:6]+'-'+file_date[6:8]\n if int(file_date) < int(subset_bounds[0]) or int(file_date) > int(subset_bounds[1]):\n continue\n print(file_date)\n sss_ds = xr.open_dataset(filename)\n try:\n sss_ds = sss_ds.where((sss_ds.latitude>20)&(sss_ds.latitude<50)&(sss_ds.longitude>-140)&(sss_ds.longitude<-100), drop=True)- subset_mean_values\n if sss_ds.smap_sss.size == 0:\n continue\n except Exception as e:\n print(e)\n continue\n plt.rcParams.update({\"font.size\": 24})\n fig = plt.figure(figsize= (16,10))\n ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())\n\n #grabs the precip file date for the subset location and plots \n substring = file_date\n precip_counter = 0\n for file_path in glob.glob(os.path.join(directory, f'*{substring}*')):\n precip_counter += 1\n if precip_counter >1:\n crashnow\n print(file_path)\n precip = xr.open_dataset(file_path)\n precip = precip.where((precip.lat>20)&(precip.lat<50)&(precip.lon>-140)&(precip.lon<-100),drop=True)\n val = 24*precip.HQprecipitation[0,:,:]/(0.5*precip.HQprecipitation_cnt[0,:,:])\n if mode_choice == 2: \n p = plt.pcolormesh(precip.lon,precip.lat,val.transpose(), cmap = 'viridis', vmax = 20, vmin = 0, transform = ccrs.PlateCarree())\n cb = plt.colorbar(p, fraction=0.046, pad=0.04)\n cb.set_label('mm/day')\n\n #the line below plots the raw sss values if its uncommented\n s = plt.pcolormesh(sss_ds.longitude, sss_ds.latitude, sss_ds.smap_sss, vmin = smin, vmax = smax, cmap = smap, transform = ccrs.PlateCarree())\n \n #adds the colorbar and features to the plot\n cb = plt.colorbar(s, location = 'left', fraction=0.046, pad=0.04)\n if calc_anomaly == 1:\n cb.set_label(f'psu anomalies wrt mean of 12/26 to 1/16 (2015-23)')\n ax.set_title(f'SSS Anomaly over ocean, Precipitation on land\\n{updated_file_date}', size = 24)\n if calc_anomaly != 1:\n cb.set_label('psu')\n ax.set_title(f'SSS over ocean, Precipitation on land\\n{updated_file_date}', size = 24)\n ax.grid()\n ax.add_feature(cfeature.OCEAN)\n ax.add_feature(cfeature.LAND)\n ax.add_feature(cfeature.LAKES)\n ax.add_feature(cfeature.RIVERS)\n ax.add_feature(cfeature.STATES)\n ax.coastlines()\n ax.set_xlim(-130, -115)\n ax.set_ylim(32, 42.5)\n\n #saves figure to output path \n plt.savefig(outputpath+datetime.now().strftime(\"%Y%m%d-%H%M%S\")+'.png',dpi=400, facecolor='w', transparent=False, bbox_inches='tight')\n\n/var/folders/f0/dgnqgvtx46513by9cdh6fnjw0000gq/T/ipykernel_66947/576375500.py:48: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).\n fig = plt.figure(figsize= (16,10))", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA" + "SMAP", + "Use Case Demo" ] }, { - "objectID": "quarto_text/OPERA.html#additional-resources", - "href": "quarto_text/OPERA.html#additional-resources", - "title": "OPERA", - "section": "Additional Resources", - "text": "Additional Resources\nOPERA Applications GitHub Notebooks - check out the leafmap examples!\nNASA Mission Page", + "objectID": "notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html#how-to-manually-fix-a-phase-unwrapping-error-in-pixc-data", + "href": "notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html#how-to-manually-fix-a-phase-unwrapping-error-in-pixc-data", + "title": "SWOT PIXC Dataset Phase Unwrapping on a local machine", + "section": "How to manually fix a phase unwrapping error in PIXC data", + "text": "How to manually fix a phase unwrapping error in PIXC data\n\nRequirement:\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\nLearning Objectives:\n\nLearn how to identify phase unwrapping errors\nLearn how to correct a phase unwrapping error by adding multiples of 2pi to the phase\nAccess SWOT PIXC data products (archived in NASA Earthdata Cloud) by downloading to local machine\nVisualize accessed data, identify phase unwrapping error, break phase unwrapping regions, find best ambiguity, correct the height and locations\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\n\n\n\n\nBackground\nThis notebook targets expert users, and assumes the reader is already familiarized with terms like “layover”, “phase unwrapping”, and “backscatter”/“phase”. For detailed background on SWOT definitions and conventions, see the SWOT User Handbook .\nNotebook Author: Brent Williams (NASA JPL, July 2024)\nLast updated: 18 July 2024\n\n\nLibraries Needed\n\nimport glob\nimport h5netcdf\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport earthaccess\nimport scipy.ndimage\nimport contextily as cx\nimport dask # I was getting errors not having this\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n1. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n granule_name = '*525_020_171R_*') # Santana do Sobrado, cycle 525 pass 020 tile 171R\n\nGranules found: 1\n\n\nLet’s download one data file! Since earthaccess.download requires the input to be in list format, we need to enclose the single file in brackets.\n\nearthaccess.download([pixc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.4 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXC_525_020_171R_20230519T064311_20230519T064322_PGC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). We will focus on the “pixel cloud” group. In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXC_*525_020_171R*.nc\", group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 4584708, complex_depth: 2,\n num_pixc_lines: 3253)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(4584708, 2), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3253\n interferogram_size_range: 4598\n looks_to_efflooks: 1.5394042762332962\n num_azimuth_looks: 7.0\n azimuth_offset: 9xarray.DatasetDimensions:points: 4584708complex_depth: 2num_pixc_lines: 3253Coordinates: (2)latitude(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(4584708, 2), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708, 2)\n(4584708, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 4584708\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3253interferogram_size_range :4598looks_to_efflooks :1.5394042762332962num_azimuth_looks :7.0azimuth_offset :9\n\n\n\n\nPlot the PIXC data only for good/detected water\n\n# set Coordinate Reference System (CRS) as WGS84 for contextily basemap\ncrs='EPSG:4326'\n\n\n# Create a mask to filter out good water pixels based on classification and geolocation quality\n# - ds_PIXC.classification > 2: selects pixels classified as water\n# - ds_PIXC.geolocation_qual < 4: selects pixels with good geolocation quality\nmask = np.where(np.logical_and(ds_PIXC.classification > 2, ds_PIXC.geolocation_qual <4))\nfig, ax = plt.subplots(figsize=(15,5))\nscat = ax.scatter(x=ds_PIXC.longitude[mask], y=ds_PIXC.latitude[mask], c=ds_PIXC.height[mask],\n s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\nfig.colorbar(scat).set_label('height (m)')\n\n\n\n\n\n\n\n\nConverting a wrapped, ambiguous InSAR phase (known only within a 2π interval) to an absolute phase is known as phase unwrapping. Phase unwrapping errors happen when incorrect multiples of 2π are added to the wrapped phase, leading to errors in both height and geolocation. Note in the above image how the river at the outlet of the reservoir is unrealistically higher than the reservoir. The large height offset, along with a large cross-track slope and a shifted geolocation (e.g., relative to the water in the basemap image) are characteristic signatures of a phase unwrapping error. This can happen especially near dams where the water on both sides ends up in the same spatial phase unwrapping region. In such a case as this, a single absolute ambiguity is assigned to the entire region that includes both the reservoir and the river, while the phase/height discontinuity at the dam is not well captured within one phase ambiguity.\nThe way to correct this is by splitting the region into two (i.e., one for the reservoir and one for the river) and assigning a separate phase ambiguity to each region (i.e., a different multiple of 2π). We will do this processing in the slant-plane image (e.g., in radar coordinates) because the spatial connectedness/topology is preserved among adjacent pixels without the additional geolocation noise that exists in the phase-geolocated lat/lon projection.\n\n\nMake function to map a PIXC variable to slant-plane/radar coordiantes\n\ndef toslant(pixc, key='height'):\n az = pixc.azimuth_index.astype(int)\n rng = pixc.range_index.astype(int)\n out = np.zeros((pixc.interferogram_size_azimuth + 1, pixc.interferogram_size_range + 1)) + np.nan\n # handle complex interferogram\n if key=='interferogram':\n out = out.astype('complex64')\n var = pixc[key][:,0] + 1j * pixc[key][:,1]\n else:\n var = pixc[key]\n out[az, rng] = var\n return out\n\n\n\nGet the desired data variables in slant plane\n\nheight = toslant(ds_PIXC, key='height')\nlat = toslant(ds_PIXC, key='latitude')\nlon = toslant(ds_PIXC, key='longitude')\nklass = toslant(ds_PIXC, key='classification')\nregion = toslant(ds_PIXC, key='phase_unwrapping_region')\ndheight_dphase = toslant(ds_PIXC, key='dheight_dphase')\ndlat_dphase = toslant(ds_PIXC, key='dlatitude_dphase')\ndlon_dphase = toslant(ds_PIXC, key='dlongitude_dphase')\nifgram = toslant(ds_PIXC, key='interferogram')\npower_plus_y = toslant(ds_PIXC, key='power_plus_y')\npower_minus_y = toslant(ds_PIXC, key='power_minus_y')\ncross_track = toslant(ds_PIXC, key='cross_track')\n\n\n\nPlot the height image in slant-plane (for all pixels)\n\nplt.imshow(height, interpolation='none', cmap='jet', aspect='auto')\nplt.clim((300,400))\nplt.colorbar().set_label('height (m)')\n\n\n\n\n\n\n\n\n\n\nPlot the phase unwrapping regions\nA key step in SWOT’s phase unwrapping algorithm is to separate the image into regions where a single phase ambiguity is expected to be shared. These are referred to as “phase unwrapping regions” and are accessible in the PIXC product. Note that both the reservoir and the river both have the same phase unwrapping region id (e.g., region==2).\n\nplt.imshow(region, interpolation='none', cmap='tab10', aspect='auto')\nplt.clim((-1,8))\nplt.colorbar().set_label('phase unwrapping region')\n\n\n\n\n\n\n\n\n\n\nGet a mask for only the pixels in region 2\n\nmask = np.where(region == 2)\nregion_mask = np.zeros_like(region)\nregion_mask[mask] = 1\nplt.imshow(region_mask, interpolation='none', cmap='tab10', aspect='auto')\nplt.colorbar().set_label('phase unwrapping 2')\n\n\n\n\n\n\n\n\n\n\n\nPlot the classification image\nWater-water layover describes the phenomenon where multiple waterbodies are in layover. This is in contrast to land-water layover, where land overlies water. Note that when water-water layover occurs, the backscattering (i.e. sig0) is bright, but the coherence tends to be low (because the phase from the two laid-over water-bodies with different heights/phases mix together). Water-water-layover tends to happen near dams/reservoir outlets, although it depends on the relative orientation in the swath. When water-water-layover happens near a dam, the coherence tends to drop right near the transition between reservoir and river. Thus, we can use the low-coherence water classes in the classification image to help split the regions in two.\n\n# plot the classification image\nplt.imshow(klass, interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('classification')\n\n\n\n\n\n\n\n\n\n# zoom in around the dam\nplt.imshow(klass[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('classification')\n\n\n\n\n\n\n\n\n\n\nUse the low-coherence zone to break the image into multiple segments\nAs mentioned above, we expect water-water-layover near a dam to have a low-coherence zone the coherence right by the transition between reservoir and river. These low-coherence zones are assigned their own classification value in the PIXC product. Here, we use the low-coherence water classes in the classification image to help split the regions in two. This will address the problem where the river channel and reservoir share a phase unwrapping region.\n\n# plot the zoomed-in interferometric coherence for reference\ncoh = abs(ifgram) / np.sqrt(power_plus_y * power_minus_y)\nplt.imshow(coh[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('interferometric coherence')\n\n\n\n\n\n\n\n\n\n# plot the zoomed-in region mask for reference\nplt.imshow(region_mask[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('region mask before')\n\n\n\n\n\n\n\n\n\n\nBreak the region at low-coherence/bright areas by zeroing out low-coherence areas from the mask\n\nlow_coh = np.zeros_like(region_mask)\n#low_coh[coh<0.5] = 1\n## do some dilations to make sure the water-water-layover area is chopped out\n#low_coh = scipy.ndimage.binary_dilation(low_coh)\n## dont do this close to swath edges since the coherence is lower there and we get a bunch of pixels detected as low-coherence\n#low_coh [cross_track<20000] = 0\n#low_coh [cross_track>80000] = 0\nlow_coh[klass>=6] = 1\nregion_mask[low_coh>0] = 0\nplt.imshow(region_mask[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('region mask after')\n\n\n\n\n\n\n\n\n\nNow segment the mask into multiple disconnected regions\n\n# segment the mask\nlab, nlabs = scipy.ndimage.label(region_mask)\nplt.imshow(lab, interpolation='none', cmap='jet', aspect='auto')\nplt.clim((0,2))\nplt.colorbar().set_label('segmented mask')\n\n\n\n\n\n\n\n\n\n\nSplit out the biggest segment (the reservoir) from the rest (river)\n\nnew_regions = np.zeros_like(region)\nnew_regions[lab==1] = 1 # the biggest one (i.e., the reservoir)\nnew_regions[lab>1] = 2 # the rest\nplt.imshow(new_regions, interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('new_regions')\n\n\n\n\n\n\n\n\n\n\nAdjust the height and locations corresponding to 2π phase offsets\nNote that this approach of moving along the geolocation sensitivities to phase (e.g., dheight_dphase, dlat_dphase, dlon_dphase) is an approximation. The more robust thing to do would be to add/subtract 2π increments to the absolute phase and regeolocate each pixel. The approximation is generally good if we are only moving a few ambiguities away, but gets worse if we need to move many multiples of 2π.\n\n# set up some more masks\nriver_mask = np.zeros_like(new_regions) + np.nan\nriver_mask[new_regions==2] = 1\nriver_msk = river_mask==1\nlake_msk = new_regions==1\n\n\n\nTry adjusting the river region by +1 ambiguity\n\nn = 1 # first, we try a +1 phase ambiguity\nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nNope! By the bad geolocation and unrealistic river slope, we can see that made things worse.\n\n\nTry adjusting river by -1 ambiguity (in the other direction)\n\nn = -1 # now, let's try a -1 phase ambiguity\nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nThat looks right. The river lines up better with the basemap, the height and slope of the river seem more realistic. But we should check the -2 ambiguity to be sure there is not an even better solution.\n\n\nTry adjusting river by -2 ambiguities\n\nn = -2. # now, let's try a -2 phase ambiguity \nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nNope. That’s not it either. Now the river is shifted too much in the other direction and has a large slope flowing the wrong way (into the reservoir). This means that the best ambiguity for the river is -1!\n\n\nAlternative Plots\n\n# alternative plots with wrapped heights\n# original ambiguity\n#fig, ax = plt.subplots(figsize=(15,5))\n#ax.scatter(lon[lake_msk], lat[lake_msk], c=np.mod(height[lake_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#ax.scatter(lon[river_msk], lat[river_msk], c=np.mod(height[river_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#cx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\n#ax.set_xlabel('lon')\n#ax.set_ylabel('lat')\n#fig.colorbar(scat).set_label('height (m), 1m wrap')\n\n\n# adjusted ambiguity\n#fig, ax = plt.subplots(figsize=(15,5))\n#ax.scatter(lon[lake_msk], lat[lake_msk], c=np.mod(height[lake_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#ax.scatter(new_lon[river_msk], new_lat[river_msk], c=np.mod(new_height[river_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#cx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap)\n#ax.set_xlabel('lon')\n#ax.set_ylabel('lat')\n#fig.colorbar(scat).set_label('height (m), 1m wrap')", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA" + "SWOT", + "Access & Visualization", + "PIXC Phase Unwrap" ] }, { - "objectID": "quarto_text/ScienceDataStories.html#pairing-cloud-and-non-cloud-data", - "href": "quarto_text/ScienceDataStories.html#pairing-cloud-and-non-cloud-data", - "title": "Science Data Stories", - "section": "Pairing Cloud and Non-cloud Data", - "text": "Pairing Cloud and Non-cloud Data\nTutorials highlighting workflows that utilize both cloud and non-cloud data simultaneously.\n\nMississippi River Heights Exploration - Tutorial\nThis tutorial explores the relationships between satellite and in situ river heights in the Mississippi River using Pre-SWOT MEaSUREs and USGS river height gauges within the cloud.\n\n\nSea Surface Temperature Ocean Satellite & In-situ Comparison - Tutorial\nThis tutorial co-locates in-situ measurements and satellite data of sea surface temperature (SST) near the European coast for cross-validation of data or model validation. Datasets: Argo floats, MODIS-Aqua L2 SST, & MUR L4 SST.", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#in-aws-cloud-version", + "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#in-aws-cloud-version", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", + "section": "In AWS Cloud Version", + "text": "In AWS Cloud Version\n\nAuthors: Nicholas Tarpinian, PO.DAAC | Catalina Taglialatela (JPL, PO.DAAC)", "crumbs": [ "Tutorials", - "Science Data Stories" + "Dataset Specific", + "SWOT", + "Access & Visualization", + "Raster Multifile", + "Cloud" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#introduction", - "href": "quarto_text/DataSubscriberDownloader.html#introduction", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Introduction", - "text": "Introduction\n\nDownloader\nThe Downloader is useful if you need to download PO.DAAC data once in a while or prefer to do it “on-demand”. The Downloader makes no assumptions about the last time run or what is new in the archive, it simply uses the provided requests and downloads all matching data.\n\n\nSubscriber\nThe subscriber is useful for users who need to continuously pull the latest data from the PO.DAAC archive. If you feed data into a model or real time process, the subscriber allows you to repeatedly run the script and only download the latest data.\n\n\nInstallation\nBoth subscriber and downloader require Python >= 3.7.\nThe subscriber and downloader scripts are available in the pypi python repository, it can be installed via pip:\npip install podaac-data-subscriber\nyou should now have access to the downloader and subscriber Command line interfaces.\n\nNote: If after installation, the podaac-data-subscriber or podaac-data-downloader commands are not available, you may need to add the script location to the PATH. This could be due to a User Install of the python package, which is common on shared systems where python packages are installed for the user (not the system). See Installing to the User Site and User Installs for more information on finding the location of installed scripts and adding them to the PATH.\n\nTo use the Subscriber or Downloader, you will need to have an Earthdata login account. You will also need a netrc file with your Earthdata Login credentials to access the data. Follow these authentication instructions to create your netrc if you do not have one already.", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#summary-learning-objectives", + "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#summary-learning-objectives", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", + "section": "Summary & Learning Objectives", + "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with multiple files from the SWOT Raster Image data product version 2.0 in the cloud\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on user’s choice; choosing between two resolutions either by ‘100m’ or ‘250m’.\nVisualizing multiple raster images on a single map.\nStacking multiple raster images and creating a time dimension to analyze over time.\nAdjusting images based on quality flag", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "Access & Visualization", + "Raster Multifile", + "Cloud" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#command-cmd-line-examples", - "href": "quarto_text/DataSubscriberDownloader.html#command-cmd-line-examples", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Command (cmd) Line Examples", - "text": "Command (cmd) Line Examples\nThe dataset listing pages on the PO.DAAC Portal provide cmd line examples for each dataset respectively. For example, on a MUR SST dataset landing page, if you click the Download icon under Capabilities on the right side, the following script for the subscriber should be visible:\npodaac-data-subscriber -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2002-08-31T21:00:00Z\nDownloading simulated SWOT Raster data over a specified region and time:\npodaac-data-downloader -c SWOT_SIMULATED_NA_CONTINENT_L2_HR_Raster_V1 -d ./SWOT_SIMULATED_NA_CONTINENT_L2_HR_Raster_V1 --start-date 2022-08-02T00:00:00Z --end-date 2022-08-22T00:00:00Z -b=\"-97,32.5,-96.5,33\"\nSubscribing to the [GRACE-FO Monthly Ocean Bottom Pressure Anomaly Dataset]:(https://podaac.jpl.nasa.gov/dataset/TELLUS_GRFO_L3_CSR_RL06_OCN_v04)\npodaac-data-subscriber -c TELLUS_GRFO_L3_CSR_RL06_OCN_v04 -d ./data/TELLUS_GRFO_L3_CSR_RL06_OCN_v04 --start-date 2018-05-22T00:00:00Z", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#requirements", + "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#requirements", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via an s3fs session; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - This workflow as written works on a 14.8 GB RAM, upto 3.7 CPU cloud compute instance type. Smaller instances tent to crash.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport io\nimport s3fs\nimport xarray as xr\nimport numpy as np\nfrom datetime import datetime\nfrom pathlib import Path\nimport hvplot\nimport hvplot.xarray \nimport earthaccess", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "Access & Visualization", + "Raster Multifile", + "Cloud" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#tutorial-examples-utilizing-the-po.daac-subscriberdownloader", - "href": "quarto_text/DataSubscriberDownloader.html#tutorial-examples-utilizing-the-po.daac-subscriberdownloader", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Tutorial Examples Utilizing the PO.DAAC Subscriber/Downloader:", - "text": "Tutorial Examples Utilizing the PO.DAAC Subscriber/Downloader:\n\nSWOT NetCDF to Geotiff Conversion", + "objectID": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#authentication-with-earthaccess", + "href": "notebooks/datasets/SWOT_Raster_Notebook_cloud.html#authentication-with-earthaccess", + "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch for SWOT Raster products using earthaccess\nEach dataset has its own unique collection concept ID. For the SWOT_L2_HR_Raster_2.0 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Mead Reservoir in the United States.\nWe used bbox finder to get the exact coordinates for our area of interest.\n\nraster_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-115.112686,35.740939,-114.224167,36.937819),\n temporal =('2024-02-01 12:00:00', '2024-02-01 23:59:59'),\n granule_name = '*_100m_*', #specify we are interested in the 100m standard raster\n count =200\n)\n\nGranules found: 2\n\n\n\n\nVisualizing Multiple Tiles\nLet’s now visualize multiple raster tiles that we searched and explore the data.\nUtilizing xarray.open_mfdataset which supports the opening of multiple files.\n\nds = xr.open_mfdataset(earthaccess.open(raster_results), engine='h5netcdf',combine='nested', concat_dim='x')\nds\n\nOpening 2 granules, approx size: 0.07 GB\nusing endpoint: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (y: 2784, x: 3074)\nCoordinates:\n * y (y) float64 3.899e+06 3.899e+06 ... 4.177e+06\n * x (x) float64 5.391e+05 5.392e+05 ... 7.217e+05\nData variables: (12/39)\n crs (x) object b'1' b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(512, 513), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(512, 513), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(2784, 1538), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(768, 769), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(768, 769), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T08:37:45Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 539100.0\n x_max: 692800.0\n y_min: 4023100.0\n y_max: 4176900.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:y: 2784x: 3074Coordinates: (2)y(y)float643.899e+06 3.899e+06 ... 4.177e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3898600., 3898700., 3898800., ..., 4176700., 4176800., 4176900.])x(x)float645.391e+05 5.392e+05 ... 7.217e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([539100., 539200., 539300., ..., 721500., 721600., 721700.])Data variables: (39)crs(x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1', ..., b'1', b'1', b'1'], dtype=object)longitude(y, x)float64dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(512, 513), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(2784, 1538), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(768, 769), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nIndexes: (2)yPandasIndexPandasIndex(Float64Index([3898600.0, 3898700.0, 3898800.0, 3898900.0, 3899000.0, 3899100.0,\n 3899200.0, 3899300.0, 3899400.0, 3899500.0,\n ...\n 4176000.0, 4176100.0, 4176200.0, 4176300.0, 4176400.0, 4176500.0,\n 4176600.0, 4176700.0, 4176800.0, 4176900.0],\n dtype='float64', name='y', length=2784))xPandasIndexPandasIndex(Float64Index([539100.0, 539200.0, 539300.0, 539400.0, 539500.0, 539600.0,\n 539700.0, 539800.0, 539900.0, 540000.0,\n ...\n 720800.0, 720900.0, 721000.0, 721100.0, 721200.0, 721300.0,\n 721400.0, 721500.0, 721600.0, 721700.0],\n dtype='float64', name='x', length=3074))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T08:37:45Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :218scene_number :45tile_numbers :[88 89 90 91 88 89 90 91]tile_names :218_088L, 218_089L, 218_090L, 218_091L, 218_088R, 218_089R, 218_090R, 218_091Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T18:38:14.266613Ztime_granule_end :2024-02-01T18:38:35.362539Ztime_coverage_start :2024-02-01T18:38:14.805141Ztime_coverage_end :2024-02-01T18:38:34.816548Zgeospatial_lon_min :-116.55823577002582geospatial_lon_max :-114.84459394683485geospatial_lat_min :36.350992807631336geospatial_lat_max :37.724496129136035left_first_longitude :-115.14314896157633left_first_latitude :37.724496129136035left_last_longitude :-114.84459394683485left_last_latitude :36.5951883116925right_first_longitude :-116.55823577002582right_first_latitude :37.474717676188774right_last_longitude :-116.24045666354958right_last_latitude :36.350992807631336xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_218_088L_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_089L_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_088R_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_089R_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091R_20240201T183834_20240201T183845_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_218_088L_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_089L_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_088R_20240201T183804_20240201T183815_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_089R_20240201T183814_20240201T183825_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091R_20240201T183834_20240201T183845_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :539100.0x_max :692800.0y_min :4023100.0y_max :4176900.0institution :CNESproduct_version :01\n\n\n\nraster_plot = ds.wse.hvplot.quadmesh(x='x', y='y', rasterize=True, title=f'SWOT Raster 100m: Lake Mead Reservoir')\nraster_plot.opts(width=700, height=600, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nCreating a Time Series\nSWOT Raster product does not include a time dimension, each file is a snapshot in time, but it can be inserted by extracting from the file name.\n\nExpand the time range of your earthaccess search to get an adequate range.\nExtract the datetime from the s3 file name then concatenate based on the new time dimension.\n\n\ntime_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-114.502048,36.060175,-114.390983,36.210182),\n temporal =('2024-01-25 00:00:00', '2024-03-04 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 3\n\n\n\nfs_s3 = earthaccess.get_s3fs_session(results=time_results)\n\n\n# Get links list\nraster = []\nfor g in time_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n raster.append(l)\n\nprint(len(raster))\nraster\n\n3\n\n\n['s3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc',\n 's3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc',\n 's3://podaac-swot-ops-cumulus-protected/SWOT_L2_HR_Raster_2.0/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc']\n\n\n\ndef add_time_dimension(ds, file_path):\n # Extract filename from s3 file path\n file_name = file_path.split('/')[-1]\n # Extract date/time string from filename\n date_str = file_name.split('_')[-4][:15]\n # Convert the date string to a datetime object\n time_value = datetime.strptime(date_str, \"%Y%m%dT%H%M%S\")\n # Assign the time coordinate to the dataset\n ds.coords['time'] = time_value\n return ds\n\n\ndatasets = []\nfile_names = []\n\nfor file_path in raster:\n with fs_s3.open(file_path, 'rb') as file:\n file_bytes = file.read()\n file_obj = io.BytesIO(file_bytes)\n dataset = xr.open_dataset(file_obj, engine='h5netcdf')\n dataset_with_time = add_time_dimension(dataset, file_path)\n datasets.append(dataset_with_time)\n file_names.append(file_path.split('/')[-1])\n dataset.close()\n\n\n# sorting the time dimension in correct order\ndatasets.sort(key=lambda ds: ds.time.values)\n\n\nds2 = xr.concat(datasets, dim='time')\nds2\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1549, y: 1549, time: 3)\nCoordinates:\n * x (x) float64 6.788e+05 6.789e+05 ... 8.336e+05\n * y (y) float64 3.9e+06 3.901e+06 ... 4.055e+06\n * time (time) datetime64[ns] 2024-02-01T07:50:48 ... 20...\nData variables: (12/39)\n crs (time) object b'1' b'1' b'1'\n longitude (time, y, x) float64 nan nan nan ... nan nan nan\n latitude (time, y, x) float64 nan nan nan ... nan nan nan\n wse (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual_bitwise (time, y, x) float64 nan nan nan ... nan nan nan\n ... ...\n load_tide_fes (time, y, x) float32 nan nan nan ... nan nan nan\n load_tide_got (time, y, x) float32 nan nan nan ... nan nan nan\n pole_tide (time, y, x) float32 nan nan nan ... nan nan nan\n model_dry_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n model_wet_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n iono_cor_gim_ka (time, y, x) float32 nan nan nan ... nan nan nan\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T12:55:01Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 680100.0\n x_max: 829300.0\n y_min: 3903300.0\n y_max: 4052400.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1549y: 1549time: 3Coordinates: (3)x(x)float646.788e+05 6.789e+05 ... 8.336e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([678800., 678900., 679000., ..., 833400., 833500., 833600.])y(y)float643.9e+06 3.901e+06 ... 4.055e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3900500., 3900600., 3900700., ..., 4055100., 4055200., 4055300.])time(time)datetime64[ns]2024-02-01T07:50:48 ... 2024-02-...array(['2024-02-01T07:50:48.000000000', '2024-02-11T17:00:50.000000000',\n '2024-02-22T04:35:54.000000000'], dtype='datetime64[ns]')Data variables: (39)crs(time)objectb'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1'], dtype=object)longitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])latitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])wse(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])wse_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])water_area_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])sig0_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)inc(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)cross_track(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)illumination_time(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')illumination_time_tai(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')n_wse_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_water_area_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_sig0_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_other_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])dark_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_clim_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_dyn_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)layover_impact(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_cor_atmos_model(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)height_cor_xover(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)geoid(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)solid_earth_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_fes(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_got(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)pole_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_dry_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_wet_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)iono_cor_gim_ka(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)Indexes: (3)xPandasIndexPandasIndex(Float64Index([678800.0, 678900.0, 679000.0, 679100.0, 679200.0, 679300.0,\n 679400.0, 679500.0, 679600.0, 679700.0,\n ...\n 832700.0, 832800.0, 832900.0, 833000.0, 833100.0, 833200.0,\n 833300.0, 833400.0, 833500.0, 833600.0],\n dtype='float64', name='x', length=1549))yPandasIndexPandasIndex(Float64Index([3900500.0, 3900600.0, 3900700.0, 3900800.0, 3900900.0, 3901000.0,\n 3901100.0, 3901200.0, 3901300.0, 3901400.0,\n ...\n 4054400.0, 4054500.0, 4054600.0, 4054700.0, 4054800.0, 4054900.0,\n 4055000.0, 4055100.0, 4055200.0, 4055300.0],\n dtype='float64', name='y', length=1549))timePandasIndexPandasIndex(DatetimeIndex(['2024-02-01 07:50:48', '2024-02-11 17:00:50',\n '2024-02-22 04:35:54'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T12:55:01Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :205scene_number :109tile_numbers :[216 217 218 219 216 217 218 219]tile_names :205_216L, 205_217L, 205_218L, 205_219L, 205_216R, 205_217R, 205_218R, 205_219Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T07:50:48.872250Ztime_granule_end :2024-02-01T07:51:09.965949Ztime_coverage_start :2024-02-01T07:50:49.410994Ztime_coverage_end :2024-02-01T07:51:09.428854Zgeospatial_lon_min :-115.01465895670609geospatial_lon_max :-113.33094509647773geospatial_lat_min :35.225727504637376geospatial_lat_max :36.595188311791034left_first_longitude :-115.01465895670609left_first_latitude :35.46460890403489left_last_longitude :-114.72680781313967left_last_latitude :36.595188311791034right_first_longitude :-113.63706815703668right_first_latitude :35.225727504637376right_last_longitude :-113.33094509647773right_last_latitude :36.350992807533125xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :680100.0x_max :829300.0y_min :3903300.0y_max :4052400.0institution :CNESproduct_version :01\n\n\n\ntimeplot = ds2.wse.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nLet’s plot the wse quality flag, wse_qual which ranges 0-3 where 0=good, 1=suspect, 2=degraded, 3=bad (as described when printing variable with xarray).\n\ntimeplot = ds2.wse_qual.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nMasking a variable with its quaility flag\n\nvariable_to_mask = ds2['wse']\nmask_variable = ds2['wse_qual']\n\n\n# Define the condition for masking based on the range of the quaility flag\nmask_condition = mask_variable <2\n\nmasked_variable = variable_to_mask.where(mask_condition)\n\n\n# Update the masked variable in the dataset\nds2['wse'] = masked_variable\n\nds2['wse'].hvplot.image(y='y', x='x').opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nOur end product is a time series of the data showing only the values where the quality flag is either good (0) or suspect (1).\n\n\nAppendix: Alternate Plot\n\n# # Alternate plotting with matplotlib\n# %matplotlib inline\n\n# import matplotlib.pyplot as plt\n# from matplotlib import animation\n# from matplotlib.animation import FuncAnimation, PillowWriter\n# from IPython.display import display, Image, HTML\n\n# variable_name = 'wse'\n# data = ds2[variable_name]\n\n# fig, ax = plt.subplots(figsize=(10, 8))\n# fig.set_tight_layout({'rect': [0.01, 0.01, 1.0, 1.0]})\n\n# contour = ax.contourf(data.isel(time=0), cmap='viridis')\n# cbar = plt.colorbar(contour)\n# cbar.set_label('Water Surface Elevation (meters)', fontsize=14) \n# times = ds2.time.values\n\n# # Function to update the plot for each time step\n# def update(frame):\n# ax.clear()\n# contour = ax.contourf(data.isel(time=frame), cmap='viridis')\n# formatted_time = str(times[frame])[:-7]\n# ax.set_title(f'Date: {formatted_time}')\n# ax.set_xlabel('Longitude', fontsize=14)\n# ax.set_ylabel('Latitude', fontsize=14)\n# ax.text(0.5, 1.05, 'SWOT Raster 100M Lake Mead Reservoir', transform=ax.transAxes, ha='center', fontsize=14)\n# return contour,\n\n# # Creating a gif animation\n# ani = animation.FuncAnimation(fig, update, repeat=True, frames=len(data['time']), blit=True, interval=3000)\n\n# output = ('time_series.gif')\n# ani.save(output, writer='pillow', fps=.5)\n\n# with open(output,'rb') as f:\n# display(Image(data=f.read(), format='gif'))\n\n# plt.close(fig)\n# ds2.close()", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "Access & Visualization", + "Raster Multifile", + "Cloud" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#documentation", - "href": "quarto_text/DataSubscriberDownloader.html#documentation", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Documentation", - "text": "Documentation", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#summary", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#summary", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Summary", + "text": "Summary\n\nVisualizing Discharge\nThe following notebook shows how to visualize discharge time series data on a map. The notebook takes the mean of the timeseries for a river reach’s discharge estimates and visualizes this mean discharge.\n\n\nGranule structure (background)\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\nYou can explore the SoS further in this notebook: https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html\n\n\nTable of Modules (Algorithms) and Discharge variables\nThe following lists the algorithms alongside their discharge variables and location in the SoS results file assuming that the SoS is an open file represented by the results variable.\n\n\n\n\n\n\n\n\nModule (Algorithm)\nDischarge Variable\nLocation in the SoS\n\n\n\n\nHiVDI\nQ\nresults[“hivdi”][“Q”]\n\n\nMetroMan\nallq\nresults[“metroman”][“allq”]\n\n\nMOMMA\nQ\nresults[“momma”][“Q”]\n\n\nneoBAM\nq1, q2, or q3\nresults[“neobam”][“q”][“q1”]\n\n\nSAD\nQa\nresults[“sad”][“Qa”]\n\n\nSIC4DVar\nQ_da\nresults[“sic4dvar”][“Q_da”]\n\n\nMOI HiVDI\nq\nresults[“moi”][“hivdi”][“q”]\n\n\nMOI MetroMan\nq\nresults[“moi”][“metroman”][“q”]\n\n\nMOI MOMMA\nq\nresults[“moi”][“momma”][“q”]\n\n\nMOI neoBAM\nq\nresults[“moi”][“qeobam”][“q”]\n\n\nMOI SAD\nq\nresults[“moi”][“sad”][“q”]\n\n\nMOI SIC4DVar\nq\nresults[“moi”][“sic4dvar”][“q”]", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#step-2-run-the-script", - "href": "quarto_text/DataSubscriberDownloader.html#step-2-run-the-script", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Step 2: Run the Script", - "text": "Step 2: Run the Script\nUsage:\nusage: PO.DAAC bulk-data downloader [-h] -c COLLECTION -d OUTPUTDIRECTORY [--cycle SEARCH_CYCLES] [-sd STARTDATE] [-ed ENDDATE] [-f] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-e EXTENSIONS] [-gr GRANULENAME] [--process PROCESS_CMD] [--version] [--verbose]\n [-p PROVIDER] [--limit LIMIT] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n--cycle SEARCH_CYCLES\n Cycle number for determining downloads. can be repeated for multiple cycles \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --cycle must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the downloader.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nUnlike the ‘subscriber’, no ‘state’ is maintained for the downloader. if you re-run the downloader you’ll re-download all of the files again, unlike the subscriber which will download newly ingested data since the last run.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#requirements", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#requirements", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#note-netrc-file", - "href": "quarto_text/DataSubscriberDownloader.html#note-netrc-file", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Note: netrc file", - "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#learning-objectives", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#learning-objectives", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nTo locate an algorithms discharge data.\nTake the mean of discharge over a reach.\nVisualize mean discharge on a map.", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#advanced-usage", - "href": "quarto_text/DataSubscriberDownloader.html#advanced-usage", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Advanced Usage", - "text": "Advanced Usage\n\nDownload data by filename\nIf you’re aware of a file you want to download, you can use the -gr option to download by a filename. The -c (COLLECTION) and -d (directory) options are still required.\nThe -gr option works by taking the file name, removing the suffix and searching for a CMR entry called the granuleUR. Some examples of this include:\n\n\n\n\n\n\n\n\nCollection\nFilename\nCMR GranuleUR\n\n\n\n\nMUR25-JPL-L4-GLOB-v04.2\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\n20221206090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2\n\n\nJASON_CS_S6A_L2_ALT_HR_STD_OST_NRT_F\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07.nc\nS6A_P4_2__HR_STD__NR_077_039_20221212T181728_20221212T182728_F07\n\n\n\nBecause of this behavior, granules without data suffixes and granules where the the UR does not directly follow this convention may not work as anticipated. We will be adding the ability to download by granuleUR in a future enhancement.\nThe -gr option supports wildcard search patterns (using ? for single- and * for multi-character expansion) to select and download multiple granules based on the filename pattern. This feature is supported through wildcard search functionality provided through CMR, which is described in the CMR Search API documentation.\n\n\nDownload data by cycle\nSome PO.DAAC datasets are better suited for cycles based search instead of start and end times. To enabled this, we’ve added ‘cycle’ based downloading to the data-downloader. The following example will download data from cycle 42:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42\nThe cycle parameter can be repeated to specify multiple cycles:\npodaac-data-downloader -c JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -d ./JASON_CS_S6A_L2_ALT_LR_STD_OST_NRT_F -dc -b=\"-20,-20,20,20\" --cycle 42 --cycle 43 --cycle 44\n\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z -ed 2014-07-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nDownloader behavior when a file already exists\nBy default, when the downloader is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the downloader will skip downloading that file.\nThis can drastically reduce the time for the downloader to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the downloader to always download matching files, by using –force/-f.\npodaac-data-downloader -c SENTINEL-1A_SLC -d myData -f\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-downloader -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\" -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#import-packages", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#import-packages", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Import Packages", + "text": "Import Packages\n\nimport datetime\nimport pathlib\nimport warnings\n\nimport branca.colormap as cm\nimport earthaccess\nimport folium\nimport geopandas as gpd\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd\nimport shapely", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#run-the-script", - "href": "quarto_text/DataSubscriberDownloader.html#run-the-script", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Run the Script", - "text": "Run the Script\nUsage:\nusage: PO.DAAC data subscriber [-h] -c COLLECTION -d OUTPUTDIRECTORY [-f] [-sd STARTDATE] [-ed ENDDATE] [-b BBOX] [-dc] [-dydoy] [-dymd] [-dy] [--offset OFFSET] [-m MINUTES] [-e EXTENSIONS] [--process PROCESS_CMD] [--version] [--verbose] [-p PROVIDER] [--dry-run]\nTo run the script, the following parameters are required:\n-c COLLECTION, --collection-shortname COLLECTION\n The collection shortname for which you want to retrieve data.\n-d OUTPUTDIRECTORY, --data-dir OUTPUTDIRECTORY\n The directory where data products will be downloaded.\nAnd one of\n-sd STARTDATE, --start-date STARTDATE\n The ISO date time before which data should be retrieved. For Example, --start-date 2021-01-14T00:00:00Z\n-ed ENDDATE, --end-date ENDDATE\n The ISO date time after which data should be retrieved. For Example, --end-date 2021-01-14T00:00:00Z\n-m MINUTES, --minutes MINUTES\n How far back in time, in minutes, should the script look for data. If running this script as a cron, this value should be equal to or greater than how often your cron runs. \nCOLLECTION is collection shortname of interest. This can be found from the PO.DAAC Portal, CMR, or earthdata search. Please see the included Finding_shortname.pdf document on how to find a collection shortname.\nOUTPUTDIRECTORY is the directory in which files will be downloaded. It’s customary to set this to a data directory and include the collection shortname as part of the path so if you run multiple subscribers, the data are not dumped into the same directory.\nOne last required item is a time entry, one of --start-date, --end-date, or --minutes must be specified. This is done so that a time is explicitly requested, and fewer assumptions are made about how the users is running the subscriber.\nThe Script will login to CMR and the PO.DAAC Archive using a netrc file. See Note 1 for more information on setting this up.\nEvery time the script runs successfully (that is, no errors), a .update__<collectionname> file is created in your download directory with the last run timestamp. This timestamp will be used the next time the script is run. It will look for data between the timestamp in that file and the current time to determine new files to download.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#authenticate", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#authenticate", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Authenticate", + "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x11fc666c0>", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#note-cmr-times", - "href": "quarto_text/DataSubscriberDownloader.html#note-cmr-times", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Note: CMR times", - "text": "Note: CMR times\nThere are numerous ‘times’ available to query on in CMR. For the default subscriber, we look at the ‘created at’ field, which will look for when a granule file was ingested into the archive. This means as PO.DAAC gets data, your subscriber will also get data, regardless of the time range within the granule itself.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#search-and-access-sos-data", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#search-and-access-sos-data", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Search and Access SoS data", + "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#note-netrc-file-1", - "href": "quarto_text/DataSubscriberDownloader.html#note-netrc-file-1", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Note: netrc file", - "text": "Note: netrc file\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#locate-gauge-and-rive-discharge-data.", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#locate-gauge-and-rive-discharge-data.", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Locate gauge and rive discharge data.", + "text": "Locate gauge and rive discharge data.\nWe can now locate gauge and river discharge data from the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n\n# Get discharge for a specific river name\nriver_names = results['reaches']['river_name'][:]\nreach_idx = np.where(river_names[:] == RIVER_NAME)\n\n\n# Filter out missing values\ndischarge = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][:][reach_idx]\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\n\n# Loop through each reach and filter out places where the missing value is present\nfor i in range(discharge.shape[0]):\n is_missing = np.all(discharge[i] == missing)\n if is_missing:\n discharge[i] = np.array([np.nan])\n else:\n discharge[i][discharge[i] == missing] = np.nan\n\n# discharge = discharge[data_indexes] \nprint(f\"Discharge values:\\n {discharge}\")\nprint(f\"Length of discharge values: {discharge.shape}\")\n\nDischarge values:\n [array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 54.07821944,\n 49.94874936, 34.29138816, 34.49135369])\n array([ nan, nan, nan, nan, nan,\n nan, 82.61844383, nan, nan, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 2907.9691168 ,\n 3153.60845063, 3297.52519565, nan, 2184.5119275 ,\n 2488.26914856])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 140.25074677, 7878.00373995,\n 1852.91098506, nan, nan, nan,\n nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 4464.2000491 , 5722.24574639,\n nan, 279.63722341, 258.96348657, 323.14058122,\n 4320.51866836])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, nan, nan, nan,\n 3172.76812796])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 812.95022706, 821.39065048,\n 824.5340281 , 748.25414935, 750.22182631, 727.4228604 ,\n 714.90032622])\n array([ nan, nan, nan, nan, nan,\n nan, 12.96023473, 13.62441855, 9.2229579 , 6.78091378,\n 6.08133493, 3.86084087, 4.35815961])\n array([ nan, nan, nan, nan, nan,\n nan, 46.33641998, 44.15285669, nan, 14.58184889,\n nan, 0.6631935 , 5.5124224 ])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n nan, nan, 482.5083491])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 52.73158663, nan, 28.40903799,\n nan, 9.20201576, 1.32055668])\n array([ nan, nan, nan, nan,\n nan, nan, 280.86449094, 205.30851846,\n 110.83887881, 151.87592498, 227.77297649, 93.05295619,\n 81.05582342])\n array([ nan, nan, nan, nan, nan,\n nan, 47.52573484, nan, nan, nan,\n nan, 77.78871975, 12.8748962 ])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 19.66703691, nan, nan,\n nan, nan, nan])\n array([ nan, nan, nan, nan, nan,\n nan, 96.90955888, 45.20619634, 5.87241546, nan,\n nan, nan, 0.43745264])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, 16.7157942 , 14.55850863, nan, 5.07303443,\n 4.12986955, 2.43344827, 3.19803766])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 17.64858373, 14.15283703, 7.97109699,\n 3.93440203, 3.08442744, 2.44310106, 2.33711971])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 4.47810394, 1.72949116, 1.83256864, 1.75216572])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 98.51437115, 90.98432077, 98.10419242,\n nan, 57.94006526, 30.77548924, 57.57734148])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 50.55048997, nan,\n 26.59220618, 23.64661731, 24.57567818, 23.99663384])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 69.2017186 , 55.13156023, nan,\n nan, 32.72661602, 25.27141885, 27.32154394])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 91.85689278,\n 118.09762553, 70.72385117, 117.09601965, 46.02141169,\n 43.47693004, 58.09836739])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 66.50971298, 64.91180821,\n 57.92947014, 52.98187408, 50.83445596, 52.76051291])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 70.04344344, 65.22378172,\n 55.93499204, 50.85696393, 56.55554003, 57.94008371])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 11.61540995, 12.1144766 , 12.34147342, 13.03231781])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n 100.96540712, 100.02751124, 91.80281586, 93.81840639,\n 94.86759615, 99.19542762])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 1213.67194541,\n 1138.18496353, 1115.0978839 , 1069.45943177, 1082.94584138,\n 1198.94024353, 1108.93895269])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 149.84091602,\n 143.07347301, 142.0394067 , 134.96703933, 134.45761119,\n 142.42974651, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 479.13397319,\n 431.81058979, 419.96984402, nan, 495.59938085,\n nan, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 117.09868443,\n 122.22892084, nan, 113.9907313 , 114.47006025,\n 123.33244731, nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 0.34485608, 0.35643217, 3.14244405,\n 4.29356865, 2.06295992, 3.93507027, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 1517.63972134,\n 1338.77519837, 5921.30623408, nan, 3735.38675824,\n 5768.54043902, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 150.0785271 ,\n 138.15145821, 115.59306174, nan, 122.53882181,\n 102.65471851, 170.72795537])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 225.29351257,\n 282.74613246, nan, nan, nan,\n 28.93018406, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 284.92595543,\n 269.58929591, 200.69054755, 199.35693809, 262.95554178,\n 274.66925045, 196.70624072])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 13.99616776, 28.98604862,\n 38.61180849, 3.45407562, 1.8285061 , 0.43871852, 31.92912359])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 361.15208977, nan, 79.9505899 ,\n 56.65382349, 315.28092266, nan])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 11.40702748, 9.05996153, 10.35840011, 10.52491965, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n 18066.12312538, nan, 13155.40783521, 13592.3818625 ,\n 13460.42744663, 15166.61524739, 15473.56388479])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 8.01126872e+00, 8.30272947e-01, nan,\n nan, nan, 1.17583270e+04])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 38.15129006,\n 3.3873721 , nan, nan, nan, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 0.46128164, 359.28851327, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 25.22047988,\n nan, nan, nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 3498.82326002, nan, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 3701.80872278, nan, nan,\n nan, nan, nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 35.46511394,\n 38.00128732, nan, 39.64547151, 43.47713267, 45.55741719])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])]\nLength of discharge values: (146,)\n\n\n\n# Take the mean of the algorithm's river discharge - requires a loop because of ragged arrays\nmean_discharge = []\nfor d in discharge:\n with warnings.catch_warnings():\n warnings.simplefilter(\"ignore\", category=RuntimeWarning) # Ignore mean of empty slice as this is expected\n mean_discharge.append(np.nanmean(d)) # Ignore NaNs\nprint(f\"Mean discharge:\\n {mean_discharge}\")\nprint(f\"Mean discharge length: {len(mean_discharge)}\")\n\nMean discharge:\n [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 43.20242766259139, 82.6184438345387, nan, 2806.3767678265503, nan, 3290.3884905945197, nan, 2561.4509591772926, nan, nan, nan, 3172.768127964829, nan, 771.382009704293, 8.126980052616233, 22.24934829272215, 482.50834910152236, 22.915799264864788, 164.39565275437067, 46.06311693081852, 19.667036911352756, 37.10640583102956, nan, 7.68478212404095, 7.367366854486422, 2.4480823643843834, 72.31596338656968, 29.87232509528331, 41.93057152878337, 77.9101568923245, 57.65463904823475, 59.425800813779496, 12.275919445942492, 96.77952739610087, 1132.4627517441627, 141.1346987945013, nan, 456.62844696408314, 118.22416882714128, 2.355888522926942, 3656.3296702111575, 133.2907571236616, nan, 178.98994303187487, 241.2705385597663, nan, nan, nan, 17.034921242178314, nan, nan, nan, 203.25935645781158, nan, 10.33757719434832, 14819.086566983768, nan, nan, nan, nan, nan, nan, nan, 3922.3895222840197, 20.769331076880015, 179.8748974544238, nan, 25.22047987608233, nan, 3498.8232600199126, nan, 3701.808722784879, nan, nan, nan, nan, nan, nan, nan, nan, 40.42928452605076, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]\nMean discharge length: 146\n\n\n\n# Convert discharge and reach identifiers into DataFrame\nreach_ids = results[\"reaches\"][\"reach_id\"][:][reach_idx].filled()\npdf = pd.DataFrame({\n \"reach_id\": reach_ids,\n \"discharge\": mean_discharge\n})\npdf.head()\n\n\n\n\n\n\n\n\nreach_id\ndischarge\n\n\n\n\n0\n23261000181\nNaN\n\n\n1\n23261000191\nNaN\n\n\n2\n23261000201\nNaN\n\n\n3\n23261000211\nNaN\n\n\n4\n23261000221\nNaN\n\n\n\n\n\n\n\n\nresults.close() # Close the NetCDF dataset", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/DataSubscriberDownloader.html#advanced-usage-1", - "href": "quarto_text/DataSubscriberDownloader.html#advanced-usage-1", - "title": "PO.DAAC Data Subscriber/Downloader", - "section": "Advanced Usage", - "text": "Advanced Usage\n\nRequest data from another DAAC…\nUse the ‘provider’ flag to point at a non-PO.DAAC provider. Be aware, the default data types (–extensions) may need to be specified if the desired data are not in the defaults.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -p ASF -sd 2014-06-01T00:46:02Z\n\n\nLogging\nFor error troubleshooting, one can set an environment variable to gain more insight into errors:\nexport PODAAC_LOGLEVEL=DEBUG\nAnd then run the script. This should give you more verbose output on URL requests to CMR, tokens, etc.\n\n\nControlling output directories\nThe subscriber allows the placement of downloaded files into one of several directory structures based on the flags used to run the subscriber.\n\n-d - required, specifies the directory to which data is downloaded. If this is the only flag specified, all files will be downloaded to this single directory.\n-dc - optional, if ‘cycle’ information exists in the product metadata, download it to the data directory and use a relative c path to store granules. The relative path is 0 padded to 4 total digits (e.g. c0001)\n-dydoy - optional, relative paths use the start time of a granule to layout data in a YEAR/DAY-OF-YEAR path\n-dymd - optional, relative paths use the start time of a granule to layout data in a YEAR/MONTH/DAY path\n\n\n\nSubscriber behavior when a file already exists\nBy default, when the subscriber is about to download a file, it first: - Checks if the file already exists in the target location - Creates a checksum for the file and sees if it matches the checksum for that file in CMR\nIf the file already exists AND the checksum matches, the subscriber will skip downloading that file.\nThis can drastically reduce the time for the subscriber to complete. Also, since the checksum is verified, files will still be re-downloaded if for some reason the file has changed (or the file already on disk is corrupted).\nYou can override this default behavior - forcing the subscriber to always download matching files, by using –force/-f.\npodaac-data-subscriber -c SENTINEL-1A_SLC -d myData -f\n\n\nRunning as a Cron job\nTo automatically run and update a local file system with data files from a collection, one can use a syntax like the following:\n10 * * * * podaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d /path/to/data/VIIRS_N20-OSPO-L2P-v2.61 -e .nc -e .h5 -m 60 -b=\"-180,-90,180,90\" --verbose >> ~/.subscriber.log\n\nThis will run every hour at ten minutes passed, and output will be appended to a local file called ~/.subscriber.log\n\n\nSetting a bounding rectangle for filtering results\nIf you’re interested in a specific region, you can set the bounds parameter on your request to filter data that passes through a certain area. This is useful in particular for non-global datasets (such as swath datasets) with non-global coverage per file.\nNote: This does not subset the data, it just uses file metadata to see if any part of the datafile passes through your region. This will download the entire file, including data outside of the region specified.\n-b BBOX, --bounds BBOX\n The bounding rectangle to filter result in. Format is W Longitude,S Latitude,E Longitude,N Latitude without spaces. Due to an issue with parsing arguments, to use this command, please use the -b=\"-180,-90,180,90\" syntax when calling from\n the command line. Default: \"-180,-90,180,90\\.\n\nAn example of the -b usage:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -b=\"-180,-90,180,90\"\n\n\nSetting extensions\nSome collections have many files. To download a specific set of files, you can set the extensions on which downloads are filtered. By default, “.nc”, “.h5”, and “.zip” files are downloaded by default. The -e option is a regular expression check so you can do advanced things like -e PTM_\\\\d+ to match PTM_ followed by one or more digits- useful when the ending of a file has no suffix and has a number (1-12 for PTM, in this example)\n-e EXTENSIONS, --extensions EXTENSIONS\n Regexps of extensions of products to download. Default is [.nc, .h5, .zip, .tar.gz, .tiff]\nAn example of the -e usage- note the -e option is additive:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e .nc -e .h5\nOne may also specify a regular expression to select files. For example, the following are equivalent:\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_1, -e PTM_2, ..., -e PMT_10 -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\nand\npodaac-data-subscriber -c VIIRS_N20-OSPO-L2P-v2.61 -d ./data -e PTM_\\\\d+ -sd 2020-06-01T00:46:02Z -ed 2020-07-01T00:46:02Z\n\n\nrun a post download process\nUsing the --process option, you can run a simple command agaisnt the “just” downloaded file. This will take the format of “ ”. This means you can run a command like --process gzip to gzip all downloaded files. We do not support more advanced processes at this time (piping, running a process on a directory, etc).\n\n\nGranule subsetting\nTo enable granule subsetting, include the --subset flag in your request. This will invoke the NASA Harmony API to subset the granules in the specified collection. The collection must have subsetting enabled for this feature to function. If it does not, the data will be downloaded normally.\n\n\nIn need of Help?\nThe PO.DAAC User Services Office is the primary point of contact for answering your questions concerning data and information held by the PO.DAAC. User Services staff members are knowledgeable about both the data ordering system and the data products themselves. We answer questions about data, route requests to other DAACs, and direct questions we cannot answer to the appropriate information source.\nPlease contact us via email at podaac@podaac.jpl.nasa.gov", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#read-in-sword-to-get-topology-data-for-river-name", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#read-in-sword-to-get-topology-data-for-river-name", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Read in SWORD to get topology data for river name", + "text": "Read in SWORD to get topology data for river name\nWe will need to use SWORD to visualize a river’s topology. This will need to be downloaded onto your local computer and placed in a directory that you can reference in the code below. You can SWORD from this site: https://www.swordexplorer.com/. You will need to read in the correct SWORD shapefile by selecting the HydroBASINS Pfafstetter level 2 basins (hbXX) within each continent. See the SWORD Product Description Document for more information.\n\n# Read in SWORD data as GeoPandas DataFrame\nsword = pathlib.Path(\"path/to/SWORD/shapefiles/EU/eu_sword_reaches_hb23_v16.shp\")\ngdf = gpd.read_file(sword)\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nn_rch_dn\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\n\n\n\n\n0\n-6.049157\n37.218576\n23120100011\n13823.649876\n69\n2.5\n0.501996\n108.0\n3443.195570\n1419.435181\n...\n1\n23120100556\n23120100545\n141 447\n2\n1\nNODATA\nNaN\n0\nLINESTRING (-6.10323 37.17382, -6.10289 37.173...\n\n\n1\n-6.078171\n37.217731\n23120100021\n10958.610152\n55\n0.7\n0.000000\n332.0\n4306.172957\n49838.097656\n...\n1\n23120100031\n23120100545\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.10323 37.17382, -6.10356 37.174...\n\n\n2\n-6.033200\n37.302991\n23120100031\n10894.357022\n54\n0.7\n0.004637\n256.0\n2452.139491\n49793.073567\n...\n1\n23120100041\n23120100021\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.05928 37.26167, -6.05927 37.261...\n\n\n3\n-6.015671\n37.393440\n23120100041\n10926.456281\n55\n1.0\n0.099503\n180.0\n445.458881\n49748.591937\n...\n1\n23120100061 23120100051\n23120100031\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.02252 37.34482, -6.02251 37.345...\n\n\n4\n-6.028455\n37.461068\n23120100051\n11942.410756\n60\n3.3\n0.039395\n54.0\n458.125217\n2011.318237\n...\n1\n23120100364\n23120100041\n447\n1\n1\nRivera de Huelva\nNaN\n0\nLINESTRING (-6.00566 37.44168, -6.00599 37.441...\n\n\n\n\n5 rows × 30 columns\n\n\n\n\n# Locate reach identifiers for river of interest\nreach_mask = gdf[\"reach_id\"].isin(reach_ids)\ngdf = gdf[reach_mask]\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nn_rch_dn\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\n\n\n\n\n3526\n6.233655\n51.825947\n23261000181\n8580.296766\n43\n9.300000\n0.219616\n375.374664\n923.545609\n159179.679845\n...\n1\n23261000191\n23261000171\n236 514\n2\n1\nRhine\n2\n0\nLINESTRING (6.17589 51.83773, 6.17628 51.83759...\n\n\n3527\n6.323893\n51.780903\n23261000191\n8586.191571\n43\n9.400001\n0.198737\n377.863434\n2695.005803\n159093.279060\n...\n1\n23261000201\n23261000181\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.28873 51.81080, 6.28912 51.81067...\n\n\n3528\n6.403613\n51.742265\n23261000201\n8582.119596\n43\n10.300000\n0.042619\n374.370209\n3483.753299\n159008.223035\n...\n1\n23261000211\n23261000191\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.36071 51.75371, 6.36116 51.75367...\n\n\n3529\n6.509667\n51.674094\n23261000211\n17893.641182\n89\n11.000000\n0.041548\n404.123932\n5500.626216\n158919.468921\n...\n1\n23261000231 23261000221\n23261000201\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.41422 51.71362, 6.41455 51.71344...\n\n\n3530\n6.608218\n51.634048\n23261000221\n1289.550762\n6\n12.100000\n0.000000\n127.000000\n4780.127500\n158732.593750\n...\n1\n23261000274\n23261000211\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.60434 51.63966, 6.60457 51.63917...\n\n\n\n\n5 rows × 30 columns\n\n\n\n\n# Join discharge to GeoPandas DataFrame and extract discharge and geometries\ngdf = gdf.join(pdf.set_index(\"reach_id\"), on=\"reach_id\")\ngdf[\"discharge\"] = gdf[\"discharge\"].fillna(missing)\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\ndischarge\n\n\n\n\n3526\n6.233655\n51.825947\n23261000181\n8580.296766\n43\n9.300000\n0.219616\n375.374664\n923.545609\n159179.679845\n...\n23261000191\n23261000171\n236 514\n2\n1\nRhine\n2\n0\nLINESTRING (6.17589 51.83773, 6.17628 51.83759...\n-1.000000e+12\n\n\n3527\n6.323893\n51.780903\n23261000191\n8586.191571\n43\n9.400001\n0.198737\n377.863434\n2695.005803\n159093.279060\n...\n23261000201\n23261000181\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.28873 51.81080, 6.28912 51.81067...\n-1.000000e+12\n\n\n3528\n6.403613\n51.742265\n23261000201\n8582.119596\n43\n10.300000\n0.042619\n374.370209\n3483.753299\n159008.223035\n...\n23261000211\n23261000191\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.36071 51.75371, 6.36116 51.75367...\n-1.000000e+12\n\n\n3529\n6.509667\n51.674094\n23261000211\n17893.641182\n89\n11.000000\n0.041548\n404.123932\n5500.626216\n158919.468921\n...\n23261000231 23261000221\n23261000201\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.41422 51.71362, 6.41455 51.71344...\n-1.000000e+12\n\n\n3530\n6.608218\n51.634048\n23261000221\n1289.550762\n6\n12.100000\n0.000000\n127.000000\n4780.127500\n158732.593750\n...\n23261000274\n23261000211\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.60434 51.63966, 6.60457 51.63917...\n-1.000000e+12\n\n\n\n\n5 rows × 31 columns", "crumbs": [ - "How To", - "Download/Subscribe" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/SWOT.html#swot-background", - "href": "quarto_text/SWOT.html#swot-background", - "title": "SWOT", - "section": "SWOT Background", - "text": "SWOT Background\nThe Surface Water and Ocean Topography (SWOT) mission aims to provide valuable data and information about the world’s oceans and its terrestrial surface water such as lakes, rivers, and wetlands. SWOT is jointly developed by NASA and Centre National D’Etudes Spatiales (CNES), with contributions from the Canadian Space Agency (CSA) and United Kingdom Space Agency (UKSA). The satellite launched on December 16, 2022. PO.DAAC is the NASA archive for the SWOT mission, and has made data available via the NASA Earthdata Cloud (hosted in AWS) with direct download capabilities available. PO.DAAC hosts a variety of SWOT data products, whose product description documents can be found in the chart listing each dataset. More information can be found on PO.DAAC’s SWOT webpage and the SWOT Data User Handbook. Refer to this Mission Events page for relevant information about spacecraft events that impact data quality and availability. To give feedback or ask questions on data products, post in this Earthdata Forum topic.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#visualize-mean-discharge-on-a-map", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#visualize-mean-discharge-on-a-map", + "title": "Visualizing discharge in the SWORD of Science (SoS)", + "section": "Visualize mean discharge on a map", + "text": "Visualize mean discharge on a map\nOnce the mean discharge has been calculated and the SWORD topology data has been read in, you can now map the discharge!\n\n# Create map\nmax_x = np.median(gdf[\"x\"])\nmax_y = np.median(gdf[\"y\"])\nm = folium.Map([max_y, max_x], zoom_start=10, tiles=\"cartodb positron\")\n\n\n# Create a color map\nmin_d = np.min(gdf[\"discharge\"])\nmax_d = np.max(gdf[\"discharge\"])\ncolor_map = cm.LinearColormap([\"black\", \"red\", \"yellow\", \"green\"], vmin=min_d, vmax=max_d)\ncolor_map.add_to(m)\ncolor_map\n\n-999999999999.0-833333330862.7-666666661726.3-499999992590.0-333333323453.6-166666654317.314819.086566983768\n\n\n\n# Create a tool tip to display reach identifier and discharge values\ntooltip = folium.GeoJsonTooltip(\n fields=[\"reach_id\", \"discharge\"],\n aliases=[\"Reach Identifier:\", \"Mean Discharge:\"],\n sticky=False,\n labels=True,\n style=\"\"\"\n background-color: #F0EFEF;\n border: 2px solid black;\n border-radius: 3px;\n box-shadow: 3px;\n \"\"\",\n max_width=800\n)\n\n\n# Visualize mean discharge\nfolium.GeoJson(\n gdf,\n style_function=lambda feature: { \n \"color\": color_map(feature[\"properties\"][\"discharge\"]),\n \"weight\": 3,\n },\n tooltip=tooltip\n).add_to(m)\nm\n\nMake this Notebook Trusted to load map: File -> Trust Notebook\n\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Visualizing river discharge" ] }, { - "objectID": "quarto_text/SWOT.html#swot-data-resources-tutorials", - "href": "quarto_text/SWOT.html#swot-data-resources-tutorials", - "title": "SWOT", - "section": "SWOT Data Resources & Tutorials", - "text": "SWOT Data Resources & Tutorials\n\nSearch & Download\n\nVia Graphical User Interface:\n\nFind/download SWOT data on Earthdata Search\n\n\n\nProgrammatically: ie. within Python code workflows\n\nSearch and Download via earthaccess\nwith unique SWORD river reach ID\nwith unique Hydrologic Unit Code (HUC) basin ID\n\n\n\nVia Command Line - PO.DAAC subscriber/downloader examples:\nHydrology: These examples will download either the river vector files or the raster files for February 2024:\npodaac-data-downloader -c SWOT_L2_HR_RiverSP_2.0 -d ./SWOT_L2_HR_RiverSP_2.0/ --start-date 2024-02-01T00:00:00Z --end-date 2024-02-29T23:59:59Z\nThis only downloads 1 hours worth of data for the globe:\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d ./SWOT_L2_HR_Raster_2.0/ --start-date 2024-02-01T00:00:00Z --end-date 2024-02-29T00:59:59Z\nOceanography: These examples will download modeled sea surface heights for the whole SSH collection and then the anomalies using the subscriber then downloader and finally, subset the data by bounding box:\npodaac-data-subscriber -c SWOT_L2_LR_SSH_2.0 -d ./SWOT_L2_LR_SSH_2.0/ --start-date 2023-03-29T00:00:00Z \npodaac-data-subscriber -c SWOT_L2_NALT_OGDR_SSHA_2.0 -d ./data/SWOT_L2_NALT_OGDR_SSHA_2.0 --start-date 2023-08-01T00:00:00Z --end-date 2023-08-02T00:00:00Z\npodaac-data-downloader -c SWOT_L2_NALT_OGDR_SSHA_2.0 -d ./data/SWOT_L2_NALT_OGDR_SSHA_2.0 --start-date 2023-06-23T00:00:00Z --end-date 2023-06-23T06:00:00Z\npodaac-data-downloader -c SWOT_L2_LR_SSH_Basic_2.0 -d ./data -sd 2023-11-25T00:00:00Z -ed 2023-12-15T00:00:00Z -b=\"-22.0,-27,6.5,0\" --subset\n\nSee how to Download/Subscribe for more information on how to use the PO.DAAC subscriber/downloader including with spatial queries.\n\n\n\nSearch SWOT Passes over Time\nCNES developed this dedicated visualization tool for a quick look at where SWOT has been, where it is, and where it will be. Once you have selected the area of interest, click the Search button to search for SWOT passes. The results are displayed in a table and the swaths that intersect the area of interest are displayed on the map. Click on the marker to view the pass number.\nTo launch the Binder application, click on this link.\nTo launch jupyterlab in Binder, clink on this link.\nNote: The Binder versions of this are for casual quick looks, but we recommend for extensive use to access the Jupyter Notebook directly here.\n\n\nSWOT Spatial Coverage\nTo identify spatial coverage/search terms for the science 21-day orbit, PO.DAAC has created a KMZ file that has layers of the SWOT passes and tiles, with corresponding scene numbers identified in the pop-up when a location is selected (see screenshot below). Each layer has direct links to Earthdata Search results (the ‘search’ links) for corresponding files. The passes layer has useful information for all SWOT products, but links to the LR products specifically, the tiles layer is useful for HR products (L1B_HR_SLC, L2_HR_PIXC, and L2_HR_PIXCVec products use tile spatial extents while the L2_HR_Raster product uses scenes. L2_HR_RiverSP and L2_HR_LakeSp use continent-level passes).\nTo download the KMZ file, for the science 21-day orbit, click here.\nFor the Beta Pre-validated data KMZ that used the cal/val 1-day orbit, click here.\nThese files can be opened in the Google Earth desktop application and viewed like the following:\n\n\n\n\n\nScreenshot of pass and tile layer in spatial coverage KMZ file viewed in the Google Earth Desktop application\n\n\n\nThe KaRIN HR Masks true/false text pop up for tiles comes from the two different masks used for different parts of the year. The ‘Seasonal’ mask is used from Dec 1st to March 1st and removes part of the Canadian archipelago coverage to collect additional data over sea ice instead, indicated by true/false statements.\n\n\nTips for SWOT Spatial Search\nTo support spatial search of SWOT data products, the following naming conventions may be of help. Tip: use these shortname identifiers below when searching for SWOT data in the NASA Earthdata Search portal or programmatically using the CMR API and/or earthaccess python library.\nSWOT HR data products use Tiles, Scenes, or Continent-level Swaths IDs depending on the product, which define the spatial extent of what is in each file, as follows in the chart below. Along-track scene and tile numbers are numbered sequentially following the spacecraft flight direction, so the numbers increase from south to north for ascending passes and from north to south for descending passes. SWOT LR products use global swaths and nadir tracks that use pass numbers. See SWOT Spatial Coverage Section above for information to find the pass, tile or scene numbers.\n\n\n\n\n\n\n\n\n\n\nProduct (organized by…)\nFile Naming Convention\nNotes\n\n\n\n\n\n\nL2_HR_RiverSP L2_HR_LakeSP (continent-level swaths)\nPPP_CC\nPPP = pass number (valid range: 001-584) CC = continent code (options listed below) AF - Africa EU - Europe and Middle East SI - Siberia AS - Central and Southeast Asia AU - Australia and Oceania SA - South America NA - North America and Caribbean AR - North American Arctic GR - Greenland Ex: 013_NA = pass 013, North America\n\n\n\n\nL2_HR_PIXC L2_HR_PIXCVec L1B_HR_SLC (tiles)\nPPP_TTTC\nPPP = pass number (valid range: 001-584) TTT = tile number (valid range: 001-308) C = character L or R corresponding to left or right swaths Ex: 001_120R = pass 001, right swath, tile 120\n\n\n\n\nL2_HR_Raster (scenes)\nPPP_SSS\nPPP = pass number (valid range: 001-584) SSS = scene number (valid range: 001-154) Scenes correspond to 2 x 2 sets of tiles scene number x 2 = tile number Ex: 001_060 = pass 001, scene 60, corresponding to the same location as the PIXC/PIXCVec tile example above.\n\n\n\n\nL2_RAD_(O/I)GDR L2_NALT_(O/I)GDR(nadir) L2_LR_SSH (swath)\nPPP_\nPPP = pass number (valid range: 001-584) Ex: 013_ = pass 013\n\n\n\n\n\nIn Earthdata Search GUI:\n\nUse the top left Search Box and search with keywords, e.g. SWOT L2 HR\nSelect a collection of interest\nA Filter Granule filtering capability will show up on the left hand side of the GUI. Recall naming convention is _cycle_pass_spatialIdentifier_.\n\nUse wildcards to narrow down spatially, using one of the codes from the table above depending on your use case. Tip: use underscores ( _ ) with your wildcard key words for a more specific search.\nExample: *_NA_* will filter the RiverSP or LakeSP collection selected to only return those granules (files) that are part of the North America collection\nExample: *_004_256_* will filter the RiverSP or LakeSP collection selected to only return those granules (files) that correspond to cycle 004, pass 256\nExample: *_004_253_128* will filter the Raster collection selected to only return those granules (files) that correspond to cycle 004, pass 253, scene 128\n\nIn addition, you can also draw a region of interest (ROI) on the map, using the Spatial Search Filter icon or the Advanced Search under the main search box. These will help to filter what is returned for the spatial search. Tip: It is recommended that ROI searches are used together with wildcards described above for a more accurate search.\n\n\n\n\nAccess & Visualization\n\n\n\n\n\nAccess SWOT Hydrology data in the cloud | locally\n\n\nAccess SWOT Oceanography data in the cloud | locally\n\n\nSWOT Raster Multifile Access & Quality Flag Application in the cloud | locally\n\n\nHydrocron: Time series API Multi-reach tutorial - See Hydrocron documentation and more description under tools below. \n\n\nSWOT Pixel Cloud (PIXC) Area Aggregration locally\n\n\nSWOT Pixel Cloud (PIXC) Phase Unwrapping Error Fix locally\n\n\nQuality Flag Tutorial - Quality Flag Tips for all products, specifically demonstrates SSHA 8-bit quality flag application\n\n\n\nData Story\n\nSWOT Hydrology Science Workflow in the Cloud - Retrieving SWOT attributes (WSE, width, slope) and plotting a longitudinal profile along a river or over a basin\n\n\n\nGIS workflows\n\nSWOT: Through a GIS Lens StoryMap\n\n\nShapefile exploration\n\n\nTransform SWOT Datetime field for use in GIS Software\n\n\n\nTransform\n\nHiTIDE subsetter for Sea Surface Height Products - select KaRIn instrument in sensors, see video tutorial here\n\n\nHydrocron: Time series API - Currently for rivers, see Hydrocron documentation and more description under tools below. \n\n\nTransform SWOT Hydrology lake shapefiles into time series - work around for lake time series while Hydrocron is under development to include lakes.\n\n\nNetCDF to Geotiff Conversion - mac or Linux | Windows\n\n\n\nTools\nHydrocron - an API that repackages the river shapefile dataset (L2_HR_RiverSP) into csv or GeoJSON formats that make time-series analysis easier. SWOT data is archived as individually timestamped shapefiles, which would otherwise require users to perform potentially thousands of file operations per river feature to view the data as a timeseries. Hydrocron makes this possible with a single API call.\nSWODLR - a system for generating on demand raster products from SWOT L2 raster data with custom resolutions, projections, and extents. -in development\nHiTIDE subsetter for Sea Surface Height Products - select KaRIn instrument in sensors, see video tutorial here\n\n\nSWORD of Science\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow which is a cloud-based workflow that executes on SWOT observations to produce river discharge parameter estimates. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gauge data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\n\nExplore river discharge\nExplore river discharge with gauge data\nPlot ALL river discharge algorithms\nVisualize river discharge", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#summary", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#summary", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Summary", + "text": "Summary\n\nLooking at discharge in the SoS\nIt can be helpful to plot the flow law parameter estimation (FLPE) algorithm discharge alongside the integrator (MOI) discharge produced for that algorithm PLUS overlapping in situ gauge data. Note that not all rivers have gauge data associated with them. In this notebook we will look at the steps to plot SoS discharge values produced from running the Confluence workflow alongside in situ gauge data gathered and stored in the priors.\n\n\nGranule structure (background)\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\nYou can explore the SoS further in this notebook: https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html\n\n\nLocate data for a river that has gauges\nWe will select the Ohio River as we know it has gauge data associated with it from the USGS but feel free to modify the constants below for your river of choice!\n\n\nTable of Gauge Agencies by Continent\nThe following list the continent with associated gauge agency and group name of the gauge agency as it is stored in the SoS.\n\n\n\n\n\n\n\n\nContinent\nGroup Name\nGauge Agency\n\n\n\n\nAfrica\nGRDC\nGlobal Runoff Data Centre\n\n\nAsia\nGRDC\nGlobal Runoff Data Centre\n\n\nAsia\nMLIT\nMinistry of Land, Infrastructure, Transport, Tourism\n\n\nEurope\nGRDC\nGlobal Runoff Data Centre\n\n\nEurope\nDEFRA\nDepartment of Environment Food & Rural Affairs\n\n\nEurope\nEAU\nHub’Eau France\n\n\nNorth America\nGRDC\nGlobal Runoff Data Centre\n\n\nNorth America\nUSGS\nUnited State Geological Survey\n\n\nNorth America\nWSC\nWater Survey Canada\n\n\nOceania\nGRDC\nGlobal Runoff Data Centre\n\n\nOceania\nABOM\nAustralian Government Bureau of Meteorology\n\n\nSouth America\nGRDC\nGlobal Runoff Data Centre\n\n\nSouth America\nDGA\nDireccion General de Aguas\n\n\nSouth America\nHidroweb\nHidroweb", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "quarto_text/SWOT.html#additional-resources", - "href": "quarto_text/SWOT.html#additional-resources", - "title": "SWOT", - "section": "Additional Resources", - "text": "Additional Resources\n\nData Descriptions and Features\nSWOT Data User Handbook\nFeatures of KaRIn Data that Users Should be Aware of - Slide Deck presented at the 2023 SWOT Science Team by Curtis Chen that addresses practical aspects of interpreting SWOT KaRIn data products, answers frequently asked questions, and provides tips to hopefully avoid misinterpretation and confusion of the data.\nLatest Release Notes - Version C KaRIn Science Data Products (aka 2.0) - See section 6 for current issues and features of the datasets!\nMission Spacecraft Events - page for relevant information about spacecraft events that impact data quality and availability.\nSWOT Data Product User Feedback - Post on this topic in the Earthdata Forum to give feedback or ask questions of the experts!\n\n\nA Priori Databases\nSWOT River Database (SWORD) - the database for rivers SWOT products are based upon, great for discovering river reach IDs!\nPrior Lake Database (PLD) - Add in the PLD layer into Hydroweb.next to see the lakes SWOT products are based upon, great for discovering lake IDs!\n\n\nEarthdata Webinar\nAccessing Data for the World’s Water with SWOT\nWatch the Recording! Learn how to discover, access, and use SWOT mission data and how these data can lead to new, innovative science and applications in the world of water.\n\n\nSWOT Community GitHub Repository\nhttps://github.com/SWOT-community\nThis is a code space for the global SWOT mission community. We share experience, code, research and much more. Our mission is to increase the value of SWOT.\n\n\nData in Action Stories\nFacing the challenges of using high-resolution sea surface height observations from SWOT\nUnveiling the first global observations of high resolution Sea Surface Height from SWOT\n\n\nWorkshops\n\n2024 SWOT Early Career Researcher Workshop Using Binder\nhttps://github.com/podaac/2024-SWOT-ECR-Workshop\nExplore SWOT data on a Binder virtual environment or local machine. This material was presented at the 9th Global Energy and Water Exchanges (GEWEX) Open Science Conference and the Hacking Limnology 2024 Virtual Summit Remote Sensing Day.\n\n\n2024 SWOT Hydrology Data Access Workshop\nhttps://podaac.github.io/2024-SWOT-Hydro-Workshop/\nThis workshop focuses on the SWOT Hydrology datasets including river and lake vector data in shapefiles, and raster, pixel cloud, and pixel vector data in netCDF. In this pre-meeting workshop for the AGU Chapman: Remote Sensing of the Water Cycle Conference, participants are introduced to SWOT and the various ways to access and utilize its data products, including via cloud computing, local download, and data transformation tools.\n\n\n2022 SWOT Ocean Cloud Workshop\nhttps://podaac.github.io/2022-SWOT-Ocean-Cloud-Workshop/\nThe goal of the workshop was to enable the (oceanography) science team to be ready for processing and handling the large volumes of SWOT SSH data in the cloud. Learning objectives focus on how to access the simulated SWOT L2 SSH data from Earthdata Cloud either by downloading or accessing the data on the cloud.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#requirements", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#requirements", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "quarto_text/ECCO.html#background", - "href": "quarto_text/ECCO.html#background", - "title": "ECCO", - "section": "Background", - "text": "Background\nThe Estimating the Circulation and Climate of the Ocean (ECCO) project makes the best possible estimates of ocean circulation and its role in climate. ECCO combines state-of-the-art ocean circulation models with global ocean data sets. More information can be found on PO.DAAC’s ECCO webpage.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#learning-objectives", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#learning-objectives", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nTo locate in situ gauge data stored in the SoS.\nTo locate overlap between in situ observations and times where discharge values were produced.\nPlot gauge data alongside river discharge.", "crumbs": [ "Tutorials", "Dataset Specific", - "ECCO" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "quarto_text/ECCO.html#data-resources-tutorials", - "href": "quarto_text/ECCO.html#data-resources-tutorials", - "title": "ECCO", - "section": "Data Resources & Tutorials", - "text": "Data Resources & Tutorials\n\nData Access\n\nIn-cloud - Direct Access to ECCO V4r4 Datasets in the Cloud\nIn this notebook, you will learn to 1) identify Amazon Web Services (AWS) S3 endpoints corresponding to two ECCO datasets of interest, 2) retrieve your AWS credentials which provide access to PO.DAAC data in AWS, 3) load the target netCDF files into two multi-file datasets with xarray, and 4) slice and plot the datasets as animated time series using matplotlib and cartopy. The notebook finishes by writing the animations to disk as MP4 files. The two variables analyzed in this example are global monthly sea surface height (SSH) data and monthly ocean temperature flux (TFLUX) data over the Gulf of Mexico.\n\n\nLocal Machine Download - Access to ECCO V4r4 Datasets on a Local Machine\nThis is a modified version of the In-cloud Access python notebook above to batch download ECCO data on a local machine.\n\n\n\nUse Case Demo\n\nECCO Science Use Case Jupyter Notebook Demonstration\nThis tutorial will use data from the ECCO model to derive spatial correlations between sea surface temperature anomaly and sea surface height anomaly through time for two regions of the Indian Ocean. The goal is to investigate the correlative characteristics of the Indian Ocean Dipole and how the east and west regions behave differently.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#import-packages", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#import-packages", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Import Packages", + "text": "Import Packages\n\nimport datetime\nimport pathlib\n\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\nimport earthaccess\nimport matplotlib.pyplot as plt\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd", "crumbs": [ "Tutorials", "Dataset Specific", - "ECCO" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "quarto_text/ECCO.html#additional-resources", - "href": "quarto_text/ECCO.html#additional-resources", - "title": "ECCO", - "section": "Additional Resources", - "text": "Additional Resources\nECCO Project Website\nData in Action: Unveiling small-scale ocean circulation through high-resolution Sea Surface Height", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#authenticate", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#authenticate", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Authenticate", + "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x31276f1d0>", "crumbs": [ "Tutorials", "Dataset Specific", - "ECCO" + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/s3/S3-Access.html", - "href": "notebooks/s3/S3-Access.html", - "title": "Direct S3 Access tutorial", - "section": "", - "text": "This tutorial will show you how to authenticate with the PO.DAAC data archive, and gain access to the data in amazon S3 buckets. This allows you to natively list, copy, get data from the PO.DAAC archive using your preferred amazon methods (e.g. Python boto3, amazon SDK, aws cli).\nnote Direct S3 access is only available to users running in AWS, us-west-2 region. All other access must come from HTTP requests for PO.DAAC data\nimport boto3\nimport json\nimport requests\nimport xarray as xr\n%matplotlib inline" - }, - { - "objectID": "notebooks/s3/S3-Access.html#get-temporary-aws-credentials-for-access", - "href": "notebooks/s3/S3-Access.html#get-temporary-aws-credentials-for-access", - "title": "Direct S3 Access tutorial", - "section": "Get Temporary AWS Credentials for Access", - "text": "Get Temporary AWS Credentials for Access\nS3 is an ‘object store’ hosted in AWS for cloud processing. Direct S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. Note, these temporary credentials are valid for only 1 hour. A netrc file is required to aquire these credentials. Use the NASA Earthdata Authentication to create a netrc file in your home directory. (Note: A NASA Earthdata Login is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.)\nThe following crediential is for PODAAC, but other credentials are needed to access data from other NASA DAACs.\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\nCreate a function to make a request to an endpoint for temporary credentials.\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nList all datasets available using boto3\n\ns3_client = boto3.client(\n 's3',\n aws_access_key_id=temp_creds_req[\"accessKeyId\"],\n aws_secret_access_key=temp_creds_req[\"secretAccessKey\"],\n aws_session_token=temp_creds_req[\"sessionToken\"]\n)\n\n\ns3_client.list_objects(Bucket=\"podaac-ops-cumulus-protected\", Prefix=\"ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/\")\n\n\n\nDownload a specific file within the cloud, open and plot a variable from it\n\ns3_client.download_file(\"podaac-ops-cumulus-protected\", \"ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\",\"ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\")\n\n\nds = xr.open_dataset(\"ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\")\nds\n\n\nds.EXFwspee.plot()\n\n\n\nSet up an s3fs session for Direct Access without downloading within the cloud\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint and then find the s3 paths to the data we want.\n\nimport s3fs\nimport os\n\nos.environ[\"AWS_ACCESS_KEY_ID\"] = temp_creds_req[\"accessKeyId\"]\nos.environ[\"AWS_SECRET_ACCESS_KEY\"] = temp_creds_req[\"secretAccessKey\"]\nos.environ[\"AWS_SESSION_TOKEN\"] = temp_creds_req[\"sessionToken\"]\n\ns3 = s3fs.S3FileSystem(anon=False)\n\ns3path = 's3://podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/202101*.nc'\n#s3path = 's3://podaac-ops-cumulus-protected/ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-*.nc'\nremote_files = s3.glob(s3path)\n\n\nremote_files\n\n\nfileset = [s3.open(file) for file in remote_files]\n\nOpen all files and combine into one xarray dataset\n\ndata = xr.open_mfdataset(fileset, combine='by_coords', engine='h5netcdf' )\ndata\n\n\ndata.analysed_sst.sel(lat=21.00, lon=-21.00).plot()" - }, - { - "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#cloud-level-2-subsetter-l2ss-api", - "href": "notebooks/Cloud L2SS subset and plot - JH.html#cloud-level-2-subsetter-l2ss-api", - "title": "This Notebook is no longer supported, a newer version exists here.", - "section": "Cloud Level 2 Subsetter (L2SS) API", - "text": "Cloud Level 2 Subsetter (L2SS) API\nThis will demonstrate how to subset swath/L2 data with the data and services hosted on the cloud." - }, - { - "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#before-beginning", - "href": "notebooks/Cloud L2SS subset and plot - JH.html#before-beginning", - "title": "This Notebook is no longer supported, a newer version exists here.", - "section": "Before Beginning", - "text": "Before Beginning\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\n\nLearning Objective:\n\nSubset a specific file/granule that has already been found using the podaac L2 subsetter\n\n\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nfrom IPython.display import display, JSON\nimport tempfile\nimport shutil\nimport xarray as xr\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.axes_grid1 import make_axes_locatable\nfrom pandas.plotting import register_matplotlib_converters\nimport numpy as np" - }, - { - "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#subset-of-a-po.daac-granule", - "href": "notebooks/Cloud L2SS subset and plot - JH.html#subset-of-a-po.daac-granule", - "title": "This Notebook is no longer supported, a newer version exists here.", - "section": "Subset of a PO.DAAC Granule", - "text": "Subset of a PO.DAAC Granule\nWe build onto the root URL in order to actually perform a transformation. The first transformation is a subset of a selected granule. At this time, this requires discovering the granule id from CMR. That information can then be appended to the root URL and used to call Harmony with the help of the request library.\nNotes: The L2 subsetter current streams the data back to the user, and does not stage data in S3 for redirects. This is functionality we will be adding over time.\nCreate a Harmony-py client\n\nharmony_client = Client(env=Environment.PROD)\n\nWith the client created, we can contruct and validate the request. As this is a subsetting + concatenation request, we specify options on the request that define spatial bounds, variables we are interested in, temporal bounds, and indicated the result should be concatenated.\n\ncollection = Collection(id='C1940471193-POCLOUD') #Jason-1 GDR SSHA version E NetCDF\n\nrequest = Request(\n collection=collection,\n spatial=BBox(0,0,1,1), # 1 degree box\n granule_id='G1969371708-POCLOUD' #JA1_GPR_2PeP374_173_20120303_121639_20120303_125911.nc\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\njob_id = harmony_client.submit(request)\nprint(f'Job ID: {job_id}')\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=0c2f471216e220fc8ef81d7f18a5ddfb' -H 'User-Agent: Windows/10 CPython/3.8.12 harmony-py/0.4.2 python-requests/2.25.1' 'https://harmony.earthdata.nasa.gov/C1940471193-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat%280%3A1%29&subset=lon%280%3A1%29&granuleId=G1969371708-POCLOUD'\nJob ID: 8fad49e8-c95f-4a98-8e99-d5b053d86de7\n\n\n\nprint(harmony_client.status(job_id))\n\nprint('\\nWaiting for the job to finish')\nresults = harmony_client.result_json(job_id, show_progress=True)\n\n{'status': 'running', 'message': 'The job is being processed', 'progress': 0, 'created_at': datetime.datetime(2022, 10, 25, 17, 5, 0, 76000, tzinfo=tzutc()), 'updated_at': datetime.datetime(2022, 10, 25, 17, 5, 0, 438000, tzinfo=tzutc()), 'created_at_local': '2022-10-25T10:05:00-07:00', 'updated_at_local': '2022-10-25T10:05:00-07:00', 'data_expiration': datetime.datetime(2022, 11, 24, 17, 5, 0, 76000, tzinfo=tzutc()), 'data_expiration_local': '2022-11-24T09:05:00-08:00', 'request': 'https://harmony.earthdata.nasa.gov/C1940471193-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&subset=lat(0%3A1)&subset=lon(0%3A1)&granuleId=G1969371708-POCLOUD', 'num_input_granules': 1}\n\nWaiting for the job to finish\n\n\n [ Processing: 0% ] | | [|]\n\n\n\n---------------------------------------------------------------------------\nTimeoutError Traceback (most recent call last)\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 698 # Make the request on the httplib connection object.\n--> 699 httplib_response = self._make_request(\n 700 conn,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 444 # Otherwise it looks like a bug in the code.\n--> 445 six.raise_from(e, None)\n 446 except (SocketTimeout, BaseSSLError, SocketError) as e:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in raise_from(value, from_value)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 439 try:\n--> 440 httplib_response = conn.getresponse()\n 441 except BaseException as e:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in getresponse(self)\n 1347 try:\n-> 1348 response.begin()\n 1349 except ConnectionError:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in begin(self)\n 315 while True:\n--> 316 version, status, reason = self._read_status()\n 317 if status != CONTINUE:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in _read_status(self)\n 276 def _read_status(self):\n--> 277 line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n 278 if len(line) > _MAXLINE:\n\n~\\Anaconda3\\envs\\main\\lib\\socket.py in readinto(self, b)\n 668 try:\n--> 669 return self._sock.recv_into(b)\n 670 except timeout:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in recv_into(self, buffer, nbytes, flags)\n 1240 self.__class__)\n-> 1241 return self.read(nbytes, buffer)\n 1242 else:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in read(self, len, buffer)\n 1098 if buffer is not None:\n-> 1099 return self._sslobj.read(len, buffer)\n 1100 else:\n\nTimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond\n\nDuring handling of the above exception, another exception occurred:\n\nProtocolError Traceback (most recent call last)\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)\n 438 if not chunked:\n--> 439 resp = conn.urlopen(\n 440 method=request.method,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 754 \n--> 755 retries = retries.increment(\n 756 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\util\\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)\n 531 if read is False or not self._is_method_retryable(method):\n--> 532 raise six.reraise(type(error), error, _stacktrace)\n 533 elif read is not None:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in reraise(tp, value, tb)\n 768 if value.__traceback__ is not tb:\n--> 769 raise value.with_traceback(tb)\n 770 raise value\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\n 698 # Make the request on the httplib connection object.\n--> 699 httplib_response = self._make_request(\n 700 conn,\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 444 # Otherwise it looks like a bug in the code.\n--> 445 six.raise_from(e, None)\n 446 except (SocketTimeout, BaseSSLError, SocketError) as e:\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\packages\\six.py in raise_from(value, from_value)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\urllib3\\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)\n 439 try:\n--> 440 httplib_response = conn.getresponse()\n 441 except BaseException as e:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in getresponse(self)\n 1347 try:\n-> 1348 response.begin()\n 1349 except ConnectionError:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in begin(self)\n 315 while True:\n--> 316 version, status, reason = self._read_status()\n 317 if status != CONTINUE:\n\n~\\Anaconda3\\envs\\main\\lib\\http\\client.py in _read_status(self)\n 276 def _read_status(self):\n--> 277 line = str(self.fp.readline(_MAXLINE + 1), \"iso-8859-1\")\n 278 if len(line) > _MAXLINE:\n\n~\\Anaconda3\\envs\\main\\lib\\socket.py in readinto(self, b)\n 668 try:\n--> 669 return self._sock.recv_into(b)\n 670 except timeout:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in recv_into(self, buffer, nbytes, flags)\n 1240 self.__class__)\n-> 1241 return self.read(nbytes, buffer)\n 1242 else:\n\n~\\Anaconda3\\envs\\main\\lib\\ssl.py in read(self, len, buffer)\n 1098 if buffer is not None:\n-> 1099 return self._sslobj.read(len, buffer)\n 1100 else:\n\nProtocolError: ('Connection aborted.', TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None))\n\nDuring handling of the above exception, another exception occurred:\n\nConnectionError Traceback (most recent call last)\n~\\AppData\\Local\\Temp/ipykernel_32124/2696161432.py in <module>\n 2 \n 3 print('\\nWaiting for the job to finish')\n----> 4 results = harmony_client.result_json(job_id, show_progress=True)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in result_json(self, job_id, show_progress, link_type)\n 834 \"\"\"\n 835 try:\n--> 836 self.wait_for_processing(job_id, show_progress)\n 837 except ProcessingFailedException:\n 838 pass\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in wait_for_processing(self, job_id, show_progress)\n 781 progress = 0\n 782 while progress < 100:\n--> 783 progress, status, message = self.progress(job_id)\n 784 if status == 'failed':\n 785 raise ProcessingFailedException(job_id, message)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\harmony\\harmony.py in progress(self, job_id)\n 751 \"\"\"\n 752 session = self._session()\n--> 753 response = session.get(self._status_url(job_id))\n 754 if response.ok:\n 755 json = response.json()\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in get(self, url, **kwargs)\n 553 \n 554 kwargs.setdefault('allow_redirects', True)\n--> 555 return self.request('GET', url, **kwargs)\n 556 \n 557 def options(self, url, **kwargs):\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\n 540 }\n 541 send_kwargs.update(settings)\n--> 542 resp = self.send(prep, **send_kwargs)\n 543 \n 544 return resp\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\sessions.py in send(self, request, **kwargs)\n 653 \n 654 # Send the request\n--> 655 r = adapter.send(request, **kwargs)\n 656 \n 657 # Total elapsed time of the request (approximately)\n\n~\\Anaconda3\\envs\\main\\lib\\site-packages\\requests\\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)\n 496 \n 497 except (ProtocolError, socket.error) as err:\n--> 498 raise ConnectionError(err, request=request)\n 499 \n 500 except MaxRetryError as e:\n\nConnectionError: ('Connection aborted.', TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None))\n\n\n\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n\nds = xr.open_dataset(file_names[0])\nds\n\n\nds.ssha.plot()" - }, - { - "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#verify-the-subsetting-worked", - "href": "notebooks/Cloud L2SS subset and plot - JH.html#verify-the-subsetting-worked", - "title": "This Notebook is no longer supported, a newer version exists here.", - "section": "Verify the subsetting worked", - "text": "Verify the subsetting worked\nBounds are defined earlier\n\nlat_max = ds.lat.max()\nlat_min = ds.lat.min()\n\nlon_min = ds.lon.min()\nlon_max = ds.lon.max()\n\n\nif lat_max < bblat_max and lat_min > bblat_min:\n print(\"Successful Latitude subsetting\")\nelse:\n assert false\n\n \nif lon_max < bblon_max and lon_min > bblon_min:\n print(\"Successful Longitude subsetting\")\nelse:\n assert false" - }, - { - "objectID": "notebooks/Cloud L2SS subset and plot - JH.html#plot-swath-onto-a-map", - "href": "notebooks/Cloud L2SS subset and plot - JH.html#plot-swath-onto-a-map", - "title": "This Notebook is no longer supported, a newer version exists here.", - "section": "Plot swath onto a map", - "text": "Plot swath onto a map\n\nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\n\nplt.scatter(ds.lon, ds.lat, lw=2, c=ds.ssha)\nplt.colorbar()\nplt.clim(-0.3, 0.3)\n\nplt.show()" - }, - { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#replicating-a-function-over-many-files-with-coiled.function-example-use-for-an-sst-ssh-spatial-correlation-analysis", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#replicating-a-function-over-many-files-with-coiled.function-example-use-for-an-sst-ssh-spatial-correlation-analysis", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Replicating a Function Over Many Files with coiled.function(), Example Use for an SST-SSH Spatial Correlation Analysis", - "text": "Replicating a Function Over Many Files with coiled.function(), Example Use for an SST-SSH Spatial Correlation Analysis\n\nAuthors: Dean Henze and Jinbo Wang, NASA JPL PO.DAAC\nReference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#summary", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#summary", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Summary", - "text": "Summary\nPrevious notebooks have covered the use of Dask and parallel computing applied to the type of task in the schematic below, where we wish to replicate a function over a set of files.\n\nA separate notebook explores this workflow for computing spatial correlation maps between sea surface temperature (SST) and sea surface height (SSH) (an overview of the analysis is described below), where the parallel computations were performed with Dask on a local cluster using dask.delayed(). In this notebook, we perform the same computations, but parallelize them using the third party software/package Coiled. In short Coiled will allow us to spin up AWS virtual machines (EC2 instances) and create a distributed cluster out of them, all with a few lines of Python from within this notebook. For this type of parallel computation, we use coiled.function()’s, taking the place of dask.delayed(). You will need a Coiled account, but once set up, you can run this notebook entirely from your laptop while the parallel computation portion will be run on the distributed cluster in AWS.\n\nSST-SSH Correlation Analysis\nThe analysis will generate global maps of spatial correlation between sea surface temperature (SST) and sea surface height (SSH). The analysis uses PO.DAAC hosted, gridded SSH and SST data sets:\n\nMEaSUREs gridded SSH Version 2205: 0.17° x 0.17° resolution, global map, one file per 5-days, https://doi.org/10.5067/SLREF-CDRV3\nGHRSST Level 4 MW_OI Global Foundation SST, V5.0: 0.25° x 0.25° resolution, global map, daily files, https://doi.org/10.5067/GHMWO-4FR05\n\nThe time period of overlap between these data sets is 1998 – 2020, with 1808 days in total overlapping. For each pair of SST, SSH files on these days, compute a map of spatial correlation between them, where the following method is used at each gridpoint:\n\nThis notebook will first define the functions to read in the data and perform the computations, then test them on a single file. Next a smaller parallel computation will be performed on all pairs of files in 2018 (73 pairs in total), reducing what would have otherwise taken hours to minutes instead. Finally, an optional section will demonstrate what was used to perform the full computation on all 1808 pairs of files at 0.25 degree resolution.", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Requirements, prerequisite knowledge, learning outcomes", - "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCoiled account: Create a coiled account (free to sign up), and connect it to an AWS account. For more information on Coiled, setting up an account, and connecting it to an AWS account, see their website https://www.coiled.io.\nCompute environment: This notebook can be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server), and will run equally as well in either. In both cases, the parallel computations are still sent to VM’s in the cloud.\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Coiled with a distributed cluster to replicate a function over many files in parallel. You will get better insight on how to apply this workflow to your own analysis.", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#import-packages", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#import-packages", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Import packages", - "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 scipy==1.11.4 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab\nNote that the versions are important, specifially for the science / math packages - when running newer versions of xarray, scipy, and numpy, we got some strange results.\n\n# Built in packages\nimport time\nimport sys\nimport os\nimport shutil\n\n# Math / science packages\nimport xarray as xr\nimport numpy as np\nfrom scipy.optimize import leastsq\n\n# Plotting packages\nfrom matplotlib import pylab as plt\n\n# Cloud / parallel computing packages\nimport earthaccess\nimport coiled", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#search-and-access-sos-data", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#search-and-access-sos-data", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Search and Access SoS data", + "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#define-functions", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#define-functions", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "1. Define functions", - "text": "1. Define functions\nThe main function implemented is spatial_corrmap(), which will return the map of correlations as a 2D NumPy array along with the 1D latitude, longitude arrays for the map. The other functions below are called by spatial_corrmap().\n\ndef load_sst_ssh(gran_ssh, gran_sst):\n \"\"\"\n Return SLA and SST variables for a single file each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections, respectively, returned as xarray.DataArray's. Input args are granule info \n (earthaccess.results.DataGranule object's) for each collection. \n \"\"\"\n earthaccess.login(strategy=\"environment\") # Confirm credentials are current\n \n # Get SLA and SST variables, loaded fully into local memory:\n ssh = xr.load_dataset(earthaccess.open([gran_ssh], provider='POCLOUD')[0])['SLA'][0,...]\n sst = xr.load_dataset(earthaccess.open([gran_sst], provider='POCLOUD')[0])['analysed_sst'][0,...]\n\n return ssh, sst\n\n\ndef spatialcorr(x, y, p1, p2):\n \"\"\"\n Correlation between two 2D variables p1(x, y), p2(x, y), over the domain (x, y). Correlation is \n computed between the anomalies of p1, p2, where anomalies for each variables are the deviations \n from respective linear 2D surface fits.\n \"\"\"\n # Compute anomalies:\n ssha, _ = anomalies_2Dsurf(x, y, p1) # See function further down.\n ssta, _ = anomalies_2Dsurf(x, y, p2)\n \n # Compute correlation coefficient:\n a, b = ssta.flatten(), ssha.flatten()\n if ( np.nansum(abs(a))==0 ) or ( np.nansum(abs(b))==0 ): \n # For cases with all 0's, the correlation should be 0. Numpy computes this correctly \n # but throws a lot of warnings. So instead, manually append 0.\n return 0\n else:\n return np.nanmean(a*b)/np.sqrt(np.nanvar(a) * np.nanvar(b))\n\n\ndef anomalies_2Dsurf(x, y, p):\n \"\"\"\n Return anomalies for a 2D variable. Anomalies are computed as the deviations of each \n point from a bi-linear 2D surface fit to the data (using scipy).\n \n Inputs\n ------\n x, y: 1D array-like.\n Independent vars (likely the lon, lat coordinates).\n p: 2D array-like, of shape (len(y), len(x)).\n Dependent variable. 2D surface fit will be to p(x, y).\n \n Returns\n ------\n va, vm: 2D NumPy arrays\n Anomalies (va) and mean surface fit (vm).\n \"\"\"\n # Function for a 2D surface:\n def surface(c,x0,y0): # Takes independent vars and poly coefficients\n a,b,c=c\n return a + b*x0 + c*y0\n # Function for the difference between data and the computed surface:\n def err(c,x0,y0,p): # Takes independent/dependent vars and poly coefficients\n a,b,c=c\n return p - (a + b*x0 + c*y0 )\n\n\n # Prep arrays and remove NAN's:\n xx, yy = np.meshgrid(x, y)\n xf, yf, pf = xx.flatten(), yy.flatten(), p.flatten()\n msk=~np.isnan(pf)\n xf, yf, pf = xf[msk], yf[msk], pf[msk]\n\n \n # Initial values of polynomial coefficients to start fitting algorithm off with:\n dpdx=(pf.max()-pf.min())/(xf.max()-xf.min())\n dpdy=(pf.max()-pf.min())/(yf.max()-yf.min())\n c = [pf.mean(),dpdx,dpdy]\n\n \n # Fit and compute anomalies:\n coef = leastsq(err,c,args=(xf,yf,pf))[0]\n vm = surface(coef, xx, yy) # mean surface\n va = p - vm # anomalies\n return va, vm\n\n\ndef spatial_corrmap(grans, lat_halfwin, lon_halfwin, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Get a 2D map of SSH-SST spatial correlation coefficients, for one each of the \n SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 and MW_OI-REMSS-L4-GLOB-v5.0 \n collections. At each gridpoint, the spatial correlation is computed over a lat, lon window of size \n 2*lat_halfwin x 2*lon_halfwin. Correlation is computed from the SSH, SST anomalies, which are \n computed in turn as the deviations from a fitted 2D surface over the window.\n \n Inputs\n ------\n grans: 2-tuple of earthaccess.results.DataGranule objects\n Metadata for the SSH, SST files. These objects contain https and S3 locations.\n lat_halfwin, lon_halfwin: floats\n Half window size in degrees for latitude and longitude dimensions, respectively.\n lats, lons: None or 1D array-like\n Latitude, longitude gridpoints at which to compute the correlations. \n If None, will use the SSH grid.\n f_notnull: float between 0-1 (default = 0.5)\n Threshold fraction of non-NAN values in a window, otherwise the correlation is not computed, \n and NAN is returned for that grid point. For edge cases, 'ghost' elements are counted.\n\n Returns\n ------\n coef: 2D numpy array\n Spatial correlation coefficients.\n \n lats, lons: 1D numpy arrays.\n Latitudes and longitudes creating the 2D grid that 'coef' was calculated on.\n \"\"\" \n # Load datafiles, convert SST longitude to (0,360), and interpolate SST to SSH grid: \n ssh, sst = load_sst_ssh(*grans)\n sst = sst.roll(lon=len(sst['lon'])//2)\n sst['lon'] = sst['lon']+180\n sst = sst.interp(lon=ssh['Longitude'], lat=ssh['Latitude'])\n\n \n # Compute windows size and threshold number of non-nan points:\n dlat = (ssh['Latitude'][1]-ssh['Latitude'][0]).item()\n dlon = (ssh['Longitude'][1]-ssh['Longitude'][0]).item()\n nx_win = 2*round(lon_halfwin/dlon)\n ny_win = 2*round(lat_halfwin/dlat)\n n_thresh = nx_win*ny_win*f_notnull\n\n\n # Some prep work for efficient identification of windows where number of non-nan's < threshold:\n # Map of booleans for sst*ssh==np.nan\n notnul = (sst*ssh).notnull() \n # Combine map and sst, ssh data into single Dataset for more efficient indexing:\n notnul = notnul.rename(\"notnul\") # Needs a name to merge\n mergeddata = xr.merge([ssh, sst, notnul], compat=\"equals\")\n \n\n # Compute spatial correlations over whole map:\n coef = []\n \n if lats is None:\n lats = ssh['Latitude'].data\n lons = ssh['Longitude'].data\n \n for lat_cen in lats:\n for lon_cen in lons:\n\n # Create window for both sst and ssh with xr.sel:\n lat_bottom = lat_cen - lat_halfwin\n lat_top = lat_cen + lat_halfwin\n lon_left = lon_cen - lon_halfwin\n lon_right = lon_cen + lon_halfwin\n data_win = mergeddata.sel(\n Longitude=slice(lon_left, lon_right), \n Latitude=slice(lat_bottom, lat_top)\n )\n \n # If number of non-nan values in window is less than threshold \n # value, append np.nan, else compute correlation coefficient:\n n_notnul = data_win[\"notnul\"].sum().item()\n if n_notnul < n_thresh:\n coef.append(np.nan)\n else:\n c = spatialcorr(\n data_win['Longitude'], data_win['Latitude'], \n data_win['SLA'].data, data_win['analysed_sst'].data\n )\n coef.append(c)\n \n return np.array(coef).reshape((len(lats), len(lons))), np.array(lats), np.array(lons)", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-and-rive-discharge-data.", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-and-rive-discharge-data.", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate gauge and rive discharge data.", + "text": "Locate gauge and rive discharge data.\nWe can now locate gauge and river discharge data from the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n# Select a gauge agency\nGAUGE_AGENCY = \"EAU\"", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#get-all-matching-pairs-of-ssh-sst-files-for-2018", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "2. Get all matching pairs of SSH, SST files for 2018", - "text": "2. Get all matching pairs of SSH, SST files for 2018\nThe spatial_corrmap() function takes as one of its arguments a 2-tuple of earthaccess.results.DataGranule objects, one each for SSH and SST (recall that these are the objects returned from a call to earthaccess.search_data()). This section will retrieve pairs of these objects for all SSH, SST data in 2018 on days where the data sets overlap.\n\nearthaccess.login()\n\n<earthaccess.auth.Auth at 0x179b33bc0>\n\n\n\n## Granule info for all files in 2018:\ndt2018 = (\"2018-01-01\", \"2018-12-31\")\ngrans_ssh = earthaccess.search_data(\n short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\", \n temporal=dt2018\n )\ngrans_sst = earthaccess.search_data(\n short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\", \n temporal=dt2018\n )\n\nGranules found: 73\nGranules found: 365\n\n\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\nprint(' SSH file days: ', dates_ssh[:8], '\\n', 'SST file days: ', dates_sst[:8])\n\n SSH file days: ['20180102', '20180107', '20180112', '20180117', '20180122', '20180127', '20180201', '20180206'] \n SST file days: ['20180101', '20180102', '20180103', '20180104', '20180105', '20180106', '20180107', '20180108']\n\n\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nThe result is two lists of earthaccess.results.DataGranule objects, where the ith element of the SSH, SST lists contain granule info for the respective data sets on the same day:\n\nprint(grans_ssh_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_ssh_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_ssh_analyze[:4]])\nprint(grans_sst_analyze[0]['umm']['CollectionReference']['ShortName'], ':', len(grans_sst_analyze), 'granules')\nprint([g['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'] for g in grans_sst_analyze[:4]])\n\nSEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']\nMW_OI-REMSS-L4-GLOB-v5.0 : 73 granules\n['2018-01-02T00:00:00.000Z', '2018-01-07T00:00:00.000Z', '2018-01-12T00:00:00.000Z', '2018-01-17T00:00:00.000Z']", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-identifiers", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-identifiers", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate overlapping identifiers", + "text": "Locate overlapping identifiers\nLocate overlapping identifiers for reach and gauge data.\n\n# Locate overlapping reach identifier\nriver_names = results['reaches']['river_name'][:]\nriver_indexes = np.where(river_names == RIVER_NAME)\n\nriver_reach = results[\"reaches\"][\"reach_id\"][river_indexes]\nprint(f\"{RIVER_NAME} reach identifiers:\")\nprint(river_reach)\n\ngauge_reach = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_reach_id\"][:]\nprint(\"Gauge reach identifiers:\")\nprint(gauge_reach)\n\nreach_overlap = np.intersect1d(gauge_reach, river_reach)\nprint(\"Overlapping reaches:\")\nprint(reach_overlap)\n\n# Select the first reach\nreach_id = reach_overlap[0]\nprint(f\"Reach id selected: {reach_id}\")\n\nRhine reach identifiers:\n[23261000181 23261000191 23261000201 23261000211 23261000221 23261000231\n 23261000241 23261000274 23261000371 23261000381 23261000391 23261000401\n 23261000411 23261000421 23261000431 23261000441 23261000451 23261000461\n 23261000471 23261000481 23261000491 23261000501 23261000511 23261000521\n 23261000561 23261000571 23261000581 23261000621 23261000631 23261000641\n 23262000011 23263000011 23263000021 23263000031 23263000061 23263000071\n 23263000081 23263000091 23263000141 23263000151 23263000161 23263000211\n 23263000221 23263000231 23263000241 23263000251 23263000271 23263000281\n 23265000021 23265000031 23265000041 23265000051 23265000061 23267000011\n 23267000021 23267000031 23267000041 23267000051 23267000061 23267000071\n 23267000081 23267000094 23267000101 23267000111 23267000121 23267000131\n 23267000141 23267000154 23267000171 23267000181 23267000194 23267000214\n 23267000224 23267000231 23267000244 23267000304 23267000361 23267000371\n 23267000384 23267000391 23267000401 23267000414 23267000494 23267000501\n 23267000511 23267000524 23267000531 23267000541 23267000551 23267000561\n 23267000571 23267000584 23267000591 23267000604 23267000611 23267000624\n 23267000631 23267000644 23267000651 23267000664 23267000671 23267000684\n 23267000704 23267000711 23267000724 23267000731 23267000744 23269000024\n 23269000031 23269000051 23269000101 23269000114 23269000121 23269000134\n 23269000141 23269000214 23269000221 23269000234 23269000241 23269000254\n 23269000261 23269000271 23269000283 23269000293 23269000311 23269000323\n 23269000333 23269000343 23269000353 23269000371 23269000381 23269000714\n 23269000721 23269000734 23269000741 23269000754 23269000761 23269000774\n 23269000781 23269000794 23269000801 23269000814 23269000824 23269000831\n 23269000841 23269000941]\nGauge reach identifiers:\n[23267000501 23267000121 23267000121 23267000081 23267000081 23267000071\n 23262000901 23262000801 23262000801 23262000731 23262001444 23262001104\n 23262001061 23262001354 23262000551 23262000531 23262000511 23262000491\n 23262001394 23250801191 23250200011 23250600821 23250600484 23250600471\n 23250600441 23250600631 23250200441 23240600314 23240602811 23240600201\n 23240600261 23240600091 23240700491 23240700321 23240700181 23240700081\n 23240700021 23240500101 23240500101 23240600431 23240603204 23240400101\n 23240602381 23240602651 23240100201 23240900074 23240900151 23240700541\n 23240700464 23240400601 23240400491 23240400414 23240400291 23230500654\n 23230500401 23230500301 23230500081 23230400101 23230400101 23230200764\n 23230200744 23230200354 23230200331 23230200986 23230200434 23230200381\n 23230200965 23229000554 23229000211 23229000131 23229000521 23229000101\n 23229000431 23229000024 23228000341 23228000231 23228000151 23228000111\n 23228000091 23227000261 23227000231 23227000181 23227000181 23227000111\n 23227000101 23227000041 23227000011 23226000564 23226000461 23226000351\n 23226000321 23226000311 23226000031 23225000031 23224001551 23224001174\n 23224000821 23224000531 23224000391 23224000331 23224000121 23224000704\n 23224000661 23224000601 23224000601 23224000241 23224000861 23224000191\n 23224000021 23223000041 23222000351 23222000661 23222001144 23222000801\n 23222000011 23221000224 23219000444 23219000071 23214400931 23214400791\n 23214401114 23214400501 23214400111 23214400201 23214400151 23214400041\n 23214400013 23214900374 23214900361 23214900261 23214900224 23214900014\n 23214700141 23214700051 23214700011 23214600374 23214600144 23214300031\n 23214201131 23214200904 23214200691 23214200564 23214200531 23214200091\n 23214200011 23214100051 23214100031 23214100155 23216000611 23216000584\n 23216000561 23216000511 23216000501 23216000441 23216000421 23216000401\n 23216001061 23216001001 23216000721 23212001134 23212001081 23212001014\n 23212000701 23212000674 23212001366 23212000071 23212000051 23212000834\n 23212000364 23212000181 23212001345 23218000304 23218000381 23218000141\n 23218000121 23218000101 21602801794 21602800144 21602902191 21602902121\n 21602901924 21602901501 21602900954 21602700241 21602700121 21602700171\n 21602700011 21602602314 21602602351 21602601944 21602601393 21602601373\n 21602601363 21602600311 21602601251 21602601231 21602601231 21602601821\n 21602602381 21602600631 21602600011 21602300471 21602300441 21602300241\n 21602300774 21602300861 21602300664 21602300221 21602300131 21602300131\n 21602300351 21602100401 21602100264 21602100181 21602100144 21602100535\n 21602100535 21602400711 21602400761 21602400751 21602400744 21602401061\n 21602400221 21602400201 21602200354 21602200681 21602200204 21602200084\n 21603400261 21603400161 21603400141 21603400091 21603400064 21603400051\n 21603200231 21603200261 21603200191 21603300181 21603300154 21603300061\n 21601000171 21601000091 21601000013]\nOverlapping reaches:\n[23267000071 23267000081 23267000121 23267000501]\nReach id selected: 23267000071", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#test-the-computation-on-a-pair-of-files-output-on-a-coarse-resolution-grid", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "3. Test the computation on a pair of files, output on a coarse resolution grid", - "text": "3. Test the computation on a pair of files, output on a coarse resolution grid\nTo verify the functions work, test them on the first pair of files. To reduce computation time, we compute them for a 2 degree x 2 degree output grid for now.\n\n# Compute spatial correlation map for 2 degree x 2 degree resolution and time it:\nt1 = time.time()\n\nlats = np.arange(-80, 80, 2)\nlons = np.arange(0, 359, 2)\ncoef, lats, lons = spatial_corrmap((grans_ssh_analyze[0], grans_sst_analyze[0]), 3, 3, lats=lats, lons=lons, f_notnull=0.5)\n\nt2 = time.time()\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds.\")\n\nOpening 1 granules, approx size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\nOpening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\nTotal computation time = 26.95 seconds.\n\n\n\n## Plot the results:\nplt.figure(figsize=(8,3))\nplt.contourf(lons, lats, coef, cmap='RdBu_r')\nplt.colorbar()\n\n\n\n\n\n\n\n\n\nEstimation of computation time for higher resolution output and more files\nThe computation for one file computed on a 2 x 2 degree grid takes:\n\nprint(str(comptime) + \" seconds.\")\n\n26.95 seconds.\n\n\nthen assuming linear scaling, processing one file at 0.5 x 0.5 degree resolution would take:\n\neta_fullres_seconds = comptime*(2/0.5)*(2/0.5)\neta_fullres_minutes = round(eta_fullres_seconds/60)\nprint(str(eta_fullres_minutes) + \" minutes.\")\n\n7 minutes.\n\n\nand for the record over all of 2018 would take:\n\neta_allfiles_hrs = round( (len(grans_ssh)*eta_fullres_minutes)/60, 1 )\neta_allfiles_days = round(eta_allfiles_hrs/24, 2)\nprint(str(len(grans_ssh)) + \" granules for 2018.\")\nprint(str(eta_allfiles_hrs) + \" hours = \" + str(eta_allfiles_days) + \" days.\")\n\n73 granules for 2018.\n8.5 hours = 0.35 days.", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-discharge-and-in-situ-observation-time", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-discharge-and-in-situ-observation-time", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate gauge discharge and in situ observation time", + "text": "Locate gauge discharge and in situ observation time\nLocate discharge and save the in situ observation time for the reach of interest.\n\n# Get reach index for gauge data\nreach_gauge_index = np.where(gauge_reach == reach_id)\n\n# Get discharge and filter out missing values\nmissing = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_q\"]._FillValue\ngauge_discharge = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_q\"][reach_gauge_index].filled()[0]\nnonmissing_indexes_g = np.where(gauge_discharge != missing)\ngauge_discharge = gauge_discharge[nonmissing_indexes_g]\nprint(f\"Number of gauge discharge values: {len(gauge_discharge)}.\")\n\n# Get time and filter out missing values\ngauge_time = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_qt\"][reach_gauge_index].filled().astype(int)[0]\ngauge_time = gauge_time[nonmissing_indexes_g]\nprint(f\"Number of gauge time values: {len(gauge_time)}.\")\n\n# Convert time from ordinal value\ngauge_time = [ datetime.datetime.fromordinal(gt).strftime(\"%Y%m%d\") for gt in gauge_time ]\n\nNumber of gauge discharge values: 3722.\nNumber of gauge time values: 3722.", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#parallel-computations-with-coiled-functions", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#parallel-computations-with-coiled-functions", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "4. Parallel computations with Coiled Functions", - "text": "4. Parallel computations with Coiled Functions\nSections 1 and 2 need to be run prior to this.\nThe previous section showed that analyzing a year’s worth of data at 0.5 x 0.5 degree output resolution would take hours. In this section, we use Coiled to parallelize this computation to take ~10 minutes and cost ~$1 (at the time this was written). Our task is to replicate and apply our function to all the files in 2018, which can be accomplished with a call to coiled.function().\nFirst, define a wrapper function which calls spatial_corrmap() for a pair of SSH, SST granules and collects the output into an Xarray.DataArray, returning it along with the date of granule coverages. We will parallelize this function rather than spatial_corrmap(), then take the output and save to netCDF files locally.\n\ndef corrmap_toda(grans, lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and collects output into an \n Xarray DataArray. Returns this along with the date of the file coverages.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n return date, xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n\nNext, some prep work:\n\n# All output will be saved to this local directory:\ndir_results = \"results/\"\nos.makedirs(dir_results, exist_ok=True)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80, 0.5)\nlons = np.arange(0, 359, 0.5)\n\nthen setup the parallel computations and run! (you can monitor the progress of the cluster on your Coiled dashboard)\n\n## -----------------------------\n## Perform and time computations\n## -----------------------------\n\nt1 = time.time()\n\n\n# Wrap function in a Coiled function. Here is where we make cluster specifications like VM type:\ncorrmap_toda_parallel = coiled.function(\n region=\"us-west-2\", spot_policy=\"on-demand\", vm_type=\"m6i.large\", \n environ=earthaccess.auth_environ(), # Ensure that our EDL credentials are passed to each worker.\n n_workers=73 # Optional: have the cluster manually scale to 73 VM's. Omit for adaptive scaling.\n )(corrmap_toda)\n\n# Begin computations:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\nresults = corrmap_toda_parallel.map(\n grans_2tuples, lat_halfwin=3, lon_halfwin=3, \n lats=lats, lons=lons, f_notnull=0.5\n )\n\n# Retreive the results from the cluster as they become available and save as .nc files locally:\nfor date, result_da in results:\n result_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n\n# Since we manually scaled up the cluster, manually scale it back down to stop using resources:\ncorrmap_toda_parallel.cluster.scale(1)\n\n\nt2 = time.time()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\nTotal computation time = 555.63 seconds = 9.2605 minutes.\n\n\n\ncorrmap_toda_parallel.cluster.shutdown()\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'corr_ssh_sst' (dummy_time: 73, lat: 320, lon: 718)>\ndask.array<concatenate, shape=(73, 320, 718), dtype=float64, chunksize=(1, 320, 718), chunktype=numpy.ndarray>\nCoordinates:\n * lon (lon) float64 0.0 0.5 1.0 1.5 2.0 ... 356.5 357.0 357.5 358.0 358.5\n * lat (lat) float64 -80.0 -79.5 -79.0 -78.5 -78.0 ... 78.0 78.5 79.0 79.5\nDimensions without coordinates: dummy_timexarray.DataArray'corr_ssh_sst'dummy_time: 73lat: 320lon: 718dask.array<chunksize=(1, 320, 718), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n127.96 MiB\n1.75 MiB\n\n\nShape\n(73, 320, 718)\n(1, 320, 718)\n\n\nDask graph\n73 chunks in 220 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 718 320 73\n\n\n\n\nCoordinates: (2)lon(lon)float640.0 0.5 1.0 ... 357.5 358.0 358.5array([ 0. , 0.5, 1. , ..., 357.5, 358. , 358.5])lat(lat)float64-80.0 -79.5 -79.0 ... 79.0 79.5array([-80. , -79.5, -79. , ..., 78.5, 79. , 79.5])Indexes: (2)lonPandasIndexPandasIndex(Index([ 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5,\n ...\n 354.0, 354.5, 355.0, 355.5, 356.0, 356.5, 357.0, 357.5, 358.0, 358.5],\n dtype='float64', name='lon', length=718))latPandasIndexPandasIndex(Index([-80.0, -79.5, -79.0, -78.5, -78.0, -77.5, -77.0, -76.5, -76.0, -75.5,\n ...\n 75.0, 75.5, 76.0, 76.5, 77.0, 77.5, 78.0, 78.5, 79.0, 79.5],\n dtype='float64', name='lat', length=320))Attributes: (0)\n\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-algorithm-discharge", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-algorithm-discharge", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate algorithm discharge", + "text": "Locate algorithm discharge\nLocate the algorithm discharge for a corresponding reach identifier that has gauge data. We will use HiVDI for this demonstration.\n\n# Locate the reach identifier and associated discharge time series\nreach_q_index = np.where(results['reaches']['reach_id'][:] == reach_id)\nprint(\"Reach Index: \", reach_q_index)\ndischarge_q = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][reach_q_index][0]\n\n# Filter out missing values\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\nnonmissing_indexes = np.where(discharge_q != missing)\ndischarge_q = discharge_q[nonmissing_indexes]\nprint(f\"Number of {DISCHARGE_ALGORITHM.upper()} discharge values: {len(discharge_q)}.\")\nprint(discharge_q)\n\n# Retrieve SWOT observation times and filter out missing values\ntime = results['reaches']['time'][reach_q_index][0]\ntime = time[nonmissing_indexes]\n\n# Convert to discharge time to same format as gauge agency time\nswot_ts = datetime.datetime(2000,1,1,0,0,0) # SWOT timestamp delta\ndischarge_time = [ (swot_ts + datetime.timedelta(seconds=st)).strftime(\"%Y%m%d\") for st in time ]\nprint(f\"Number of {DISCHARGE_ALGORITHM.upper()} time values: {len(time)}.\")\nprint(discharge_time)\n\nReach Index: (array([13158]),)\nNumber of HIVDI discharge values: 7.\n[1213.67194541 1138.18496353 1115.0978839 1069.45943177 1082.94584138\n 1198.94024353 1108.93895269]\nNumber of HIVDI time values: 7.\n['20230418', '20230419', '20230420', '20230422', '20230423', '20230424', '20230425']", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#other-notes", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#other-notes", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Other notes", - "text": "Other notes\n\nWhen using coiled.function(), we passed the argument n_workers=73 because we knew we wanted 73 workers to process the 73 files. However, this arg isn’t mandatory - if we left it out, Coiled would have started with 1 worker and then “adaptively scaled”, figuring out that it needed 73 workers to do the job faster. It takes a few extra minutes for Coiled to figure out exactly how many workers to scale up to, so we short-cutted the process here.\nWhen we made the call to coiled.function() we chose input args which would prioritize computation time over cost. Alternate choices could be made to prioritize cost instead, e.g. the following should be less expensive:\n\ncoiled.function(region=\"us-west-2\", cpu=1, arm=True, spot_policy=\"spot_with_fallback\", environ=earthaccess.auth_environ())(corrmap_toda)", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-integrator-moi-discharge", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-integrator-moi-discharge", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate integrator (MOI) discharge", + "text": "Locate integrator (MOI) discharge\nLocate the integrator discharge produced for the algorithm for the reach of interest that has gauge data. As mentioned, we will use HiVDI for this demonstration.\n\n# Locate MOI discharge results for discharge algorithm making sure to filter out missing values\nmoi_q = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"][reach_q_index][0]\nmoi_q = moi_q[nonmissing_indexes]\n\n# Set missing MOI to NaN\nmissing_moi = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"].missing_value\nmoi_q[moi_q == missing_moi] = np.nan\nprint(f\"Number of integrator {DISCHARGE_ALGORITHM.upper()} discharge values: {len(moi_q)}.\")\nprint(moi_q)\n\nNumber of integrator HIVDI discharge values: 7.\n[334.24668321 297.51701118 290.62386718 259.68934869 261.49240103\n 307.47902449 288.01774716]", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/coiled_function_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", - "href": "notebooks/Advanced_cloud/coiled_function_01.html#optional-parallel-computation-on-full-record-at-0.25-degree-resolution", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "5. Optional: Parallel computation on full record at 0.25 degree resolution", - "text": "5. Optional: Parallel computation on full record at 0.25 degree resolution\nOnly Section 1 needs to be run prior to this. Sections 2-4 can be skipped.\nThis section mirrors the workflow of Section 4, but processes all 1808 pairs of files, spanning a little over two decades, at higher resolution. To get an estimate of how long this would take without parallel computing, you can re-run section 3 but replace a value of 0.5 for the higher_res variable with 0.25 (in the part where we estimate comp times). Trying this on a few machines, we get that it would take anywhere from 21 to 34 hours to process the record over a single year, which means for 22 years it would take 19 to 31 days to complete the entire record. When we used this code to run the computation in parallel on a 250 t4g.small instances, computation took us instead ~5 hours and cost ~\\(\\$\\) 20, obtaining the following mean map for the full record:\n\n\n\nimage.png\n\n\nFirst, we duplicate most of the code in Section 2, this time getting granule info objects for the entire record:\n\nearthaccess.login()\n\n## Granule info for all files in both collections:\ngrans_ssh = earthaccess.search_data(short_name=\"SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205\")\ngrans_sst = earthaccess.search_data(short_name=\"MW_OI-REMSS-L4-GLOB-v5.0\")\n\n## File coverage dates extracted from filenames:\ndates_ssh = [g['umm']['GranuleUR'].split('_')[-1][:8] for g in grans_ssh]\ndates_sst = [g['umm']['GranuleUR'][:8] for g in grans_sst]\n\n## Separate granule info for dates where there are both SSH and SST files:\ngrans_ssh_analyze = []\ngrans_sst_analyze = []\nfor j in range(len(dates_ssh)):\n if dates_ssh[j] in dates_sst:\n grans_ssh_analyze.append(grans_ssh[j])\n grans_sst_analyze.append(grans_sst[dates_sst.index(dates_ssh[j])])\n\nGranules found: 2207\nGranules found: 9039\n\n\nSame function to parallelize as in Section 4:\n\ndef corrmap_toda(grans, lat_halfwin=3, lon_halfwin=3, lats=None, lons=None, f_notnull=0.5):\n \"\"\"\n Calls spatial_corrmap() for a pair of SSH, SST granules and collects output into an \n Xarray DataArray. Returns this along with the date of the file coverages.\n \"\"\"\n coef, lats, lons = spatial_corrmap(\n grans, lat_halfwin, lon_halfwin, \n lats=lats, lons=lons, f_notnull=0.5\n )\n date = grans[0]['umm']['GranuleUR'].split(\"_\")[-1][:8] # get date from SSH UR.\n return date, xr.DataArray(data=coef, dims=[\"lat\", \"lon\"], coords=dict(lon=lons, lat=lats), name='corr_ssh_sst')\n\nSome prep work:\n\n# Re-create the local directory to store results in:\ndir_results = \"results/\"\nif os.path.exists(dir_results) and os.path.isdir(dir_results):\n shutil.rmtree(dir_results)\nos.makedirs(dir_results)\n\n# Latitudes, longitudes of output grid at 0.5 degree resolution:\nlats = np.arange(-80, 80.1, 0.25)\nlons = np.arange(0, 360, 0.25)\n\nthen setup the parallel computations and run!\n\n## -----------------------------\n## Perform and time computations\n## -----------------------------\n\nt1 = time.time()\n\n\n# Wrap function in a Coiled function. Here is where we make cluster specifications like VM type:\ncorrmap_toda_parallel = coiled.function(\n region=\"us-west-2\", spot_policy=\"on-demand\", \n vm_type=\"t4g.small\", # General purpose vm that strikes a balance between performance and cost.\n environ=earthaccess.auth_environ(), # Ensure our EDL credentials are passed to each worker.\n n_workers=[0,250] # Adaptively scale to at most 250 VM's. Will go back to 0 once finished.\n )(corrmap_toda)\n\n# Begin computations:\ngrans_2tuples = list(zip(grans_ssh_analyze, grans_sst_analyze))\nresults = corrmap_toda_parallel.map(\n grans_2tuples, lat_halfwin=3, lon_halfwin=3, \n lats=lats, lons=lons, f_notnull=0.5\n )\n\n# Retreive the results from the cluster as they become available and save as .nc files locally:\nfor date, result_da in results:\n result_da.to_netcdf(dir_results+\"spatial-corr-map_ssh-sst_\" + date + \".nc\")\n\n# shutdown cluster:\ncorrmap_toda_parallel.cluster.shutdown()\n\n\nt2 = time.time()\n\n\n## What was the total computation time?\ncomptime = round(t2-t1, 2)\nprint(\"Total computation time = \" + str(comptime) + \" seconds = \" + str(comptime/60) + \" minutes.\")\n\n\nTest plots\nColormaps of first three files\n\nfns_results = [dir_results + f for f in os.listdir(dir_results) if f.endswith(\"nc\")]\nfor fn in fns_results[:3]:\n testfile = xr.open_dataset(fn)\n testfile[\"corr_ssh_sst\"].plot(figsize=(6,2), vmin=-1, vmax=1, cmap='RdBu_r')\n testfile.close()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nColormap of mean correlation map for all files\n\ntest_allfiles = xr.open_mfdataset(fns_results, combine='nested', concat_dim='dummy_time')\ntest_allfiles[\"corr_ssh_sst\"]\n\n\ntest_allfiles[\"corr_ssh_sst\"].mean(dim='dummy_time').plot(figsize=(8,3), vmin=-1, vmax=1, cmap='RdBu_r')\ntest_allfiles.close()", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-observations", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-observations", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Locate overlapping observations", + "text": "Locate overlapping observations\nWe will need to locate the discharge time series (FLPE and MOI) for the Rhine reach of interest and then determine if there are overlapping in situ observations with SWOT observations.\n\n# Find overlapping time between in situ and SWOT observations\nobs_overlap = list(set(discharge_time).intersection(set(gauge_time)))\nobs_overlap.sort()\nprint(\"Days of observation overlap:\")\nprint(obs_overlap)\n\n# Get indexes of overlap for gauge, algorithm and integrator\ngauge_overlap_index = np.where(np.in1d(gauge_time, obs_overlap))[0]\ndischarge_overlap_index = np.where(np.in1d(discharge_time, obs_overlap))[0]\n\n# Retrieve time and discharge values for indexes\ngauge_time = np.array(gauge_time)[gauge_overlap_index]\ngauge_discharge = np.array(gauge_discharge)[gauge_overlap_index]\n# print(\"Gauge time:\\n\", gauge_time)\nprint(\"Gauge discharge:\\n\", gauge_discharge)\n\ndischarge_time = np.array(discharge_time)[discharge_overlap_index]\ndischarge_algo = np.array(discharge_q)[discharge_overlap_index]\n# print(f\"{DISCHARGE_ALGORITHM} time:\\n\", discharge_time)\nprint(f\"{DISCHARGE_ALGORITHM} discharge:\\n\", discharge_algo)\n\nmoi_q = np.array(moi_q)[discharge_overlap_index]\nprint(f\"MOI discharge for {DISCHARGE_ALGORITHM}:\\n\", moi_q)\n\nDays of observation overlap:\n['20230418', '20230419', '20230420', '20230422', '20230423', '20230424', '20230425']\nGauge discharge:\n [1334.333 1208.255 1148.526 1115.296 1077.891 1080.885 1153.646]\nhivdi discharge:\n [1213.67194541 1138.18496353 1115.0978839 1069.45943177 1082.94584138\n 1198.94024353 1108.93895269]\nMOI discharge for hivdi:\n [334.24668321 297.51701118 290.62386718 259.68934869 261.49240103\n 307.47902449 288.01774716]", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Coiled Function Replication Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#processing-a-large-data-set-in-chunks-using-a-dask-local-cluster-example-with-an-sst-seasonal-cycle-analysis", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#processing-a-large-data-set-in-chunks-using-a-dask-local-cluster-example-with-an-sst-seasonal-cycle-analysis", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Processing a Large Data Set in Chunks Using a Dask Local Cluster, Example with an SST Seasonal Cycle Analysis", - "text": "Processing a Large Data Set in Chunks Using a Dask Local Cluster, Example with an SST Seasonal Cycle Analysis\n\nAuthor: Dean Henze, NASA JPL PO.DAAC", + "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#plotting-results-for-comparison", + "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#plotting-results-for-comparison", + "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", + "section": "Plotting results for comparison", + "text": "Plotting results for comparison\nLet’s plot all discharge time series to better visualize the differences and compare the FLPE, MOI, and gauge discharge values.\n\n# Plot discharge alongside MOI discharge and gauge discharge\n\n# Discharge algorithm Q\nplt.scatter(discharge_time, discharge_algo)\nplt.plot(discharge_time, discharge_algo, label=f\"{DISCHARGE_ALGORITHM.upper()}\")\n\n# MOI Q\nplt.scatter(discharge_time, moi_q)\nplt.plot(discharge_time, moi_q, label=\"MOI\")\n\n# Gauge Q\nplt.scatter(gauge_time, gauge_discharge)\nplt.plot(gauge_time, gauge_discharge, label=\"Gauge\")\n\nplt.suptitle(f\"Discharge Timeseries from {DISCHARGE_ALGORITHM} for the {RIVER_NAME} reach identifier: {reach_id}.\")\nplt.legend()\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" + "Tutorials", + "Dataset Specific", + "SWOT", + "SWORD of Science (SoS) Discharge", + "Exploring river discharge and gauge data" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#summary", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#summary", - "title": "Parallel Computing with Earthdata in the Cloud", + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#summary", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#summary", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", "section": "Summary", - "text": "Summary\nA previous notebook covered the use of Dask and parallel computing applied to the type of tasks in the schematic below, where we have a function which needs to work on a large data set as a whole. This could e.g. because the function works on some or all of the data from each of the files, so we can’t just work on each file independently like in the function replication example.\n \nIn the previous notebook, a toy example was used to demonstrate this basic functionality using a local dask cluster and Xarray built-in functions to work on the data set in chunks. In this notebook, that workflow is expanded to a more complex analysis. The computation is also repeated on several different VM’s.\n\nAnalysis: Mean Seasonal Cycle of SST Anomalies\nThe analysis will generate the mean seasonal cycle of sea surface temperature (SST) at each gridpoint in a region of the west coast of the U.S.A. The analysis uses a PO.DAAC hosted gridded global SST data set:\n\nGHRSST Level 4 MUR Global Foundation SST Analysis, V4.1: 0.01° x 0.01° resolution, global map, daily files, https://doi.org/10.5067/GHGMR-4FJ04\n\nThe analysis will use files over the first decade of the time record. The following procedure is used to generate seasonal cycles:\n\nIn Section 1 of this notebook, the first decade of MUR files are located on PO.DAAC using the earthaccess package, then a file is inspected and memory requirements for this data set are assessed. In Section 2, a “medium-sized” computation is performed, deriving the mean seasonal cycle for the files thinned out to once per week (570 files, 1.3 TB of uncompressed data) for about \\(\\$\\) 0.10. In Section 3, we perform the computation on all the files in the first decade, roughly 4000 files and 10 TB of uncompressed data, for \\(\\$\\) 3.", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#requirements-prerequisite-knowledge-learning-outcomes", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Requirements, prerequisite knowledge, learning outcomes", - "text": "Requirements, prerequisite knowledge, learning outcomes\n\nRequirements to run this notebook\n\nEarthdata login account: An Earthdata Login account is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account.\nCompute environment: This notebook can technically be run either in the cloud (AWS instance running in us-west-2), or on a local compute environment (e.g. laptop, server). However, running in the cloud is recommended, since it is unlikely that a laptop has the power to replicate the compute times we quote here. If running in a local environment, the number of workers spun up Section 4 will likely need to be decreased.\nVM type: For running in AWS (recommended), we used general purpose VM types for Sections 1 and 2, then switched to memory-optimized VM’s for the large computations of Section 3 (more on this later). Since the cost per hour of these instances go up in size, we recommend the following workflow to explore this notebook.\n\nStart by running Section 1 in a lower cost m6i.xlarge instance (fractions of a \\(\\$\\) 1 per hour).\nSection 2 includes the “medium-sized” parallel computations. For this, we ran Sections 1 and 2 on a m7g.8xlarge instance. At the time this notebook was written, this VM type took ~2-3 minutes to run the computations, and cost ~\\(\\$\\) 1.3/hr.\nFor Optional Section 3, we ran using several memory optimized instances, including r7a.32xlarge, r7i.48xlarge, r7iz.16xlarge VMs.\n\n\n\n\nPrerequisite knowledge\n\nThe notebook on Dask basics and all prerequisites therein.\n\n\n\nLearning outcomes\nThis notebook demonstrates how to use Dask with a local cluster to analyze a large data set in chunks, naturally parallelizing Xarray built in functions on the cluster. You will get better insight on how to apply this workflow to your own analysis.", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#import-packages", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#import-packages", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "Import packages", - "text": "Import packages\nWe ran this notebook in a Python 3.12.3 environment. The minimal working install we used to run this notebook from a clean environment was:\nWith pip:\npip install xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 \"dask[complete]\"==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab jupyter-server-proxy\nor with conda:\nconda install -c conda-forge xarray==2024.1.0 numpy==1.26.3 h5netcdf==1.3.0 dask==2024.5.2 earthaccess==0.9.0 matplotlib==3.8.0 coiled==1.28.0 jupyterlab jupyter-server-proxy\n\n# NASA data access packages:\nimport earthaccess\n\n# Analysis packages:\nimport xarray as xr\nimport numpy as np \n\n# Visualization packages:\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Cloud computing / dask packages:\nfrom dask.distributed import Client\nimport multiprocessing\n\n\nxr.set_options( # display options for xarray objects\n display_expand_attrs=False,\n display_expand_coords=True,\n display_expand_data=True,\n)\n\n<xarray.core.options.set_options at 0x7f0c624a0f50>", - "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" - ] - }, - { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#locate-mur-sst-file-access-endpoints-for-first-decade-of-record-inspect-a-file", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file", - "text": "1. Locate MUR SST file access endpoints for first decade of record, inspect a file\nWe use earthaccess to find metadata and endpoints for the files.\n\nearthaccess.login() # Login with your credentials\n\nEnter your Earthdata Login username: deanh808\nEnter your Earthdata password: ········\n\n\n<earthaccess.auth.Auth at 0x7f0d2a4f4920>\n\n\n\ndatainfo = earthaccess.search_data(\n short_name=\"MUR-JPL-L4-GLOB-v4.1\",\n cloud_hosted=True,\n temporal=(\"2002-01-01\", \"2013-05-01\"),\n )\n\nGranules found: 3988\n\n\n\nOpen and inspect a file\nOpen a file and plot the SST data in the region for our analysis.\n\nfileobj_test = earthaccess.open([datainfo[0]])[0] # Generate file-like objects compatible with Xarray\nsst_test = xr.open_dataset(fileobj_test)['analysed_sst']\nsst_test\n\nOpening 1 granules, approx size: 0.32 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 17999, lon: 36000)>\n[647964000 values with dtype=float32]\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 1lat: 17999lon: 36000...[647964000 values with dtype=float32]Coordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00'], dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n# Region to perform analysis over:\nlat_region = (30, 45)\nlon_region = (-135, -105)\n\n\n## Plot SST in analysis region:\nfig = plt.figure()\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(cmap='RdYlBu_r')\n\n\n\n\n\n\n\n\n\n\nMemory considerations\nDemonstrating that these are fairly large files, especially uncompressed, at the time this notebook was written:\n\nprint(\"Disk size of one file =\", datainfo[0]['size'], \"MB.\")\n\nDisk size of one file = 332.3598403930664 MB.\n\n\n\nprint(\"Size in-memory of the SST variable once uncompressed =\", sst_test.nbytes/10**9, \"GB.\")\n\nSize in-memory of the SST variable once uncompressed = 2.591856 GB.\n\n\nAt ~2.5 GB uncompressed, and ~4000 MUR files at the time this notebook was written, we are dealing with a ~10 TB data set.", + "text": "Summary\n\nEl Niño-Southern Oscillation (ENSO) is a climate pattern in the Pacific Ocean that has two phases: El Niño (warm/wet phase) and La Niña (cold/dry phase). ENSO has global impacts on wildfires, weather, and ecosystems. We have been experiencing La Niña conditions for the last 2 and a half years. The last El Niño event occurred in 2015/2016 and a weak El Niño event was also experienced during the winter of 2018/2019.\nThis tutorial uses the SST anomaly variable derived from a MUR climatology dataset - MUR25-JPL-L4-GLOB-v04.2 (average between 2003 and 2014). This tutorial uses the PO.DAAC Downloader which downloads data to your local computer and uses the data to run a notebook using python. The following code produces the sea surface temperature anomalies (SSTA) over the Pacific Ocean.", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-at-weekly-temporal-resolution", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "2. Seasonal cycle at weekly temporal resolution", - "text": "2. Seasonal cycle at weekly temporal resolution\nSection 1 needs to be run prior to this\nFor this “medium-sized” computation, the decade time record is thinned out to one file per week. This will be ~200 GB on disk, and ~1.3 TB uncompressed in memory. Using the parallel computing methods below, we were able to accomplish this in about 3 minutes for \\$0.10 (1 minute for opening the data set and 2 minutes for computations). For the size of this computation, we obtained good results with an m7g.8xlarge instance (32 CPUs, 128 GiB Memory), using 16 workers. 16 workers, rather than the maximum amount of 32, were chosen so that each worker has more memory available (8 GiB rather than 4 GiB).\n\n# Thin to weekly temporal resolution:\ndatainfo_thinned = [datainfo[i] for i in range(len(datainfo)) if i%7==0]\n\n# Confirm we have about a decade of files at weekly resolution:\nprint(\"First and last file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[-1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(\"\\nFirst and second file times \\n--------------------------\")\nprint(datainfo_thinned[0]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\nprint(datainfo_thinned[1]['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime'])\n\nFirst and last file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2013-04-26T21:00:00.000Z\n\nFirst and second file times \n--------------------------\n2002-05-31T21:00:00.000Z\n2002-06-07T21:00:00.000Z\n\n\nSince Xarray built-in functions are used to both open and process the data, the workflow is to start up a cluster, open the files into a single dataset with chunking, and then Xarray function calls will naturally be run in parallel on the cluster.\n\nfileobjs = earthaccess.open(datainfo_thinned) # Generate file objects from the endpoints which are compatible with Xarray\n\nOpening 570 granules, approx size: 190.08 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n## Double check the number of CPU's available on this VM type:\nprint(multiprocessing.cpu_count())\n\n32\n\n\n\n## Local Dask Cluster\nclient = Client(n_workers=16, threads_per_worker=1)\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(07e4762f, 'tcp://127.0.0.1:38783', workers=16, threads=16, memory=122.12 GiB)\n\n\n'https://cluster-dlufo.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs[:], parallel=True, chunks={})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of the computations\n # operate along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 200})\nsst\n\nCPU times: user 18 s, sys: 2.16 s, total: 20.2 s\nWall time: 59.5 s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 570, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(570, 17999, 36000), dtype=float32, chunksize=(200, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-04-27T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 570lat: 17999lon: 36000dask.array<chunksize=(200, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.34 TiB\n190.73 MiB\n\n\nShape\n(570, 17999, 36000)\n(200, 500, 500)\n\n\nDask graph\n7776 chunks in 1143 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 570\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-04-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-08T09:00:00.000000000',\n '2002-06-15T09:00:00.000000000', ..., '2013-04-13T09:00:00.000000000',\n '2013-04-20T09:00:00.000000000', '2013-04-27T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-08 09:00:00',\n '2002-06-15 09:00:00', '2002-06-22 09:00:00',\n '2002-06-29 09:00:00', '2002-07-06 09:00:00',\n '2002-07-13 09:00:00', '2002-07-20 09:00:00',\n '2002-07-27 09:00:00', '2002-08-03 09:00:00',\n ...\n '2013-02-23 09:00:00', '2013-03-02 09:00:00',\n '2013-03-09 09:00:00', '2013-03-16 09:00:00',\n '2013-03-23 09:00:00', '2013-03-30 09:00:00',\n '2013-04-06 09:00:00', '2013-04-13 09:00:00',\n '2013-04-20 09:00:00', '2013-04-27 09:00:00'],\n dtype='datetime64[ns]', name='time', length=570, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\n#cluster.scale(1)\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 32.44 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 52.5 s, sys: 7.15 s, total: 59.6 s\nWall time: 2min 12s\n\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#requirements", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#requirements", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Requirements", + "text": "Requirements\n\n1. Earthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\n2. netrc File\n\nYou will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\n\n3. PO.DAAC Data Downloader\n\nTo download the data via command line, this tutorial uses PO.DAAC’s Data Downloader. The downloader can be installed using these instructions The Downloader is useful if you need to download PO.DAAC data once in a while or prefer to do it “on-demand”. The Downloader makes no assumptions about the last time run or what is new in the archive, it simply uses the provided requests and downloads all matching data.", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#seasonal-cycle-for-full-record-daily-resolution", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "3. Seasonal cycle for full record (daily resolution)", - "text": "3. Seasonal cycle for full record (daily resolution)\nSection 1 needs to be run prior to this, but Section 2 can be skipped.\nIn this section, all files in the decade are processed. This will be ~4000 files, ~1.3 TB on disk, and ~10 TB for the SST varaible once uncompressed in memory. We were able to accomplish this using a few different VM’s and configurations listed below. Currently, the code is setup for using a r7a.32xlarge VM with 32 workers, which completed the computations in 14 minutes for \\$3 (6 minutes for opening the data set and 8 minutes for computations).\nMore on the VM type chosen\nFor this computation, memory-optimized VMs were chosen (they have high memory per CPU). This Coiled post was used as inspiration, where it is found that having larger chunks are more efficient, which is why memory-optimized VMs are needed to handle the larger chunks. Additionally, we found that having 32 GB per worker, regardless of the worker number, was necessary to complete the computations without receiving memory errors.\nVM runs that worked\n\nr7a.32xlarge (128 CPUs, 1024 GiB memory): 32 workers each with 32 GB of memory; completed in 13 minutes for \\$3\nr7i.48xlarge (192 CPUs, 1,536 GiB memory): 48 workers each with 32 GB of memory; completed in 13 minutes for \\$4\nr7iz.16xlarge (64 CPUs, 512 GiB memory): 16 workers each with 32 GB of memory; completed in 18 minutes for \\$2.50\n\n\nfileobjs = earthaccess.open(datainfo) # Generate file-like objects compatible with Xarray\n\nOpening 3988 granules, approx size: 1330.13 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\n\n\n\n\n## Double check the number of CPU's available on this VM type:\nprint(multiprocessing.cpu_count())\n\n128\n\n\n\n## Local Dask Cluster\nclient = Client(n_workers=32, threads_per_worker=1)\nprint(client.cluster)\nclient.dashboard_link\n\nLocalCluster(3cd02cc8, 'tcp://127.0.0.1:44455', workers=32, threads=32, memory=0.96 TiB)\n\n\n'https://cluster-srigu.dask.host/jupyter/proxy/8787/status'\n\n\n\n%%time\n\n## Load files and rechunk SST data:\nmurdata = xr.open_mfdataset(fileobjs, parallel=True, chunks={})\nsst = murdata[\"analysed_sst\"]\n # Rechunk to get bigger slices along time dimension, since many of our computations are\n # operating along that axis:\nsst = sst.chunk(chunks={'lat': 500, 'lon': 500, 'time': 400})\nsst\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 17.93 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 2min 9s, sys: 29.5 s, total: 2min 38s\nWall time: 5min 31s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 3988, lat: 17999, lon: 36000)>\ndask.array<rechunk-merge, shape=(3988, 17999, 36000), dtype=float32, chunksize=(400, 500, 500), chunktype=numpy.ndarray>\nCoordinates:\n * time (time) datetime64[ns] 2002-06-01T09:00:00 ... 2013-05-01T09:00:00\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nAttributes: (7)xarray.DataArray'analysed_sst'time: 3988lat: 17999lon: 36000dask.array<chunksize=(400, 500, 500), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.40 TiB\n381.47 MiB\n\n\nShape\n(3988, 17999, 36000)\n(400, 500, 500)\n\n\nDask graph\n25920 chunks in 7979 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 3988\n\n\n\n\nCoordinates: (3)time(time)datetime64[ns]2002-06-01T09:00:00 ... 2013-05-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2002-06-01T09:00:00.000000000', '2002-06-02T09:00:00.000000000',\n '2002-06-03T09:00:00.000000000', ..., '2013-04-29T09:00:00.000000000',\n '2013-04-30T09:00:00.000000000', '2013-05-01T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Indexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2002-06-01 09:00:00', '2002-06-02 09:00:00',\n '2002-06-03 09:00:00', '2002-06-04 09:00:00',\n '2002-06-05 09:00:00', '2002-06-06 09:00:00',\n '2002-06-07 09:00:00', '2002-06-08 09:00:00',\n '2002-06-09 09:00:00', '2002-06-10 09:00:00',\n ...\n '2013-04-22 09:00:00', '2013-04-23 09:00:00',\n '2013-04-24 09:00:00', '2013-04-25 09:00:00',\n '2013-04-26 09:00:00', '2013-04-27 09:00:00',\n '2013-04-28 09:00:00', '2013-04-29 09:00:00',\n '2013-04-30 09:00:00', '2013-05-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=3988, freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (7)long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AMSRE-REMSS, AVHRR_Pathfinder-PFV5.2-NODC_day, AVHRR_Pathfinder-PFV5.2-NODC_night, MODIS_T-JPL, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\nComputations\nWe chose not to suppress the large chunk and task graph warnings for the next two blocks:\n\n## ----------------\n## Set up analysis\n## ----------------\n## (Since these are dask arrays, functions calls don't do the computations yet, just set them up)\n\n## Subset to region off U.S.A. west coast:\nsst_regional = sst.sel(lat=slice(*lat_region), lon=slice(*lon_region))\n\n## Remove linear warming trend:\np = sst_regional.polyfit(dim='time', deg=1) # Deg 1 poly fit coefficients at each grid point.\nfit = xr.polyval(sst_regional['time'], p.polyfit_coefficients) # Linear fit time series at each point.\nsst_detrend = (sst_regional - fit) # xarray is smart enough to subtract along the time dim.\n\n## Mean seasonal cycle:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\n\n/opt/coiled/env/lib/python3.12/site-packages/xarray/core/dataset.py:5196: PerformanceWarning: Reshaping is producing a large chunk. To accept the large\nchunk and silence this warning, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n ... array.reshape(shape)\n\nTo avoid creating the large chunks, set the option\n >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n ... array.reshape(shape)Explicitly passing ``limit`` to ``reshape`` will also silence this warning\n >>> array.reshape(shape, limit='128 MiB')\n stacked_var = exp_var.stack(**{new_dim: dims})\n\n\n\n%%time\n## ----------------\n## Compute it all!!\n## ----------------\nseasonal_cycle = seasonal_cycle.compute()\n\n/opt/coiled/env/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 227.20 MiB.\nThis may cause some slowdown.\nConsider scattering data ahead of time and using futures.\n warnings.warn(\n\n\nCPU times: user 3min 41s, sys: 45.5 s, total: 4min 27s\nWall time: 8min 24s\n\n\n\nPlot results\n\n# Points to plot seasonal cycle at:\nlat_points = (38, 38, 38, 38)\nlon_points = (-123.25, -125, -128, -132)\n\nfig2, axes2 = plt.subplots(1, 2, figsize=(12, 4))\n\n## Replot the map and points from the test file:\nsst_test.sel(lat=slice(*lat_region), lon=slice(*lon_region)).plot(ax=axes2[0], cmap='RdYlBu_r')\nfor lat, lon in zip(lat_points, lon_points):\n axes2[0].scatter(lon, lat)\n\n## Seasonal cycles on another plot\nfor lat, lon in zip(lat_points, lon_points):\n scycle_point = seasonal_cycle.sel(lat=lat, lon=lon)\n axes2[1].plot(scycle_point['month'], scycle_point.values, 'o-')\n\naxes2[1].set_title(\"Seasonal cycle of temperature anomalies \\n at four test points\", fontsize=14)\naxes2[1].set_xlabel(\"month\", fontsize=12)\naxes2[1].set_ylabel(r\"$\\Delta$T (K)\", fontsize=12)\n\nText(0, 0.5, '$\\\\Delta$T (K)')", + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#learning-objectives", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#learning-objectives", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Learning Objectives", + "text": "Learning Objectives\n\nIntroduction to the PO.DAAC Data Downloader\nLearn how to plot the SSTA for the ENSO 3.4 Region and a timeseries", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" ] }, { - "objectID": "notebooks/Advanced_cloud/dask_cluster_01.html#additional-notes", - "href": "notebooks/Advanced_cloud/dask_cluster_01.html#additional-notes", - "title": "Parallel Computing with Earthdata in the Cloud", - "section": "4. Additional Notes", - "text": "4. Additional Notes\n\nTo compute the mean seasonal cycle, Xarray’s built in groupby() function is used to group the data by month of the year. As per this Xarray docs page, one can try using the flox package to speed up this groupby operation.", + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#download-data-in-the-command-line-using-the-po.daac-data-downloader", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#download-data-in-the-command-line-using-the-po.daac-data-downloader", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Download Data in the Command Line using the PO.DAAC Data Downloader", + "text": "Download Data in the Command Line using the PO.DAAC Data Downloader\nIn your terminal, go to the folder you want to download the files to – this will be important to remember. You will need to put your path name in the code below. Copy and paste each line (below) into your terminal. If you have all the prerequisites, the files will download to your folder:\npodaac-data-downloader -h\n\npodaac-data-subscriber -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2022-12-1T00:00:00Z -ed 2023-04-24T23:59:00Z -d .", "crumbs": [ - "Advanced Cloud", - "Dask and Coiled", - "Dask Dataset Chunking Example" + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" ] }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html", - "href": "notebooks/l2-regridding/reprojection notebook.html", - "title": "Harmony API Introduction", - "section": "", - "text": "This notebook provides an overview of the capabilities offered through the Harmony API and SWOT L2 Reproject tool. While written for SWOT L2 data, it works with most any level 2 data for projecting to a normal grid. In this tutorial we will use MODIS L2 data to show the native file projected to equal-area-cylindracal projection using both Nearest Neighbor and Bi-linear interpolation.\nStanding on the shoulders of previous authors: Amy Steiker, Patrick Quinn" - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#before-you-start", - "href": "notebooks/l2-regridding/reprojection notebook.html#before-you-start", - "title": "Harmony API Introduction", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#import-packages", - "href": "notebooks/l2-regridding/reprojection notebook.html#import-packages", - "title": "Harmony API Introduction", - "section": "Import packages", - "text": "Import packages\n\nfrom urllib import request, parse\nfrom http.cookiejar import CookieJar\nimport getpass\nimport netrc\nimport os\nimport requests\nimport json\nimport pprint\nfrom osgeo import gdal\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport rasterio\nfrom rasterio.plot import show\nimport numpy as np\nimport os\nimport time\nfrom netCDF4 import Dataset\n%matplotlib inline" - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#identify-a-data-collection-of-interest", - "href": "notebooks/l2-regridding/reprojection notebook.html#identify-a-data-collection-of-interest", - "title": "Harmony API Introduction", - "section": "Identify a data collection of interest", - "text": "Identify a data collection of interest\nA CMR collection ID is needed to request services through Harmony. The collection ID can be determined using the CMR API. We will query the corresponding ID of a known collection short name, MODIS_A-JPL-L2P-v2019.0.\n\nparams = {\n 'short_name': 'MODIS_A-JPL-L2P-v2019.0',\n 'provider_id': 'POCLOUD'\n} # parameter dictionary with known CMR short_name\n\ncmr_collections_url = 'https://cmr.earthdata.nasa.gov/search/collections.json'\ncmr_response = requests.get(cmr_collections_url, params=params)\ncmr_results = json.loads(cmr_response.content) # Get json response from CMR collection metadata\n\ncollectionlist = [el['id'] for el in cmr_results['feed']['entry']]\nharmony_collection_id = collectionlist[0]\nprint(harmony_collection_id)\n\nC1940473819-POCLOUD\n\n\nWe can also view the MODIS_A-JPL-L2P-v2019.0 collection metadata to glean more information about the collection:\n\npprint.pprint(cmr_results)\n\n{'feed': {'entry': [{'archive_center': 'NASA/JPL/PODAAC',\n 'associations': {'services': ['S1962070864-POCLOUD',\n 'S2004184019-POCLOUD',\n 'S2153799015-POCLOUD',\n 'S2227193226-POCLOUD'],\n 'tools': ['TL2108419875-POCLOUD',\n 'TL2092786348-POCLOUD'],\n 'variables': ['V1997812737-POCLOUD',\n 'V1997812697-POCLOUD',\n 'V2112014688-POCLOUD',\n 'V1997812756-POCLOUD',\n 'V1997812688-POCLOUD',\n 'V1997812670-POCLOUD',\n 'V1997812724-POCLOUD',\n 'V2112014684-POCLOUD',\n 'V1997812701-POCLOUD',\n 'V1997812681-POCLOUD',\n 'V2112014686-POCLOUD',\n 'V1997812663-POCLOUD',\n 'V1997812676-POCLOUD',\n 'V1997812744-POCLOUD',\n 'V1997812714-POCLOUD']},\n 'boxes': ['-90 -180 90 180'],\n 'browse_flag': True,\n 'cloud_hosted': True,\n 'collection_data_type': 'SCIENCE_QUALITY',\n 'consortiums': ['GEOSS', 'EOSDIS'],\n 'coordinate_system': 'CARTESIAN',\n 'data_center': 'POCLOUD',\n 'dataset_id': 'GHRSST Level 2P Global Sea Surface Skin '\n 'Temperature from the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the '\n 'NASA Aqua satellite (GDS2)',\n 'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True,\n 'id': 'C1940473819-POCLOUD',\n 'links': [{'href': 'https://podaac.jpl.nasa.gov/Podaac/thumbnails/MODIS_A-JPL-L2P-v2019.0.jpg',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/browse#'},\n {'href': 'https://github.com/podaac/data-readers',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-docs/ghrsst/open/docs/GDS20r5.pdf',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://ghrsst.jpl.nasa.gov',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/flag/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/reprocessing/r2019/sst/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst4/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://modis.gsfc.nasa.gov/data/atbd/atbd_mod25.pdf',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://oceancolor.gsfc.nasa.gov/atbd/sst/',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'http://www.ghrsst.org',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/forum/viewforum.php?f=18&sid=e2d67e5a01815fc6e39fcd2087ed8bc8',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://podaac.jpl.nasa.gov/CitingPODAAC',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'length': '75.0MB',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'},\n {'href': 'https://github.com/podaac/tutorials/blob/master/notebooks/MODIS_L2P_SST_DataCube.ipynb',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/documentation#'},\n {'href': 'https://search.earthdata.nasa.gov/search/granules?p=C1940473819-POCLOUD',\n 'hreflang': 'en-US',\n 'rel': 'http://esipfed.org/ns/fedsearch/1.1/data#'}],\n 'online_access_flag': True,\n 'orbit_parameters': {'inclination_angle': '98.1',\n 'number_of_orbits': '1.0',\n 'period': '98.4',\n 'swath_width': '2330.0'},\n 'organizations': ['NASA/JPL/PODAAC'],\n 'original_format': 'UMM_JSON',\n 'platforms': ['Aqua'],\n 'processing_level_id': '2',\n 'service_features': {'esi': {'has_formats': False,\n 'has_spatial_subsetting': False,\n 'has_temporal_subsetting': False,\n 'has_transforms': False,\n 'has_variables': False},\n 'harmony': {'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True},\n 'opendap': {'has_formats': True,\n 'has_spatial_subsetting': True,\n 'has_temporal_subsetting': True,\n 'has_transforms': False,\n 'has_variables': True}},\n 'short_name': 'MODIS_A-JPL-L2P-v2019.0',\n 'summary': 'NASA produces skin sea surface temperature '\n '(SST) products from the Infrared (IR) '\n 'channels of the Moderate-resolution Imaging '\n 'Spectroradiometer (MODIS) onboard the Aqua '\n 'satellite. Aqua was launched by NASA on May '\n '4, 2002, into a sun synchronous, polar orbit '\n 'with a daylight ascending node at 1:30 pm, '\n 'formation flying in the A-train with other '\n 'Earth Observation Satellites (EOS), to study '\n 'the global dynamics of the Earth atmosphere, '\n 'land and oceans. MODIS captures data in 36 '\n 'spectral bands at a variety of spatial '\n 'resolutions. Two SST products can be present '\n 'in these files. The first is a skin SST '\n 'produced for both day and night (NSST) '\n 'observations, derived from the long wave IR '\n '11 and 12 micron wavelength channels, using a '\n 'modified nonlinear SST algorithm intended to '\n 'provide continuity of SST derived from '\n 'heritage and current NASA sensors. At night, '\n 'a second SST product is generated using the '\n 'mid-infrared 3.95 and 4.05 micron wavelength '\n 'channels which are unique to MODIS; the SST '\n 'derived from these measurements is identified '\n 'as SST4. The SST4 product has lower '\n 'uncertainty, but due to sun glint can only be '\n 'used at night. MODIS L2P SST data have a 1 km '\n 'spatial resolution at nadir and are stored in '\n '288 five minute granules per day. Full global '\n 'coverage is obtained every two days, with '\n 'coverage poleward of 32.3 degree being '\n 'complete each day. The production of MODIS '\n 'L2P SST files is part of the Group for High '\n 'Resolution Sea Surface Temperature (GHRSST) '\n 'project and is a joint collaboration between '\n 'the NASA Jet Propulsion Laboratory (JPL), the '\n 'NASA Ocean Biology Processing Group (OBPG), '\n 'and the Rosenstiel School of Marine and '\n 'Atmospheric Science (RSMAS). Researchers at '\n 'RSMAS are responsible for SST algorithm '\n 'development, error statistics and quality '\n 'flagging, while the OBPG, as the NASA ground '\n 'data system, is responsible for the '\n 'production of daily MODIS ocean products. JPL '\n 'acquires MODIS ocean granules from the OBPG '\n 'and reformats them to the GHRSST L2P netCDF '\n 'specification with complete metadata and '\n 'ancillary variables, and distributes the data '\n 'as the official Physical Oceanography Data '\n 'Archive (PO.DAAC) for SST. The R2019.0 '\n 'supersedes the previous R2014.0 datasets '\n 'which can be found at '\n 'https://doi.org/10.5067/GHMDA-2PJ02',\n 'time_start': '2002-07-04T00:00:00.000Z',\n 'title': 'GHRSST Level 2P Global Sea Surface Skin '\n 'Temperature from the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the NASA '\n 'Aqua satellite (GDS2)',\n 'updated': '2019-12-02T22:59:24.849Z',\n 'version_id': '2019.0'}],\n 'id': 'https://cmr.earthdata.nasa.gov:443/search/collections.json?short_name=MODIS_A-JPL-L2P-v2019.0&provider_id=POCLOUD',\n 'title': 'ECHO dataset metadata',\n 'updated': '2022-10-25T21:32:46.472Z'}}\n\n\nNext we get a granule ID from this collection, G2525170359-POCLOUD.\n\ncmr_url = \"https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=\"+harmony_collection_id+\"&sort_key=-start_date\"\n\nresponse = requests.get(cmr_url)\n\ngid=response.json()['items'][0]['meta']['concept-id']\nprint(gid)\n\nG2525170359-POCLOUD" - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#access-reprojected-data", - "href": "notebooks/l2-regridding/reprojection notebook.html#access-reprojected-data", - "title": "Harmony API Introduction", - "section": "Access reprojected data", - "text": "Access reprojected data\nThe Harmony API accepts reprojection requests with a given coordinate reference system using the outputCrs keyword. According to the Harmony API documentation, this keyword “recognizes CRS types that can be inferred by gdal, including EPSG codes, Proj4 strings, and OGC URLs (http://www.opengis.net/def/crs/…)”." - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#the-practice-datasets-below-used-for-this-tutorial-are-no-longer-supported-for-details-about-the-harmony-api-see-this-tutorial-from-the-2021-cloud-hackathon-or-this-tutorial-introducing-the-harmony-py-library.", - "href": "notebooks/l2-regridding/reprojection notebook.html#the-practice-datasets-below-used-for-this-tutorial-are-no-longer-supported-for-details-about-the-harmony-api-see-this-tutorial-from-the-2021-cloud-hackathon-or-this-tutorial-introducing-the-harmony-py-library.", - "title": "Harmony API Introduction", - "section": "The practice datasets below used for this tutorial are no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.", - "text": "The practice datasets below used for this tutorial are no longer supported, for details about the Harmony API see this tutorial from the 2021 Cloud Hackathon or this tutorial introducing the Harmony-py library.\nTwo examples below demonstrate inputting an EPSG code and Proj4 string using the global test granule from previous examples. First, let’s view the projection information of the granule in the native projection, using the variable subset example:" - }, - { - "objectID": "notebooks/l2-regridding/reprojection notebook.html#access-level-2-swath-regridded-data", - "href": "notebooks/l2-regridding/reprojection notebook.html#access-level-2-swath-regridded-data", - "title": "Harmony API Introduction", - "section": "Access Level 2 swath regridded data", - "text": "Access Level 2 swath regridded data\nMoving outside of the harmony/gdal service, we will now request regridding from the sds/swot-reproject service using the C1940473819-POCLOUD.\nThe Harmony API accepts several query parameters related to regridding and interpolation in addition to the reprojection parameters above:\ninterpolation=<String> - Both near and bilinear are valid options\nscaleSize=x,y - 2 comma separated numbers as floats\nscaleExtent=xmin,ymin,xmax,ymax - 4 comma separated numbers as floats\nwidth=<Float>\nheight=<Float>\nAn error is returned if both scaleSize and width/height parameters are both provided (only one or the other can be used).\nRequest reprojection to Europe Lambert Conformal Conic with a new scale extent and nearest neighbor interpolation:\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\n# URL encode string using urllib parse package\nproj_string = '+proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs' # proj4 of WGS 84 / NSIDC EASE-Grid 2.0 Global projection\n#l2proj_string = '+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'\nl2proj_encode = parse.quote(proj_string)\n\nregridConfig = {\n 'l2collection_id': 'C1940473819-POCLOUD',\n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'granuleid': 'G1234734747-POCLOUD',\n 'outputCrs': l2proj_encode,\n 'interpolation': 'near',\n 'width': 1000,\n 'height': 1000\n}\n\nregrid_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\nprint('Request URL', regrid_url)\nregrid_response = request.urlopen(regrid_url)\nregrid_results = regrid_response.read()\n\nRequest URL https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?&granuleid=G1234734747-POCLOUD&outputCrs=%2Bproj%3Dcea%20%2Blon_0%3D0%20%2Blat_ts%3D30%20%2Bx_0%3D0%20%2By_0%3D0%20%2Bellps%3DWGS84%20%2Btowgs84%3D0%2C0%2C0%2C0%2C0%2C0%2C0%20%2Bunits%3Dm%20%2Bno_defs&interpolation=near&height=1000&width=1000\n\n\n\n---------------------------------------------------------------------------\nHTTPError Traceback (most recent call last)\n~\\AppData\\Local\\Temp/ipykernel_25980/2681644789.py in <module>\n 19 regrid_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\n 20 print('Request URL', regrid_url)\n---> 21 regrid_response = request.urlopen(regrid_url)\n 22 regrid_results = regrid_response.read()\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)\n 220 else:\n 221 opener = _opener\n--> 222 return opener.open(url, data, timeout)\n 223 \n 224 def install_opener(opener):\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in open(self, fullurl, data, timeout)\n 529 for processor in self.process_response.get(protocol, []):\n 530 meth = getattr(processor, meth_name)\n--> 531 response = meth(req, response)\n 532 \n 533 return response\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_response(self, request, response)\n 638 # request was successfully received, understood, and accepted.\n 639 if not (200 <= code < 300):\n--> 640 response = self.parent.error(\n 641 'http', request, response, code, msg, hdrs)\n 642 \n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in error(self, proto, *args)\n 561 http_err = 0\n 562 args = (dict, proto, meth_name) + args\n--> 563 result = self._call_chain(*args)\n 564 if result:\n 565 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in _call_chain(self, chain, kind, meth_name, *args)\n 500 for handler in handlers:\n 501 func = getattr(handler, meth_name)\n--> 502 result = func(*args)\n 503 if result is not None:\n 504 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_error_302(self, req, fp, code, msg, headers)\n 753 fp.close()\n 754 \n--> 755 return self.parent.open(new, timeout=req.timeout)\n 756 \n 757 http_error_301 = http_error_303 = http_error_307 = http_error_302\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in open(self, fullurl, data, timeout)\n 529 for processor in self.process_response.get(protocol, []):\n 530 meth = getattr(processor, meth_name)\n--> 531 response = meth(req, response)\n 532 \n 533 return response\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_response(self, request, response)\n 638 # request was successfully received, understood, and accepted.\n 639 if not (200 <= code < 300):\n--> 640 response = self.parent.error(\n 641 'http', request, response, code, msg, hdrs)\n 642 \n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in error(self, proto, *args)\n 567 if http_err:\n 568 args = (dict, 'default', 'http_error_default') + orig_args\n--> 569 return self._call_chain(*args)\n 570 \n 571 # XXX probably also want an abstract factory that knows when it makes\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in _call_chain(self, chain, kind, meth_name, *args)\n 500 for handler in handlers:\n 501 func = getattr(handler, meth_name)\n--> 502 result = func(*args)\n 503 if result is not None:\n 504 return result\n\n~\\Anaconda3\\envs\\main\\lib\\urllib\\request.py in http_error_default(self, req, fp, code, msg, hdrs)\n 647 class HTTPDefaultErrorHandler(BaseHandler):\n 648 def http_error_default(self, req, fp, code, msg, hdrs):\n--> 649 raise HTTPError(req.full_url, code, msg, hdrs, fp)\n 650 \n 651 class HTTPRedirectHandler(BaseHandler):\n\nHTTPError: HTTP Error 401: Unauthorized\n\n\n\nThis reprojected and regridded output is downloaded to the Harmony outputs directory and we can inspect a variable to check for projection and grid dimension:\n\nregrid_file_name = 'regrid-near.nc'\nregrid_filepath = str(regrid_file_name)\nfile_ = open(regrid_filepath, 'wb')\nfile_.write(regrid_results)\nfile_.close()\n\n\nharmony_root = 'https://harmony.earthdata.nasa.gov'\n\n# URL encode string using urllib parse package\nproj_string = '+proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs' # proj4 of WGS 84 / NSIDC EASE-Grid 2.0 Global projection\n#l2proj_string = '+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs'\nl2proj_encode = parse.quote(proj_string)\n\nharmony_root = 'https://harmony.uat.earthdata.nasa.gov'\n\nregridConfig = {\n 'l2collection_id': 'C1234724470-POCLOUD',\n 'ogc-api-coverages_version': '1.0.0',\n 'variable': 'all',\n 'granuleid': 'G1234734747-POCLOUD',\n 'outputCrs': l2proj_encode,\n 'interpolation': 'bilinear',\n 'width': 1000,\n 'height': 1000\n}\n\nregrid_bi_url = harmony_root+'/{l2collection_id}/ogc-api-coverages/{ogc-api-coverages_version}/collections/{variable}/coverage/rangeset?&granuleid={granuleid}&outputCrs={outputCrs}&interpolation={interpolation}&height={height}&width={width}'.format(**regridConfig)\nprint('Request URL', regrid_bi_url)\nregrid_bi_response = request.urlopen(regrid_bi_url)\nregrid_bi_results = regrid_bi_response.read()\n\n\nregrid_bi_file_name = 'regrid-bi.nc'\nregrid_bi_filepath = str(regrid_bi_file_name)\nfile_ = open(regrid_bi_filepath, 'wb')\nfile_.write(regrid_bi_results)\nfile_.close()\n\nPrint the x and y dimensions to confirm that the output matches the requested scale extent in meters:\n\nimport xarray as xr\nreproject_ds = xr.open_dataset(regrid_filepath, drop_variables='time')\nprint(reproject_ds)\n\n\nimport xarray as xr\nreproject_bi_ds = xr.open_dataset(regrid_bi_filepath, drop_variables='time')\nprint(reproject_bi_ds)\n\n\noriginal_ds = xr.open_dataset('20200131234501-JPL-L2P_GHRSST-SSTskin-MODIS_A-D-v02.0-fv01.0.nc')\nprint(original_ds)\n\n\ng = reproject_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Nearest Neighbor Interpolation\")\n\n\ng= reproject_bi_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Bilinear Interpolation\")\n\n\ng = original_ds.sea_surface_temperature.plot(robust=True)\ng.axes.set_title(\"Native File\")\n\n\ng= original_ds.sea_surface_temperature.plot(x=\"lon\", y=\"lat\", robust=True)\ng.axes.set_title(\"Native, projected to Lat/Lon\")" - }, - { - "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html", - "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html", - "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", - "section": "", - "text": "Read more about the EOSDIS Cloud at NASA Earthdata." - }, - { - "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#overview", - "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#overview", - "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", - "section": "Overview", - "text": "Overview\nThis tutorial uses satellite data products to analyze the relationships between river height and land water equivalent thickness in the Amazon River estuary. Users can expand on these examples to also include sea surface salinity, sea surface temperature, and ocean color for example, for a more comprehensive exploration of the Amazon river basin’s estuary and coastal region. The contents are useful for the ocean, coastal and terrestrial hydrosphere disciplines, showcasing how to use on premises and Earthdata cloud datasets, existing Earthdata cloud services and functionalities, and Earthdata User Interface (UI) and Application Programming Interfaces (API).\n\nLearning objectives:\n\nSearch for land water equivalent (LWE) thickness (GRACE/GRACE-FO) and river discharge data (MEaSUREs Pre-SWOT)\nAccess LWE thickeness dataset in Zarr format from Earthdata Cloud (AWS) using the Harmony API (specifically the Zarr reformatted service)\nAccess discharge dataset from PODAAC on premise (server) data archive\nSubset both, plot and compare coincident data.\n\n\n\nDatasets\nThe tutorial uses a combination of cloud and on premises datasets: - JPL GRACE and GRACE-FO Mascon Ocean, Ice, and Hydrology Equivalent Water Height Coastal Resolution Improvement (CRI) Filtered Release 06 Version 02 - Provides land water equivalent (LWE) thickness for observing seasonal changes in water storage around the river. When discharge is high, the change in water storage will increase, pointing to a wet season. Source data are from GRACE and GRACE-FO. - Pre SWOT Hydrology GRRATS Daily River Heights and Storage Version 2 - Provides virtual gauges to stand in for discharge data from Surface Water and Ocean Topography (SWOT). MEaSUREs contains river height products, not discharge, but river height is directly related to discharge and thus will act as a good substitute. Data were produced for the Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program." - }, - { - "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#requirements", - "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#requirements", - "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", - "section": "Requirements", - "text": "Requirements\nThis notebook was developed to run in the AWS cloud (us-west-2 region), next to the Earthdata Cloud (PO.DAAC) data holdings, to leverage cloud optimized data formats (e.g. Zarr) and the Earthdata Harmony API, specifically the Zarr refomrating service. For more informaion on Harmony, please see https://harmony.earthdata.nasa.gov/ .\n\nBefore you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\nIn this notebook, we will be calling the authentication in the below cell, a work around if you do not yet have a netrc file.\nThis notebook was developed in Python 3.6.\n\nfrom urllib import request\nfrom http.cookiejar import CookieJar\nfrom getpass import getpass\nimport netrc\nfrom platform import system\nfrom os.path import join, isfile, basename, abspath, expanduser\n\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n \nsetup_earthdata_login_auth('urs.earthdata.nasa.gov')\n\nPlease provide your Earthdata Login credentials for access.\nYour info will only be passed to urs.earthdata.nasa.gov and will not be exposed in Jupyter.\n\n\nUsername: nickles\nPassword: ···········\n\n\n\nimport time\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nfrom urllib import request\nfrom urllib.request import urlopen\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nimport cartopy.crs as ccrs\nimport cartopy\nimport zarr\nimport s3fs\nfrom IPython.display import HTML\nfrom json import dumps, loads\n\n\n\nEndpoints\nSet a few endpoints for use during the remainder of the workflow:\n\ncmr = \"cmr.earthdata.nasa.gov\"\nurs = \"urs.earthdata.nasa.gov\"\nharmony = \"harmony.earthdata.nasa.gov\"\n\ncmr, urs, harmony\n\n('cmr.earthdata.nasa.gov',\n 'urs.earthdata.nasa.gov',\n 'harmony.earthdata.nasa.gov')" - }, - { - "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#cloud-data-from-jpl-grace-and-grace-fo-mascon", - "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#cloud-data-from-jpl-grace-and-grace-fo-mascon", - "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", - "section": "Cloud data from JPL GRACE and GRACE-FO Mascon", - "text": "Cloud data from JPL GRACE and GRACE-FO Mascon\n\n\n\ngrace mascon\n\n\nJPL GRACE and GRACE-FO Mascon Ocean, Ice, and Hydrology Equivalent Water Height Coastal Resolution Improvement (CRI) Filtered Release 06 Version 02\nThis dataset contains gridded monthly global water storage/height anomalies relative to a time-mean, derived from GRACE and GRACE-FO and processed at JPL using the Mascon approach (Version2/RL06). These data are provided in a single data file in netCDF format, and can be used for analysis for ocean, ice, and hydrology phenomena. This version of the data employs a Coastal Resolution Improvement (CRI) filter that reduces signal leakage errors across coastlines. The water storage/height anomalies are given in equivalent water thickness units (cm). The solution provided here is derived from solving for monthly gravity field variations in terms of geolocated spherical cap mass concentration functions, rather than global spherical harmonic coefficients. Additionally, realistic geophysical information is introduced during the solution inversion to intrinsically remove correlated error. Thus, these Mascon grids do not need to be destriped or smoothed, like traditional spherical harmonic gravity solutions. The complete Mascon solution consists of 4,551 relatively independent estimates of surface mass change that have been derived using an equal-area 3-degree grid of individual mascons. A subset of these individual mascons span coastlines, and contain mixed land and ocean mass change signals.\nFor more information, please visit https://grace.jpl.nasa.gov/data/get-data/jpl_global_mascons/.\nFor a detailed description on the Mascon solution, including the mathematical derivation, implementation of geophysical constraints, and solution validation, please see Watkins et al., 2015, doi: 10.1002/2014JB011547. For a detailed description of the CRI filter implementation, please see Wiese et al., 2016, doi: 10.1002/2016WR019344.\n\nMetadata\nData from the TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2 dataset can be obtained from AWS S3. Use its ShortName to retrieve the collection metadata from CMR:\n\ngrace_ShortName = \"TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2\"\ngrace_ShortName\n\n'TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2'\n\n\n\nCollection (dataset)\nGet the UMM Collection metadata using requests.get:\n\nr = requests.get(url=f\"https://{cmr}/search/collections.umm_json\", \n params={'provider': \"POCLOUD\", \n 'ShortName': grace_ShortName})\n\ngrace_coll = r.json()\ngrace_coll['hits']\n\n1\n\n\nThere should be only one result. Select and print its CMR Search metadata:\n\ngrace_coll_meta = grace_coll['items'][0]['meta']\ngrace_coll_meta\n\n{'revision-id': 21,\n 'deleted': False,\n 'format': 'application/vnd.nasa.cmr.umm+json',\n 'provider-id': 'POCLOUD',\n 'user-id': 'chen5510',\n 'has-formats': True,\n 'associations': {'variables': ['V2079350316-POCLOUD',\n 'V2079362050-POCLOUD',\n 'V2112016640-POCLOUD',\n 'V2112016643-POCLOUD',\n 'V2112016651-POCLOUD',\n 'V2112016653-POCLOUD',\n 'V2112016655-POCLOUD',\n 'V2112016657-POCLOUD'],\n 'services': ['S2004184019-POCLOUD'],\n 'tools': ['TL2108419875-POCLOUD']},\n 's3-links': ['podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/',\n 'podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/'],\n 'has-spatial-subsetting': True,\n 'native-id': 'JPL+GRACE+and+GRACE-FO+Mascon+Ocean,+Ice,+and+Hydrology+Equivalent+Water+Height+Coastal+Resolution+Improvement+(CRI)+Filtered+Release+06+Version+02',\n 'has-transforms': False,\n 'has-variables': True,\n 'concept-id': 'C1938032626-POCLOUD',\n 'revision-date': '2022-09-30T20:16:20.101Z',\n 'has-temporal-subsetting': True,\n 'concept-type': 'collection'}\n\n\n\n\nGranule (file)\nGet the UMM Granule metadata using requests.get:\n\nr = requests.get(url=f\"https://{cmr}/search/granules.umm_json\", \n params={'provider': \"POCLOUD\", \n 'ShortName': grace_ShortName})\n\ngrace_gran = r.json()\ngrace_gran['hits']\n\n1\n\n\nAs you can see, one result was returned (one hit). Print the CMR Search metadata for the granule (meta):\n\ngrace_gran['items'][0]['meta']\n\n{'concept-type': 'granule',\n 'concept-id': 'G2435507181-POCLOUD',\n 'revision-id': 1,\n 'native-id': 'GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI',\n 'provider-id': 'POCLOUD',\n 'format': 'application/vnd.nasa.cmr.umm+json',\n 'revision-date': '2022-09-02T17:44:24.135Z'}\n\n\nThe other component in each result (from the list of items) is the UMM metadata, accessible from the umm key. Print the RelatedUrls metadata field for the granule:\n\ngrace_gran['items'][0]['umm']['RelatedUrls']\n\n[{'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Description': 'Download GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Type': 'GET DATA'},\n {'URL': 's3://podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Description': 'This link provides direct download access via S3 to the granule',\n 'Type': 'GET DATA VIA DIRECT ACCESS'},\n {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Description': 'Download GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Type': 'EXTENDED METADATA'},\n {'URL': 's3://podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Description': 'This link provides direct download access via S3 to the granule',\n 'Type': 'EXTENDED METADATA'},\n {'URL': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'Description': 'api endpoint to retrieve temporary credentials valid for same-region direct s3 access',\n 'Type': 'VIEW RELATED INFORMATION'},\n {'URL': 'https://opendap.earthdata.nasa.gov/collections/C1938032626-POCLOUD/granules/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI',\n 'Type': 'USE SERVICE API',\n 'Subtype': 'OPENDAP DATA',\n 'Description': 'OPeNDAP request URL'}]\n\n\nWe want the URL corresponding to 'Type': 'GET DATA'. Select the URL from appropriate item in the list, then print:\n\ngrace_url = grace_gran['items'][0]['umm']['RelatedUrls'][0]['URL']\ngrace_url\n\n'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc'\n\n\nThen, to do a regular HTTPS download:\nr = requests.get(grace_url)\nwith open('tutorial7_data_GRACEFO.nc', 'wb') as f:\n f.write(r.content)\n\n!ncdump -h tutorial7_data_GRACEFO.nc\nBut we’ll use the Harmony API’s Zarr Reformatter service instead of downloading the entire granule. The zarr format will allow us to open and download/read just the data that we require for our Amazon Basin study area.\n\n\n\nRequest to Harmony API: Zarr Reformatter\nIf you have a jobID you’d like to re-visit instead of running this command again, modify the cell below to set the async_jobId then skip to Format and display the complete url to the Harmony API job:.\nIf you are running for the first time, proceed to the next cells to submit the harmony request.\n\n#async_jobId = \"dfefc536-768c-4db3-a7d2-c326e9253042\" # jobId belongs to dev. You wont have access.\nasync_jobId = None \n\nSee important usage note below if this is your first time submitting a request to the Zarr Reformatter service.\nThe Zarr Reformatter service operates on an input Collection concept-id (a CMR construct). The service will accept more user-friendly inputs (like a Collection ShortName) in future releases. Here’s how you identify the CMR concept-id for the JPL GRACE/GRACE-FO Mascon dataset:\n\ncollection_concept_id = grace_coll_meta['concept-id']\ncollection_concept_id\n\n'C1938032626-POCLOUD'\n\n\nMost of this next cell will only evaluate if there’s NOT a valid job identifier set to the async_jobId variable above. It submits the Harmony request, and prints the JSON response.\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection_id = Collection(collection_concept_id) \n\nrequest = Request(\n collection=collection_id,\n format='application/x-zarr'\n)\n\nrequest.is_valid()\n\nTrue\n\n\n\nif async_jobId is None:\n print(harmony_client.request_as_curl(request))\n async_jobId = harmony_client.submit(request)\n print(f'Job ID: {async_jobId}')\n print('\\n Waiting for the job to finish. . .\\n')\n response = harmony_client.result_json(async_jobId, show_progress=True)\n print(\"\\n. . .DONE!\")\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=9dd333f7ecce24b1bb77b97e8f6f7a12' -H 'User-Agent: python-requests/2.28.0 harmony-py/0.4.2 Linux/5.4.156-83.273.amzn2.x86_64 CPython/3.9.13' 'https://harmony.earthdata.nasa.gov/C1938032626-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-zarr'\nJob ID: 9c93ee8e-1b5d-4d65-bacd-a91070e0c44c\n\n Waiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\nQuery for the job status and links in case the request is still processing:\n\nwhile True:\n job_json = harmony_client.status(async_jobId)\n if job_json['status'] != 'running':\n break\n print(f\"# Job status is running. Progress is {job_json['progress']}. Trying again.\")\n time.sleep(5)\n\nlinks = []\nif job_json['status'] == 'successful' and job_json['progress'] == 100:\n print(\"# Job progress is 100%. Links to job outputs are displayed below:\")\n links = [link['href'] for link in response['links']]\n display(links)\nelse:\n print(job_json)\n\n# Job progress is 100%. Links to job outputs are displayed below:\n\n\n['https://harmony.earthdata.nasa.gov/stac/9c93ee8e-1b5d-4d65-bacd-a91070e0c44c/',\n 'https://harmony.earthdata.nasa.gov/cloud-access.sh',\n 'https://harmony.earthdata.nasa.gov/cloud-access',\n 's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/',\n 's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.zarr',\n 'https://harmony.earthdata.nasa.gov/jobs/9c93ee8e-1b5d-4d65-bacd-a91070e0c44c?linktype=https&page=1&limit=2000']\n\n\nAccess url for the output zarr file\nThe new zarr dataset is staged for us in an S3 bucket. The url is the second to last one in the list shown above.\nSelect the url and display below:\n\nzarr_url = links[-2]\nzarr_url\n\n's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.zarr'\n\n\nAccess credentials for the output zarr file\nCredentials provided at the third and fourth urls in the list grant authenticated access to your staged S3 resources.\nGrab the credentials as a JSON string, load to a Python dictionary, and display their expiration date:\n\nfrom urllib import request\nfrom urllib.request import urlopen\n\nwith request.urlopen(f\"https://{harmony}/cloud-access\") as f:\n creds = loads(f.read())\n\ncreds['Expiration']\n\n'2022-11-08T07:42:41.000Z'\n\n\n\n\nOpen staged zarr file with s3fs\nWe use the AWS s3fs package to get metadata about the zarr data store and list its contents:\n\nzarr_fs = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\nzarr_store = zarr_fs.get_mapper(root=zarr_url, check=False)\nzarr_dataset = zarr.open(zarr_store)\n\nprint(zarr_dataset.tree())\n\n/\n ├── lat (360,) float64\n ├── lat_bounds (360, 2) float64\n ├── lon (720,) float64\n ├── lon_bounds (720, 2) float64\n ├── lwe_thickness (211, 360, 720) float64\n ├── time (211,) float64\n ├── time_bounds (211, 2) float64\n └── uncertainty (211, 360, 720) float64\n\n\nNow print metadata for the lwe_thickness variable:\n\nprint(zarr_dataset.lwe_thickness.info)\n\nName : /lwe_thickness\nType : zarr.core.Array\nData type : float64\nShape : (211, 360, 720)\nChunk shape : (125, 125, 125)\nOrder : C\nRead-only : False\nCompressor : Blosc(cname='lz4', clevel=5, shuffle=SHUFFLE, blocksize=0)\nStore type : zarr.storage.KVStore\nNo. bytes : 437529600 (417.3M)\nNo. bytes stored : 76942675 (73.4M)\nStorage ratio : 5.7\nChunks initialized : 36/36\n\n\n\n\n\nOpen staged zarr file with xarray\nHere’s the documentation for xarray’s zarr reader: http://xarray.pydata.org/en/stable/generated/xarray.open_zarr.html\nOpen the zarr dataset and print the dataset:\n\nds_GRACE = xr.open_dataset(zarr_store, engine=\"zarr\")\nprint(ds_GRACE)\n\nSubset by Latitude/Longitude\nOnce we have obtained all the data, to make processing quicker, we are going to subset datasets by latitude/longitude for the Amazon River estuary.\nOnce we have obtained the GRACE-FO data, we should spatial subset the data to the minimal area covering the Amazon River estuary. This will reduce processing load and reduce cloud costs for the user.\nMake a GRACE-FO subset and display the min, max of the lat and lon variables:\n\nsubset_GRACE = ds_GRACE.sel(lat=slice(-18, 10), lon=slice(275, 330))\nprint(subset_GRACE.lat.min().data, \n subset_GRACE.lat.max().data,\n subset_GRACE.lon.min().data,\n subset_GRACE.lon.max().data)\n\nSelect the variable for Land Water Equivalent Thickness (lwe_thickness)\nGrab the land water equivalent thickness variable from the GRACE subset:\n\nlwe = subset_GRACE.lwe_thickness\nprint(lwe)\n\n\n\nPlots\nWe will create an animation from sequential GRACE-FO plots over the Amazon Rainforest in the following cells. Define two functions to make the process a bit more convenient:\n\ndef setup_map(ax, pmap, ds_subset, x, y, var, t, cmap, levels, extent):\n title = str(pd.to_datetime(ds_subset.time[t].values))\n pmap.set_title(title, fontsize=14)\n pmap.coastlines()\n pmap.set_extent(extent)\n pmap.add_feature(cartopy.feature.RIVERS)\n variable_desired = var[t,:,:]\n cont = pmap.contourf(x, y, variable_desired, cmap=cmap, levels=levels, zorder=1)\n return cont\n\ndef animate_ts(framenumber, ax, pmap, ds_subset, x, y, var, t, cmap, levels, extent):\n cont = setup_map(ax, pmap, ds_subset, x, y, var, t + framenumber, cmap, levels, extent) \n return cont\n\nPlot the first timestep in the JPL GRACE/GRACE-FO Mascon time series:\n\n# Initialize a matplotlib plot object and add subplot:\nfig = plt.figure(figsize=[13,9]) \nax = fig.add_subplot(1, 1, 1)\n\n# Configure axes to display projected data using PlateCarree crs:\npmap = plt.axes(projection=ccrs.PlateCarree())\n\n# Get arrays of x and y to label the plot axes:\nx,y = np.meshgrid(subset_GRACE.lon, subset_GRACE.lat) \n\n# Set a few constants for plotting the GRACE-FO time series:\ntime_start = 168\ncmap_name = \"bwr_r\"\ncmap_levels = np.linspace(-100., 100., 14)\nmap_extent = [-85, -30, -16, 11]\n\n# Plot the first timestep: \ncont = setup_map(ax, pmap, subset_GRACE, x, y, lwe, time_start, cmap_name, cmap_levels, map_extent)\n\nfig.colorbar(cont, ticks=cmap_levels, orientation='horizontal', label='Land Water Equivalent Thickness (cm)')\n\nPlot all the 2019 timesteps sequentially to create an animation of land water equivalent thickness for the Amazon Rainforest territories:\n\nani = animation.FuncAnimation(fig, animate_ts, frames=range(0,12), fargs=(\n ax, pmap, subset_GRACE, x, y, lwe, time_start, cmap_name, cmap_levels, map_extent\n), interval=500)\n\nHTML(ani.to_html5_video())\n\nUser note: You will need to install ‘ffmpeg’ in the cmd prompt to save the .mpg to disk. Use the following command to install from the conda-forge channel:\nconda install -c conda-forge ffmpeg\nUncomment, run the next cell to save the animation to MP4:\n\n#ani.save(\"tutorial7_animation_GRACEFO.mp4\", writer=animation.FFMpegWriter())" + { + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#import-packages", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#import-packages", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Import Packages", + "text": "Import Packages\n\n# Import packages \nimport numpy as np\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nimport xarray as xr\nimport matplotlib.ticker as mticker\nimport netCDF4 as nc\nimport numpy as np\nimport datetime as dt\nimport glob\nimport hvplot.xarray\nimport pandas as pd\n\n\n\n\n\n\n\n\n\n\nInput your folder directory where you used the Downloader to store the data\n\ndir = '/Users/your_user_name/folder_name/'", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" + ] }, { - "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#on-prem-hydro-data-from-pre-swot-measures-program", - "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#on-prem-hydro-data-from-pre-swot-measures-program", - "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", - "section": "On-prem hydro data from Pre-SWOT MEaSUREs program", - "text": "On-prem hydro data from Pre-SWOT MEaSUREs program\nData from PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2 are not currently available on the cloud, but we can access via the PO.DAAC’s on-prem OPeNDAP service (Hyrax) instead.\n\nThe guidebook explains the details of the Pre-SWOT MEaSUREs data: https://podaac-tools.jpl.nasa.gov/drive/files/allData/preswot_hydrology/L2/rivers/docs/GRRATS_user_handbookV2.pdf\nAccess URL for PO.DAAC on-prem OPeNDAP service\nIdentify an appropriate OPeNDAP endpoint through the following steps:\n\nGo to the project/mission page on the PO.DAAC portal (e.g. for Pre-SWOT MEaSUREs: https://podaac.jpl.nasa.gov/MEaSUREs-Pre-SWOT)\nChoose the dataset of interest. Go to the “Data Access” tab of the corresponding dataset landing page, which should like the OPeNDAP access link (for compatible datasets, e.g. for the daily river heights from virtual stations: https://podaac-opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/).\nNavigate to the desired NetCDF file and copy the endpoint (e.g. for our Amazon Basin use case we choose the South America file: https://opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/South_America_Amazon1kmdaily.nc).\n\n\nOpen netCDF file with xarray\nOpen the netCDF dataset via OPeNDAP using xarray:\n\nds_MEaSUREs = xr.open_dataset('https://opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/South_America_Amazon1kmdaily.nc')\nprint(ds_MEaSUREs)\n\n<xarray.Dataset>\nDimensions: (X: 3311, Y: 3311, distance: 3311, time: 9469,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-08T15:20:40.665117184 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 ...\n lat (Y) float64 ...\n FD (distance) float64 ...\n height (distance, time) float64 ...\n sat (charlength) |S64 ...\n storage (distance, time) float64 ...\n LakeFlag (distance) float64 ...\n Storage_uncertainty (distance, time) float64 ...\n IceFlag (time) float64 ...\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: -0.6550700975069503\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 92.7681246287056\n geospatial_vertical_min: -3.563409518163376\n geospatial_vertical_units: m\n geospatial_vertical_positive: up\n\n\nOur desired variable is height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Amazon estuary. Time is between April 8, 1993 and April 20, 2019.\n\n\nPlot\nAmazon River heights for March 16, 2018\nPlot the river distances and associated heights on the map at time t=9069:\n\nfig = plt.figure(figsize=[13,9]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-85, -30, -20, 20])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()\n\n\n\n\n\n\n\n\nFor GRACE-FO, plotting lwe_thickness[107:179,34,69] indicates time, latitude, and longitude indices corresponding to the pixel for the time period 1/2019 to 12/2019 at lat/lon (-0.7, -50). For the 2019 year, measurements of LWE thickness followd expected patterns of high volume of water from the river output into the estuary.\n2011-2019 Seasonality Plots (WIP)\nFor GRACE-FO, plotting lwe_thickness[107:179,34,69] indicates time, latitude, and longitude indices corresponding to the pixel for the time period 8/2011 to 12/2019 at lat/lon (-0.7, -50).\n\n#plot variables associated with river\nfig, ax1 = plt.subplots(figsize=[12,7])\n#plot river height\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\n\n#plot LWE thickness on secondary axis\nax2 = ax1.twinx()\nax2.plot(subset_GRACE.time[107:179], subset_GRACE.lwe_thickness[107:179,34,69], color = 'darkorange')\n\nax1.set_xlabel('Date')\nax2.set_ylabel('Land Water Equivalent Thickness (cm)', color='darkorange')\nax1.set_ylabel('River Height (m)', color='darkblue')\nax2.legend(['GRACE-FO'], loc='upper right')\nax1.legend(['Pre-SWOT MEaSUREs'], loc='lower right')\n\nplt.title('Amazon Estuary, 2011-2019 Lat, Lon = (-0.7, -50)')\n\nplt.show()" + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#open-and-plot-sea-surface-temperature-anomalies", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#open-and-plot-sea-surface-temperature-anomalies", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Open and Plot Sea Surface Temperature Anomalies", + "text": "Open and Plot Sea Surface Temperature Anomalies\n\n# Read the April 24 2023 NetCDF file\nds = xr.open_dataset(dir +'20230424090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc')\n\n# Extract the required variables\nlon = ds['lon']\nlat = ds['lat']\nsst_anomaly = ds['sst_anomaly']\n\n\n# Create the figure\nfig = plt.figure(figsize=(10, 10))\nax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(-150, 10))\n\n\n# Plot the sst_anomaly data with vmin and vmax\npcm = ax.pcolormesh(ds.lon, ds.lat, ds.sst_anomaly[0], transform=ccrs.PlateCarree(), cmap='rainbow', vmin=-2, vmax=2)\n\n\n# Plot the equator line\nax.plot(np.arange(360), np.zeros((360)), transform=ccrs.PlateCarree(), color='black')\n\n\n# Define the El Niño 1 + 2 region\nenso_bounds_lon = [-90, -80, -80, -90, -90]\nenso_bounds_lat = [-10, -10, 0, 0, -10]\n# Plot the Enso region box\nax.plot(enso_bounds_lon, enso_bounds_lat, transform=ccrs.PlateCarree(), color='black', linewidth=2)\n\n\n# Define the El Niño 3 region\nenso_bounds_lon2 = [-150, -90, -90, -150, -150]\nenso_bounds_lat2 = [-5, -5, 5, 5, -5]\n# Plot great circle equations for Enso region 3 (accounts for the curve)\nfor i in range(4):\n circle_lon = np.linspace(enso_bounds_lon2[i], enso_bounds_lon2[i+1], 100)\n circle_lat = np.linspace(enso_bounds_lat2[i], enso_bounds_lat2[i+1], 100)\n ax.plot(circle_lon, circle_lat, transform=ccrs.PlateCarree(), color='brown', linestyle='--', linewidth=2)\n\n\n# Add coastlines and gridlines\nax.add_feature(cfeature.COASTLINE)\nax.add_feature(cfeature.LAND, facecolor='gray')\nax.add_feature(cfeature.LAKES)\nax.add_feature(cfeature.RIVERS)\n\n\n#Set tick locations and labels for the colorbar\ncbar = plt.colorbar(pcm, ax=ax, orientation='horizontal', pad=0.05, fraction=0.04)\ncbar.set_label('SST Anomaly', color = 'white')\ncbar.set_ticks([-2, -1, 0, 1, 2])\ncbar.set_ticklabels([-2, -1, 0, 1, 2]) \ncbar.ax.tick_params(color='white')\ncbar.ax.xaxis.set_ticklabels(cbar.ax.get_xticks(), color='white')\ncbar.ax.yaxis.set_ticklabels(cbar.ax.get_yticks(), color='white')\n\n\n# Add white text on top left and right\nfig.text(0.02, 0.95, 'APR 24 2023', color='white', fontsize=20, ha='left', va='top')\nfig.text(0.98, 0.95, 'MUR SSTA', color='white', fontsize=20, ha='right', va='top')\n\n\n# #Background set to black\nfig.set_facecolor('black')\n\n\nplt.show()", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "GHRSST", + "Use Case Demo" + ] }, { - "objectID": "notebooks/datasets/MUR_SST_Washington_Comparison.html", - "href": "notebooks/datasets/MUR_SST_Washington_Comparison.html", - "title": "MUR Sea Surface Temperature Analysis of Washington State", - "section": "", - "text": "From the PO.DAAC Cookbook, to access the GitHub version of the notebook, follow this link.\n\n\nMUR Sea Surface Temperature Analysis of Washington State\n\nRequirement:\n\nCompute environment\n\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\nEarthdata Login\n\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nLearning Objectives:\n\nAccess cloud-stored MUR Global SST data within AWS cloud, without downloading it to your local machine\nVisualize and analyze data in a use case example\nUse earthaccess library to search for, access, and download the data\n\n\n\nGHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1) Dataset:\n\nMUR-JPL-L4-GLOB-v4.1\n\n\nDOI: https://doi.org/10.5067/GHGMR-4FJ04\n\nNotebook Author: Zoë Walschots, NASA PO.DAAC (Aug 2023)\n\n\nImport Packages\n\nimport h5netcdf\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeat\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n\n\n\n\n\n\n\n\n\n\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)\n\n\n\nAccess and Visualize Data\nLet’s look at the Sea Surface Temperature of first summer we have data for (2012) using earthaccess\n\nmur_results = earthaccess.search_data(short_name = 'MUR-JPL-L4-GLOB-v4.1', temporal = ('2012-05-21', '2012-08-20'), bounding_box = ('-125.41992','45.61181','-116.64844','49.2315'))\n\nGranules found: 92\n\n\n\nds_mur = xr.open_mfdataset(earthaccess.open(mur_results), engine = 'h5netcdf')\nds_mur\n\n Opening 92 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 92, lat: 17999, lon: 36000)\nCoordinates:\n * time (time) datetime64[ns] 2012-05-21T09:00:00 ... 2012-08-2...\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.5\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 92lat: 17999lon: 36000Coordinates: (3)time(time)datetime64[ns]2012-05-21T09:00:00 ... 2012-08-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2012-05-21T09:00:00.000000000', '2012-05-22T09:00:00.000000000',\n '2012-05-23T09:00:00.000000000', '2012-05-24T09:00:00.000000000',\n '2012-05-25T09:00:00.000000000', '2012-05-26T09:00:00.000000000',\n '2012-05-27T09:00:00.000000000', '2012-05-28T09:00:00.000000000',\n '2012-05-29T09:00:00.000000000', '2012-05-30T09:00:00.000000000',\n '2012-05-31T09:00:00.000000000', '2012-06-01T09:00:00.000000000',\n '2012-06-02T09:00:00.000000000', '2012-06-03T09:00:00.000000000',\n '2012-06-04T09:00:00.000000000', '2012-06-05T09:00:00.000000000',\n '2012-06-06T09:00:00.000000000', '2012-06-07T09:00:00.000000000',\n '2012-06-08T09:00:00.000000000', '2012-06-09T09:00:00.000000000',\n '2012-06-10T09:00:00.000000000', '2012-06-11T09:00:00.000000000',\n '2012-06-12T09:00:00.000000000', '2012-06-13T09:00:00.000000000',\n '2012-06-14T09:00:00.000000000', '2012-06-15T09:00:00.000000000',\n '2012-06-16T09:00:00.000000000', '2012-06-17T09:00:00.000000000',\n '2012-06-18T09:00:00.000000000', '2012-06-19T09:00:00.000000000',\n '2012-06-20T09:00:00.000000000', '2012-06-21T09:00:00.000000000',\n '2012-06-22T09:00:00.000000000', '2012-06-23T09:00:00.000000000',\n '2012-06-24T09:00:00.000000000', '2012-06-25T09:00:00.000000000',\n '2012-06-26T09:00:00.000000000', '2012-06-27T09:00:00.000000000',\n '2012-06-28T09:00:00.000000000', '2012-06-29T09:00:00.000000000',\n '2012-06-30T09:00:00.000000000', '2012-07-01T09:00:00.000000000',\n '2012-07-02T09:00:00.000000000', '2012-07-03T09:00:00.000000000',\n '2012-07-04T09:00:00.000000000', '2012-07-05T09:00:00.000000000',\n '2012-07-06T09:00:00.000000000', '2012-07-07T09:00:00.000000000',\n '2012-07-08T09:00:00.000000000', '2012-07-09T09:00:00.000000000',\n '2012-07-10T09:00:00.000000000', '2012-07-11T09:00:00.000000000',\n '2012-07-12T09:00:00.000000000', '2012-07-13T09:00:00.000000000',\n '2012-07-14T09:00:00.000000000', '2012-07-15T09:00:00.000000000',\n '2012-07-16T09:00:00.000000000', '2012-07-17T09:00:00.000000000',\n '2012-07-18T09:00:00.000000000', '2012-07-19T09:00:00.000000000',\n '2012-07-20T09:00:00.000000000', '2012-07-21T09:00:00.000000000',\n '2012-07-22T09:00:00.000000000', '2012-07-23T09:00:00.000000000',\n '2012-07-24T09:00:00.000000000', '2012-07-25T09:00:00.000000000',\n '2012-07-26T09:00:00.000000000', '2012-07-27T09:00:00.000000000',\n '2012-07-28T09:00:00.000000000', '2012-07-29T09:00:00.000000000',\n '2012-07-30T09:00:00.000000000', '2012-07-31T09:00:00.000000000',\n '2012-08-01T09:00:00.000000000', '2012-08-02T09:00:00.000000000',\n '2012-08-03T09:00:00.000000000', '2012-08-04T09:00:00.000000000',\n '2012-08-05T09:00:00.000000000', '2012-08-06T09:00:00.000000000',\n '2012-08-07T09:00:00.000000000', '2012-08-08T09:00:00.000000000',\n '2012-08-09T09:00:00.000000000', '2012-08-10T09:00:00.000000000',\n '2012-08-11T09:00:00.000000000', '2012-08-12T09:00:00.000000000',\n '2012-08-13T09:00:00.000000000', '2012-08-14T09:00:00.000000000',\n '2012-08-15T09:00:00.000000000', '2012-08-16T09:00:00.000000000',\n '2012-08-17T09:00:00.000000000', '2012-08-18T09:00:00.000000000',\n '2012-08-19T09:00:00.000000000', '2012-08-20T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :nonearray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :nonearray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Data variables: (4)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :AVHRR18_G-NAVO, AVHRR19_G-NAVO, AVHRR_METOP_A-EUMETSAT, MODIS_A-JPL, MODIS_T-JPL, WSAT-REMSS, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :none\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_values :[ 1 2 5 9 13]flag_meanings :1=open-sea, 2=land, 5=open-lake, 9=open-sea with ice in the grid, 13=open-lake with ice in the gridcomment :mask can be used to further filter the data.source :GMT \"grdlandmask\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea ice area fractionunits :fraction (between 0 and 1)valid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice data interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2012-05-21 09:00:00', '2012-05-22 09:00:00',\n '2012-05-23 09:00:00', '2012-05-24 09:00:00',\n '2012-05-25 09:00:00', '2012-05-26 09:00:00',\n '2012-05-27 09:00:00', '2012-05-28 09:00:00',\n '2012-05-29 09:00:00', '2012-05-30 09:00:00',\n '2012-05-31 09:00:00', '2012-06-01 09:00:00',\n '2012-06-02 09:00:00', '2012-06-03 09:00:00',\n '2012-06-04 09:00:00', '2012-06-05 09:00:00',\n '2012-06-06 09:00:00', '2012-06-07 09:00:00',\n '2012-06-08 09:00:00', '2012-06-09 09:00:00',\n '2012-06-10 09:00:00', '2012-06-11 09:00:00',\n '2012-06-12 09:00:00', '2012-06-13 09:00:00',\n '2012-06-14 09:00:00', '2012-06-15 09:00:00',\n '2012-06-16 09:00:00', '2012-06-17 09:00:00',\n '2012-06-18 09:00:00', '2012-06-19 09:00:00',\n '2012-06-20 09:00:00', '2012-06-21 09:00:00',\n '2012-06-22 09:00:00', '2012-06-23 09:00:00',\n '2012-06-24 09:00:00', '2012-06-25 09:00:00',\n '2012-06-26 09:00:00', '2012-06-27 09:00:00',\n '2012-06-28 09:00:00', '2012-06-29 09:00:00',\n '2012-06-30 09:00:00', '2012-07-01 09:00:00',\n '2012-07-02 09:00:00', '2012-07-03 09:00:00',\n '2012-07-04 09:00:00', '2012-07-05 09:00:00',\n '2012-07-06 09:00:00', '2012-07-07 09:00:00',\n '2012-07-08 09:00:00', '2012-07-09 09:00:00',\n '2012-07-10 09:00:00', '2012-07-11 09:00:00',\n '2012-07-12 09:00:00', '2012-07-13 09:00:00',\n '2012-07-14 09:00:00', '2012-07-15 09:00:00',\n '2012-07-16 09:00:00', '2012-07-17 09:00:00',\n '2012-07-18 09:00:00', '2012-07-19 09:00:00',\n '2012-07-20 09:00:00', '2012-07-21 09:00:00',\n '2012-07-22 09:00:00', '2012-07-23 09:00:00',\n '2012-07-24 09:00:00', '2012-07-25 09:00:00',\n '2012-07-26 09:00:00', '2012-07-27 09:00:00',\n '2012-07-28 09:00:00', '2012-07-29 09:00:00',\n '2012-07-30 09:00:00', '2012-07-31 09:00:00',\n '2012-08-01 09:00:00', '2012-08-02 09:00:00',\n '2012-08-03 09:00:00', '2012-08-04 09:00:00',\n '2012-08-05 09:00:00', '2012-08-06 09:00:00',\n '2012-08-07 09:00:00', '2012-08-08 09:00:00',\n '2012-08-09 09:00:00', '2012-08-10 09:00:00',\n '2012-08-11 09:00:00', '2012-08-12 09:00:00',\n '2012-08-13 09:00:00', '2012-08-14 09:00:00',\n '2012-08-15 09:00:00', '2012-08-16 09:00:00',\n '2012-08-17 09:00:00', '2012-08-18 09:00:00',\n '2012-08-19 09:00:00', '2012-08-20 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (47)Conventions :CF-1.5title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \"Multi-scale Ultra-high Reolution\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20150711T060041Zstart_time :20120521T090000Zstop_time :20120521T090000Ztime_coverage_start :20120520T210000Ztime_coverage_end :20120521T210000Zfile_quality_level :1source :AVHRR18_G-NAVO, AVHRR19_G-NAVO, AVHRR_METOP_A-EUMETSAT, MODIS_A-JPL, MODIS_T-JPL, WSAT-REMSS, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Aqua, DMSP, NOAA-POES, Suomi-NPP, Terrasensor :AMSR-E, AVHRR, MODIS, SSM/I, VIIRS, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01 degreesgeospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01 degreesacknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\n# we want the sea surface temperature variable for this visualization\nds = ds_mur['analysed_sst']\n\n# Subset the dataset so that the program can run the code better\nds_subset = ds.sel(time=slice('2012-05-21T09:00:00', '2012-08-20T09:00:00'))\nlat_range = slice(45.61181, 49.2315)\nlon_range = slice(-125.41992, -116.64844)\nds_subset = ds_subset.sel(lat=lat_range, lon=lon_range)\n\nTo plot the data, we will be looking at the mean temperature across the summer.\n\n# Calculate the mean across the time dimension\nmean_data = ds_subset.mean(dim='time')\n\n\n#plot the figure\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (282, 291)\n\nim = ax.imshow(mean_data.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data.lon.min(), mean_data.lon.max(), mean_data.lat.min(), mean_data.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature (Kelvin)')\nax.set_title('Mean Sea Surface Temperature Summer 2012') \nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s also look at the most recent summer we have data for (2022) in comparison.\n\nmur_results_2 = earthaccess.search_data(short_name = 'MUR-JPL-L4-GLOB-v4.1', temporal = ('2022-05-21', '2022-08-20'), bounding_box = ('-125.41992','45.61181','-116.64844','49.2315'))\n\nGranules found: 92\n\n\n\nds_mur_2 = xr.open_mfdataset(earthaccess.open(mur_results_2), engine = 'h5netcdf')\nds_mur_2\n\n Opening 92 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 92, lat: 17999, lon: 36000)\nCoordinates:\n * time (time) datetime64[ns] 2022-05-21T09:00:00 ... 2022-08-2...\n * lat (lat) float32 -89.99 -89.98 -89.97 ... 89.97 89.98 89.99\n * lon (lon) float32 -180.0 -180.0 -180.0 ... 180.0 180.0 180.0\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n mask (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sea_ice_fraction (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n dt_1km_data (time, lat, lon) timedelta64[ns] dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\n sst_anomaly (time, lat, lon) float32 dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>\nAttributes: (12/47)\n Conventions: CF-1.7\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n project: NASA Making Earth Science Data Records for Us...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: gridxarray.DatasetDimensions:time: 92lat: 17999lon: 36000Coordinates: (3)time(time)datetime64[ns]2022-05-21T09:00:00 ... 2022-08-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-05-21T09:00:00.000000000', '2022-05-22T09:00:00.000000000',\n '2022-05-23T09:00:00.000000000', '2022-05-24T09:00:00.000000000',\n '2022-05-25T09:00:00.000000000', '2022-05-26T09:00:00.000000000',\n '2022-05-27T09:00:00.000000000', '2022-05-28T09:00:00.000000000',\n '2022-05-29T09:00:00.000000000', '2022-05-30T09:00:00.000000000',\n '2022-05-31T09:00:00.000000000', '2022-06-01T09:00:00.000000000',\n '2022-06-02T09:00:00.000000000', '2022-06-03T09:00:00.000000000',\n '2022-06-04T09:00:00.000000000', '2022-06-05T09:00:00.000000000',\n '2022-06-06T09:00:00.000000000', '2022-06-07T09:00:00.000000000',\n '2022-06-08T09:00:00.000000000', '2022-06-09T09:00:00.000000000',\n '2022-06-10T09:00:00.000000000', '2022-06-11T09:00:00.000000000',\n '2022-06-12T09:00:00.000000000', '2022-06-13T09:00:00.000000000',\n '2022-06-14T09:00:00.000000000', '2022-06-15T09:00:00.000000000',\n '2022-06-16T09:00:00.000000000', '2022-06-17T09:00:00.000000000',\n '2022-06-18T09:00:00.000000000', '2022-06-19T09:00:00.000000000',\n '2022-06-20T09:00:00.000000000', '2022-06-21T09:00:00.000000000',\n '2022-06-22T09:00:00.000000000', '2022-06-23T09:00:00.000000000',\n '2022-06-24T09:00:00.000000000', '2022-06-25T09:00:00.000000000',\n '2022-06-26T09:00:00.000000000', '2022-06-27T09:00:00.000000000',\n '2022-06-28T09:00:00.000000000', '2022-06-29T09:00:00.000000000',\n '2022-06-30T09:00:00.000000000', '2022-07-01T09:00:00.000000000',\n '2022-07-02T09:00:00.000000000', '2022-07-03T09:00:00.000000000',\n '2022-07-04T09:00:00.000000000', '2022-07-05T09:00:00.000000000',\n '2022-07-06T09:00:00.000000000', '2022-07-07T09:00:00.000000000',\n '2022-07-08T09:00:00.000000000', '2022-07-09T09:00:00.000000000',\n '2022-07-10T09:00:00.000000000', '2022-07-11T09:00:00.000000000',\n '2022-07-12T09:00:00.000000000', '2022-07-13T09:00:00.000000000',\n '2022-07-14T09:00:00.000000000', '2022-07-15T09:00:00.000000000',\n '2022-07-16T09:00:00.000000000', '2022-07-17T09:00:00.000000000',\n '2022-07-18T09:00:00.000000000', '2022-07-19T09:00:00.000000000',\n '2022-07-20T09:00:00.000000000', '2022-07-21T09:00:00.000000000',\n '2022-07-22T09:00:00.000000000', '2022-07-23T09:00:00.000000000',\n '2022-07-24T09:00:00.000000000', '2022-07-25T09:00:00.000000000',\n '2022-07-26T09:00:00.000000000', '2022-07-27T09:00:00.000000000',\n '2022-07-28T09:00:00.000000000', '2022-07-29T09:00:00.000000000',\n '2022-07-30T09:00:00.000000000', '2022-07-31T09:00:00.000000000',\n '2022-08-01T09:00:00.000000000', '2022-08-02T09:00:00.000000000',\n '2022-08-03T09:00:00.000000000', '2022-08-04T09:00:00.000000000',\n '2022-08-05T09:00:00.000000000', '2022-08-06T09:00:00.000000000',\n '2022-08-07T09:00:00.000000000', '2022-08-08T09:00:00.000000000',\n '2022-08-09T09:00:00.000000000', '2022-08-10T09:00:00.000000000',\n '2022-08-11T09:00:00.000000000', '2022-08-12T09:00:00.000000000',\n '2022-08-13T09:00:00.000000000', '2022-08-14T09:00:00.000000000',\n '2022-08-15T09:00:00.000000000', '2022-08-16T09:00:00.000000000',\n '2022-08-17T09:00:00.000000000', '2022-08-18T09:00:00.000000000',\n '2022-08-19T09:00:00.000000000', '2022-08-20T09:00:00.000000000'],\n dtype='datetime64[ns]')lat(lat)float32-89.99 -89.98 ... 89.98 89.99long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.99, -89.98, -89.97, ..., 89.97, 89.98, 89.99], dtype=float32)lon(lon)float32-180.0 -180.0 ... 180.0 180.0long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.99, -179.98, -179.97, ..., 179.98, 179.99, 180. ],\n dtype=float32)Data variables: (6)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \"analysed_sst\"\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nmask(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea/land field composite maskvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_meanings :open_sea land open_lake open_sea_with_ice_in_the_grid open_lake_with_ice_in_the_gridcomment :mask can be used to further filter the data.source :GMT \"grdlandmask\", ice flag from sea_ice_fraction data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsea_ice_fraction(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :sea ice area fractionstandard_name :sea_ice_area_fractionvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\ndt_1km_data(time, lat, lon)timedelta64[ns]dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :time to most recent 1km datavalid_min :-127valid_max :127source :MODIS and VIIRS pixels ingested by MURcomment :The grid value is hours between the analysis time and the most recent MODIS or VIIRS 1km L2P datum within 0.01 degrees from the grid point. \"Fill value\" indicates absence of such 1km data at the grid point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n444.15 GiB\n4.83 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\ntimedelta64[ns] numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nsst_anomaly(time, lat, lon)float32dask.array<chunksize=(1, 17999, 36000), meta=np.ndarray>long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n222.07 GiB\n2.41 GiB\n\n\nShape\n(92, 17999, 36000)\n(1, 17999, 36000)\n\n\nDask graph\n92 chunks in 185 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 36000 17999 92\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2022-05-21 09:00:00', '2022-05-22 09:00:00',\n '2022-05-23 09:00:00', '2022-05-24 09:00:00',\n '2022-05-25 09:00:00', '2022-05-26 09:00:00',\n '2022-05-27 09:00:00', '2022-05-28 09:00:00',\n '2022-05-29 09:00:00', '2022-05-30 09:00:00',\n '2022-05-31 09:00:00', '2022-06-01 09:00:00',\n '2022-06-02 09:00:00', '2022-06-03 09:00:00',\n '2022-06-04 09:00:00', '2022-06-05 09:00:00',\n '2022-06-06 09:00:00', '2022-06-07 09:00:00',\n '2022-06-08 09:00:00', '2022-06-09 09:00:00',\n '2022-06-10 09:00:00', '2022-06-11 09:00:00',\n '2022-06-12 09:00:00', '2022-06-13 09:00:00',\n '2022-06-14 09:00:00', '2022-06-15 09:00:00',\n '2022-06-16 09:00:00', '2022-06-17 09:00:00',\n '2022-06-18 09:00:00', '2022-06-19 09:00:00',\n '2022-06-20 09:00:00', '2022-06-21 09:00:00',\n '2022-06-22 09:00:00', '2022-06-23 09:00:00',\n '2022-06-24 09:00:00', '2022-06-25 09:00:00',\n '2022-06-26 09:00:00', '2022-06-27 09:00:00',\n '2022-06-28 09:00:00', '2022-06-29 09:00:00',\n '2022-06-30 09:00:00', '2022-07-01 09:00:00',\n '2022-07-02 09:00:00', '2022-07-03 09:00:00',\n '2022-07-04 09:00:00', '2022-07-05 09:00:00',\n '2022-07-06 09:00:00', '2022-07-07 09:00:00',\n '2022-07-08 09:00:00', '2022-07-09 09:00:00',\n '2022-07-10 09:00:00', '2022-07-11 09:00:00',\n '2022-07-12 09:00:00', '2022-07-13 09:00:00',\n '2022-07-14 09:00:00', '2022-07-15 09:00:00',\n '2022-07-16 09:00:00', '2022-07-17 09:00:00',\n '2022-07-18 09:00:00', '2022-07-19 09:00:00',\n '2022-07-20 09:00:00', '2022-07-21 09:00:00',\n '2022-07-22 09:00:00', '2022-07-23 09:00:00',\n '2022-07-24 09:00:00', '2022-07-25 09:00:00',\n '2022-07-26 09:00:00', '2022-07-27 09:00:00',\n '2022-07-28 09:00:00', '2022-07-29 09:00:00',\n '2022-07-30 09:00:00', '2022-07-31 09:00:00',\n '2022-08-01 09:00:00', '2022-08-02 09:00:00',\n '2022-08-03 09:00:00', '2022-08-04 09:00:00',\n '2022-08-05 09:00:00', '2022-08-06 09:00:00',\n '2022-08-07 09:00:00', '2022-08-08 09:00:00',\n '2022-08-09 09:00:00', '2022-08-10 09:00:00',\n '2022-08-11 09:00:00', '2022-08-12 09:00:00',\n '2022-08-13 09:00:00', '2022-08-14 09:00:00',\n '2022-08-15 09:00:00', '2022-08-16 09:00:00',\n '2022-08-17 09:00:00', '2022-08-18 09:00:00',\n '2022-08-19 09:00:00', '2022-08-20 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))latPandasIndexPandasIndex(Index([-89.98999786376953, -89.9800033569336, -89.97000122070312,\n -89.95999908447266, -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531, -89.91000366210938,\n -89.9000015258789,\n ...\n 89.9000015258789, 89.91000366210938, 89.91999816894531,\n 89.93000030517578, 89.94000244140625, 89.94999694824219,\n 89.95999908447266, 89.97000122070312, 89.9800033569336,\n 89.98999786376953],\n dtype='float32', name='lat', length=17999))lonPandasIndexPandasIndex(Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n 179.91000366210938, 179.9199981689453, 179.92999267578125,\n 179.94000244140625, 179.9499969482422, 179.9600067138672,\n 179.97000122070312, 179.97999572753906, 179.99000549316406,\n 180.0],\n dtype='float32', name='lon', length=36000))Attributes: (47)Conventions :CF-1.7title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.comment :MUR = \"Multi-scale Ultra-high Resolution\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20220530T072023Zstart_time :20220521T090000Zstop_time :20220521T090000Ztime_coverage_start :20220520T210000Ztime_coverage_end :20220521T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-B, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :grid\n\n\n\nds_2 = ds_mur_2['analysed_sst']\n\nds_subset_2 = ds_2.sel(time=slice('2022-05-21T09:00:00', '2022-08-20T09:00:00'))\nds_subset_2 = ds_subset_2.sel(lat=lat_range, lon=lon_range)\n\n\nmean_data_2 = ds_subset_2.mean(dim='time')\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\ncolorbar_range = (282, 291)\n\nim = ax.imshow(mean_data_2.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data_2.lon.min(), mean_data_2.lon.max(), mean_data_2.lat.min(), mean_data_2.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature (Kelvin)') \nax.set_title('Mean Sea Surface Temperature Summer 2022')\nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s plot the difference between these two summers.\n\n# Calculate the difference between the two mean datasets\ndata_diff = mean_data_2 - mean_data\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (-3, 3)\n\nim = ax.imshow(data_diff.values, cmap='coolwarm', origin='lower', transform=ccrs.PlateCarree(),\n extent=[mean_data.lon.min(), mean_data.lon.max(), mean_data.lat.min(), mean_data.lat.max()],\n vmin=colorbar_range[0], vmax=colorbar_range[1]) \n\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature Difference (Kelvin)')\nax.set_title('Sea Surface Temperature Difference (Avg of Summer 2022 - Avg of Summer 2012)')\n\nax.coastlines()\nax.gridlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nLet’s zoom in on Lake Chelan in central Washington to look at the difference between the averages of the two summers.\n\n#subset the data for Lake Chelan in 2012\nds_subset_3 = ds.sel(time=slice('2012-05-21T09:00:00', '2012-08-20T09:00:00'))\nlat_range_2 = slice(47.7926, 48.44274)\nlon_range_2 = slice(-120.99902, -119.77734)\nds_subset_3 = ds_subset_3.sel(lat=lat_range_2, lon=lon_range_2)\n\nmean_data_3 = ds_subset_3.mean(dim='time')\n\n\n#subset the data for Lake Chelan in 2022\nds_subset_4 = ds_2.sel(time=slice('2022-05-21T09:00:00', '2022-08-20T09:00:00'))\nds_subset_4 = ds_subset_4.sel(lat=lat_range_2, lon=lon_range_2)\n\nmean_data_4 = ds_subset_4.mean(dim='time')\n\n\n# Calculate the difference between the two mean datasets\ndata_diff_2 = mean_data_4 - mean_data_3\n\n\nfig = plt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\ncolorbar_range = (2, 3.5)\n\nim = ax.imshow(data_diff_2.values, cmap='YlOrRd', origin='lower', transform=ccrs.PlateCarree(),\n extent=[data_diff_2.lon.min(), data_diff_2.lon.max(), data_diff_2.lat.min(), data_diff_2.lat.max()])\n\nim.set_clim(vmin=colorbar_range[0], vmax=colorbar_range[1])\ncbar = plt.colorbar(im, ax=ax, orientation='horizontal', pad=0.05, shrink=0.7)\ncbar.set_label('Sea Surface Temperature Difference (Kelvin)')\nax.set_title('Lake Chelan Sea Surface Temperature Difference 2012 vs 2022')\n\nax.gridlines()\n\nplt.show()\n\nPlease note that the GHRSST dataset is optimized for ocean sea surface temperature, so caution should be exercised when visualizing inland water bodies.", + "objectID": "notebooks/datasets/enso_MUR_tutorial_final.html#plot-a-time-series-of-mur-ssta", + "href": "notebooks/datasets/enso_MUR_tutorial_final.html#plot-a-time-series-of-mur-ssta", + "title": "Mapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions", + "section": "Plot a Time Series of MUR SSTA", + "text": "Plot a Time Series of MUR SSTA\n\n# Open data from December to April\nds2 = xr.open_mfdataset(dir + '20*.nc*', combine='by_coords')\n\n# Grab the time values\ntimes = ds2.time.values\n\n# Select the El Niño 1+2 region\nsubset_ds = ds2.sel(lat=slice(-10, 0)).sel(lon=slice(-90, -80))\n\n# Select ssta for El Niño 1+2 region\ndata = subset_ds.sst_anomaly.values\ndata_means = [np.nanmean(step) for step in data]\n\n# Select the El Niño 3 region\nsubset_ds2 = ds2.sel(lat=slice(-5, 5)).sel(lon=slice(-150, -90)) \ndata2 = subset_ds2.sst_anomaly.values\ndata_means2 = [np.nanmean(step) for step in data2]\n\n# Plot the figure with labels\nfig = plt.figure(figsize=(20,6))\nplt.title('MUR SST Anomaly in El Niño 1+2 and El Niño 3 Regions', fontsize=20)\nplt.ylabel('Anomaly in Degrees C', fontsize=16)\nplt.tick_params(labelsize=12) \nplt.grid(True)\n\nplt.plot(times, data_means, color='black', linewidth=4, label='Niño 1+2')\nplt.plot(times, data_means2[:len(times)], color='brown', linewidth=4, linestyle='--', label='Niño 3')\n\nplt.ylim(-4, 4)\n\n# Add legend with labels\nplt.legend(fontsize=16) \n\n# Increase label size\nplt.xticks(fontsize=16)\nplt.yticks(fontsize=16)\n\nplt.show()", "crumbs": [ "Tutorials", "Dataset Specific", "GHRSST", - "In-Cloud Access" + "Use Case Demo" ] }, { @@ -4705,6 +4908,21 @@ "Plotting ALL river discharge algorithms" ] }, + { + "objectID": "notebooks/datasets/SWOTHR_localmachine.html#accessing-and-visualizing-swot-datasets", + "href": "notebooks/datasets/SWOTHR_localmachine.html#accessing-and-visualizing-swot-datasets", + "title": "SWOT Hydrology Dataset Exploration on a local machine", + "section": "Accessing and Visualizing SWOT Datasets", + "text": "Accessing and Visualizing SWOT Datasets\n\nRequirement:\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\nLearning Objectives:\n\nAccess SWOT HR data products (archived in NASA Earthdata Cloud) by downloading to local machine\nVisualize accessed data for a quick check\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nRiver Vector Shapefile - SWOT_L2_HR_RIVERSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LAKESP_2.0\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\nSingle Look Complex Data product - SWOT_L1B_HR_SLC_2.0\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Feb 2024) || Other Contributors: Zoe Walschots (PO.DAAC Summer Intern 2023), Catalina Taglialatela (NASA PO.DAAC), Luis Lopez (NASA NSIDC DAAC), Brent Williams (NASA JPL)\nLast updated: 9 July 2024\n\n\n\nLibraries Needed\n\nimport glob\nimport h5netcdf\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport contextily as cx\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport zipfile\nimport earthaccess\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nSingle File Access\n\n1. River Vector Shapefiles\nThe https access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to manually search in a GUI interface.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for the data of interest\n\n#Retrieves granule from the day we want, in this case by passing to `earthdata.search_data` function the data collection shortname, temporal bounds, and filter by wildcards\nriver_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*Reach*_287_NA*') # here we filter by Reach files (not node), pass=287, continent code=NA\n\nGranules found: 8\n\n\n\n\nDowload, unzip, read the data\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([river_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_RiverSP_Reach_010_287_NA_20240204T060400_20240204T060409_PIC0_01.zip']\n\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we must first extract the data to open it. First, we’ll programmatically get the filename we just downloaded, and then extract all data to the data_downloads folder.\n\nfilename = earthaccess.results.DataGranule.data_links(river_results[0], access='external')\nfilename = filename[0].split(\"/\")[-1]\nfilename\n\n'SWOT_L2_HR_RiverSP_Reach_010_287_NA_20240204T060400_20240204T060409_PIC0_01.zip'\n\n\n\nwith zipfile.ZipFile(f'data_downloads/{filename}', 'r') as zip_ref:\n zip_ref.extractall('data_downloads')\n\nOpen the shapefile using geopandas\n\nfilename_shp = filename.replace('.zip','.shp')\n\n\nSWOT_HR_shp1 = gpd.read_file(f'data_downloads/{filename_shp}') \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n71224800093\n-1.000000e+12\n-1.000000e+12\nno_data\n48.724265\n-92.406254\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n232341.227\n90\n47778.423\n18013.132474\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.51093 48.70847, -92.51052 48.7...\n\n\n1\n71224800101\n-1.000000e+12\n-1.000000e+12\nno_data\n48.739159\n-92.290054\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n767.700\n6\n48958.712\n1180.288364\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.29723 48.73905, -92.29682 48.7...\n\n\n2\n71224800114\n-1.000000e+12\n-1.000000e+12\nno_data\n48.743344\n-92.283320\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n2911.208\n3\n49549.648\n590.936467\n-1.000000e+12\n23000\n2\n1\n0\nLINESTRING (-92.28569 48.74125, -92.28495 48.7...\n\n\n3\n71224800123\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:10Z\n48.751442\n-92.242669\nno_data\n3.585147e+02\n2.006910e+00\n2.004890e+00\n...\n57688.777\n31\n55684.066\n6134.417666\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-92.28196 48.74559, -92.28163 48.7...\n\n\n4\n71224800133\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:10Z\n48.762334\n-92.189341\nno_data\n3.579681e+02\n1.451600e-01\n1.138900e-01\n...\n20821.463\n13\n58222.719\n2538.653439\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-92.20553 48.75837, -92.20512 48.7...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n1058\n77127000061\n7.603418e+08\n7.603419e+08\n2024-02-04T06:04:09Z\n18.050684\n-98.761645\nno_data\n6.529558e+02\n1.000896e+02\n1.000896e+02\n...\n784.041\n67\n667747.660\n13493.202300\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.81280 18.06539, -98.81280 18.0...\n\n\n1059\n77127000071\n-1.000000e+12\n-1.000000e+12\nno_data\n17.981704\n-98.686712\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n824.145\n97\n687123.984\n19376.324005\n-1.000000e+12\n0\n3\n1\n0\nLINESTRING (-98.71239 18.03246, -98.71239 18.0...\n\n\n1060\n77127000131\n7.603418e+08\n7.603419e+08\n2024-02-04T06:04:09Z\n18.102586\n-98.771552\nno_data\n6.576003e+02\n1.240586e+02\n1.240586e+02\n...\n281.012\n77\n683164.834\n15417.173639\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.81280 18.06539, -98.81280 18.0...\n\n\n1061\n77127000141\n-1.000000e+12\n-1.000000e+12\nno_data\n18.094132\n-98.694466\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n414.760\n54\n693896.634\n10731.799933\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.71770 18.11625, -98.71764 18.1...\n\n\n1062\n77127000151\n-1.000000e+12\n-1.000000e+12\nno_data\n18.097046\n-98.657280\nno_data\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n436.883\n54\n704624.208\n10727.574606\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-98.66628 18.07224, -98.66611 18.0...\n\n\n\n\n1063 rows × 127 columns\n\n\n\n\n\nQuickly plot the SWOT river data\n\n# Simple plot\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp1.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=SWOT_HR_shp1.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\n\n# Another way to plot geopandas dataframes is with `explore`, which also plots a basemap\n#SWOT_HR_shp1.explore()\n\n\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\nFor additional tips on spatial searching of SWOT HR L2 data, see also PO.DAAC Cookbook - SWOT Chapter tips section.\n\n\nSearch for data of interest\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*Prior*_287_NA*') # here we filter by files with 'Prior' in the name (This collection has three options: Obs, Unassigned, and Prior), pass 287 and continent code=NA\n\nGranules found: 8\n\n\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([lake_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.07 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.zip']\n\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we must first extract the data to open it. First, we’ll programmatically get the filename we just downloaded, and then extract all data to the SWOT_downloads folder.\n\nfilename2 = earthaccess.results.DataGranule.data_links(lake_results[0], access='external')\nfilename2 = filename2[0].split(\"/\")[-1]\nfilename2\n\n'SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.zip'\n\n\n\nwith zipfile.ZipFile(f'data_downloads/{filename2}', 'r') as zip_ref:\n zip_ref.extractall('data_downloads')\n\nOpen the shapefile using geopandas\n\nfilename_shp2 = filename2.replace('.zip','.shp')\nfilename_shp2\n\n'SWOT_L2_HR_LakeSP_Prior_010_287_NA_20240204T060400_20240204T061541_PIC0_01.shp'\n\n\n\nSWOT_HR_shp2 = gpd.read_file(f'data_downloads/{filename_shp2}') \n\n#view the attribute table\nSWOT_HR_shp2\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n0\n7120822822\nno_data\n712239R999998\n99\n1\n7.603424e+08\n7.603424e+08\n2024-02-04T06:13:08Z\n5.281870e+02\n1.500000e-02\n...\nno_data\n-99999999\n-91.557528\n47.616292\n-1.000000e+12\n1.038600\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-91.56583 47.61200, -91.56589 ...\n\n\n1\n7120822902\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-91.623241\n47.756499\n-1.000000e+12\n0.113400\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n2\n7120822932\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nTONY LAKE\n-99999999\n-91.635242\n47.726123\n-1.000000e+12\n0.017100\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n3\n7120822982\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-91.665522\n47.705366\n-1.000000e+12\n0.026100\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n4\n7120823182\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nHEART LAKE\n-99999999\n-91.651807\n47.769148\n-1.000000e+12\n0.124200\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n65495\n7130133552\nno_data\n713244L999972;713244L000002\n73;2\n2\n7.603424e+08\n7.603424e+08\n2024-02-04T06:14:01Z\n3.926960e+02\n5.900000e-02\n...\nno_data\n-99999999\n-90.889026\n50.669027\n-1.000000e+12\n0.695690\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-90.89210 50.67709, -90.89185 50.677...\n\n\n65496\n7130141612\nno_data\n713245L999974;713245L000001\n31;5\n2\n7.603424e+08\n7.603425e+08\n2024-02-04T06:14:08Z\n3.741850e+02\n8.200000e-02\n...\nLAKE ST JOSEPH;ST JOSEPH\n-99999999\n-90.750682\n51.061383\n-1.000000e+12\n0.256500\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-90.75251 51.06305, -90.75228 ...\n\n\n65497\n7420206383\n74226000013;74227100043;74227100013;7422710006...\n742214L000175;742214L999934;742214L000500;7422...\n64;23;0;0\n4\n7.603421e+08\n7.603422e+08\n2024-02-04T06:09:01Z\n1.875740e+02\n1.000000e-03\n...\nLAKE TEXOMA\n1135\n-96.688976\n33.901142\n-1.000000e+12\n257.028517\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-96.70899 33.82534, -96.70885 ...\n\n\n65498\n7420280413\n74246000423;74246000413;74246000404\n742218L999996;742218L001654;742219L999885\n4;0;0\n3\n7.603422e+08\n7.603422e+08\n2024-02-04T06:09:48Z\n1.941800e+02\n2.100000e-02\n...\nOOLAGAHL LAKE;OOLOGAH LAKE\n1032\n-95.593848\n36.550604\n-1.000000e+12\n123.796498\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-95.67217 36.43803, -95.67157 ...\n\n\n65499\n7710056183\n77125000273;77125000263;77125000283;7712500030...\n771186L999995;771186L000013;771186L999993\n12;1;0\n3\n7.603419e+08\n7.603419e+08\n2024-02-04T06:04:22Z\n4.586500e+02\n3.400000e-02\n...\nPRESA EL CARACOL\n1384\n-99.861530\n17.975030\n-1.000000e+12\n35.410155\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-99.75753 18.02115, -99.75739 ...\n\n\n\n\n65500 rows × 51 columns\n\n\n\n\n\nQuickly plot the SWOT lakes data\n\nfig, ax = plt.subplots(figsize=(7,5))\nSWOT_HR_shp2.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=SWOT_HR_shp2.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\nAccessing the remaining files is different than the shp files above. We do not need to extract the shapefiles from a zip file because the following SWOT HR collections are stored in netCDF files in the cloud. For the rest of the products, we will open via xarray, not geopandas.\n\n\n3. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n temporal = ('2024-01-25 00:00:00', '2024-05-29 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 27\n\n\nLet’s download one data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([pixc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.37 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXC_*.nc\", group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 3959179, complex_depth: 2,\n num_pixc_lines: 3278)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(3959179, 2), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3278,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3278\n interferogram_size_range: 5718\n looks_to_efflooks: 1.550665505987333\n num_azimuth_looks: 7.0\n azimuth_offset: 6xarray.DatasetDimensions:points: 3959179complex_depth: 2num_pixc_lines: 3278Coordinates: (2)latitude(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(3959179, 2), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179, 2)\n(3959179, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 3959179\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.22 kB\n26.22 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3278,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.11 kB\n13.11 kB\n\n\nShape\n(3278,)\n(3278,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3278 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3278interferogram_size_range :5718looks_to_efflooks :1.550665505987333num_azimuth_looks :7.0azimuth_offset :6\n\n\n\n\nFor plotting PIXC using classification and quality flags\n\n# mask to get good water pixels\nmask = np.where(np.logical_and(ds_PIXC.classification > 2, ds_PIXC.geolocation_qual <28800)) \n#For more conservative filtering, use ds_PIXC.geolocation_qual <4 to also remove suspect values \n\nplt.scatter(x=ds_PIXC.longitude[mask], y=ds_PIXC.latitude[mask], c=ds_PIXC.height[mask])\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\n\nSearch for data of interest\n\n#Let's plot the same pass and tile as the above\npixcvec_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXCVEC_2.0', \n granule_name = '*010_106_086R*') #The same cycle, pass and tile as previously downloaded\n\nGranules found: 1\n\n\nLet’s download the first data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([pixcvec_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.29 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXCVec_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data using xarray\nFirst, we’ll programmatically get the filename we just downloaded and then view the file via xarray.\n\nds_PIXCVEC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXCVec_*.nc\", decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 3959179, nchar_reach_id: 11,\n nchar_node_id: 14, nchar_lake_id: 10,\n nchar_obs_id: 13)\nDimensions without coordinates: points, nchar_reach_id, nchar_node_id,\n nchar_lake_id, nchar_obs_id\nData variables:\n azimuth_index (points) int32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n range_index (points) int32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n latitude_vectorproc (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n longitude_vectorproc (points) float64 dask.array<chunksize=(3959179,), meta=np.ndarray>\n height_vectorproc (points) float32 dask.array<chunksize=(3959179,), meta=np.ndarray>\n reach_id (points, nchar_reach_id) |S1 dask.array<chunksize=(3959179, 11), meta=np.ndarray>\n node_id (points, nchar_node_id) |S1 dask.array<chunksize=(3959179, 14), meta=np.ndarray>\n lake_id (points, nchar_lake_id) |S1 dask.array<chunksize=(3959179, 10), meta=np.ndarray>\n obs_id (points, nchar_obs_id) |S1 dask.array<chunksize=(3959179, 13), meta=np.ndarray>\n ice_clim_f (points) int8 dask.array<chunksize=(3959179,), meta=np.ndarray>\n ice_dyn_f (points) int8 dask.array<chunksize=(3959179,), meta=np.ndarray>\nAttributes: (12/45)\n Conventions: CF-1.7\n title: Level 2 KaRIn high rate pixel cloud vect...\n short_name: L2_HR_PIXCVec\n institution: CNES\n source: Level 1B KaRIn High Rate Single Look Com...\n history: 2024-02-02T11:20:25.557946Z: Creation\n ... ...\n xref_prior_river_db_file: \n xref_prior_lake_db_file: SWOT_LakeDatabase_Nom_106_20000101T00000...\n xref_reforbittrack_files: SWOT_RefOrbitTrackTileBoundary_Nom_20000...\n xref_param_l2_hr_laketile_file: SWOT_Param_L2_HR_LakeTile_20000101T00000...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805xarray.DatasetDimensions:points: 3959179nchar_reach_id: 11nchar_node_id: 14nchar_lake_id: 10nchar_obs_id: 13Coordinates: (0)Data variables: (11)azimuth_index(points)int32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nrange_index(points)int32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :2147483647long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999coordinates :longitude_vectorproc latitude_vectorproccomment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlatitude_vectorproc(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation latitudestandard_name :latitudeunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Height-constrained geodetic latitude of the pixel. Units are in degrees north of the equator.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nlongitude_vectorproc(points)float64dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.969209968386869e+36long_name :height-constrained geolocation longitudestandard_name :longitudeunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Height-constrained geodetic longitude of the pixel. Positive=degrees east of the Greenwich meridian. Negative=degrees west of the Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n31.67 MB\n31.67 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nheight_vectorproc(points)float32dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :9.96921e+36long_name :height above reference ellipsoidunits :mvalid_min :-1500.0valid_max :15000.0coordinates :longitude_vectorproc latitude_vectorproccomment :Height-constrained height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n15.84 MB\n15.84 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nreach_id(points, nchar_reach_id)|S1dask.array<chunksize=(3959179, 11), meta=np.ndarray>long_name :identifier of the associated prior river reachcoordinates :longitude_vectorproc latitude_vectorproccomment :Unique reach identifier from the prior river database. The format of the identifier is CBBBBBRRRRT, where C=continent, B=basin, R=reach, T=type.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n43.55 MB\n43.55 MB\n\n\nShape\n(3959179, 11)\n(3959179, 11)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 11 3959179\n\n\n\n\nnode_id(points, nchar_node_id)|S1dask.array<chunksize=(3959179, 14), meta=np.ndarray>long_name :identifier of the associated prior river nodecoordinates :longitude_vectorproc latitude_vectorproccomment :Unique node identifier from the prior river database. The format of the identifier is CBBBBBRRRRNNNT, where C=continent, B=basin, R=reach, N=node, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n55.43 MB\n55.43 MB\n\n\nShape\n(3959179, 14)\n(3959179, 14)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 14 3959179\n\n\n\n\nlake_id(points, nchar_lake_id)|S1dask.array<chunksize=(3959179, 10), meta=np.ndarray>long_name :identifier of the associated prior lakecoordinates :longitude_vectorproc latitude_vectorproccomment :Identifier of the lake from the lake prior database) associated to the pixel. The format of the identifier is CBBNNNNNNT, where C=continent, B=basin, N=counter within the basin, T=type of water body.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.59 MB\n39.59 MB\n\n\nShape\n(3959179, 10)\n(3959179, 10)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 10 3959179\n\n\n\n\nobs_id(points, nchar_obs_id)|S1dask.array<chunksize=(3959179, 13), meta=np.ndarray>long_name :identifier of the observed featurecoordinates :longitude_vectorproc latitude_vectorproccomment :Tile-specific identifier of the observed feature associated to the pixel. The format of the identifier is CBBTTTSNNNNNN, where C=continent, B=basin, T=tile number, S=swath side, N=lake counter within the PIXC tile.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n51.47 MB\n51.47 MB\n\n\nShape\n(3959179, 13)\n(3959179, 13)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\n|S1\nnumpy.ndarray\n\n\n\n\n 13 3959179\n\n\n\n\nice_clim_f(points)int8dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :127long_name :climatological ice cover flagflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the surface is not ice covered, may or may not be partially or fully ice covered, and fully ice covered, respectively. A value of 127 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.96 MB\n3.96 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint8\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nice_dyn_f(points)int8dask.array<chunksize=(3959179,), meta=np.ndarray>_FillValue :127long_name :dynamical ice cover flagflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]institution :University of North Carolinacoordinates :longitude_vectorproc latitude_vectorproccomment :Dynamic ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the surface is not ice covered, partially ice covered, and fully ice covered, respectively. A value of 255 indicates that this flag is not available.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.96 MB\n3.96 MB\n\n\nShape\n(3959179,)\n(3959179,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nint8\nnumpy.ndarray\n\n\n\n\n 3959179 1\n\n\n\n\nIndexes: (0)Attributes: (45)Conventions :CF-1.7title :Level 2 KaRIn high rate pixel cloud vector attribute productshort_name :L2_HR_PIXCVecinstitution :CNESsource :Level 1B KaRIn High Rate Single Look Complex Data Producthistory :2024-02-02T11:20:25.557946Z: Creationplatform :SWOTreferences :SWOT-DD-CDM-0565-CNES_SAS_Design_L2_HR_LakeSP - Revision A - 20220531reference_document :SWOT-TN-CDM-0677-CNES_Product_Description_L2_HR_PIXCVec - Revision A - 20220531product_version :V5.3.0crid :PIC0pge_name :PGE_L2_HR_LakeSPpge_version :V4.3.1contact :SWOT-contact@cnes.frcycle_number :10pass_number :106tile_number :86swath_side :Rtile_name :106_086Rcontinent_id :NAcontinent_code :7time_granule_start :2024-01-28T18:35:40.339553Ztime_granule_end :2024-01-28T18:35:51.432035Ztime_coverage_start :2024-01-28T18:35:40.910059Ztime_coverage_end :2024-01-28T18:35:50.843156Zgeospatial_lon_min :-107.22389946582723geospatial_lon_max :-106.3237849756706geospatial_lat_min :38.56189986918592geospatial_lat_max :39.32030445228022inner_first_longitude :-106.47726704132805inner_first_latitude :39.32030445228022inner_last_longitude :-106.3237849756706inner_last_latitude :38.69213417084364outer_first_longitude :-107.22389946582723outer_first_latitude :39.18417696382458outer_last_longitude :-107.0411942763215outer_last_latitude :38.56189986918592xref_l2_hr_pixc_file :SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.ncxref_l2_hr_pixcvecriver_file :SWOT_L2_HR_PIXCVecRiver_010_106_086R_20240128T183540_20240128T183551_PIC0_01.ncxref_prior_river_db_file :xref_prior_lake_db_file :SWOT_LakeDatabase_Nom_106_20000101T000000_20991231T235959_20231017T000000_v105.sqlitexref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_param_l2_hr_laketile_file :SWOT_Param_L2_HR_LakeTile_20000101T000000_20991231T235959_20230922T160000_v411.cfgellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805\n\n\n\n\nSimple plot\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals == 0] = np.nan\npixcvec_lonvals[pixcvec_lonvals == 0] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n\n\n\n\n\n\n\n\n\n5. Raster NetCDF\n\n\nSearch for data of interest\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', \n temporal = ('2024-01-25 00:00:00', '2024-07-15 23:59:59'), # can also specify by time\n granule_name = '*100m*', # here we filter by files with '100m' in the name (This collection has two resolution options: 100m & 250m)\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 83\n\n\nLet’s download one data file.\n\nearthaccess.download([raster_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.05 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_Raster_100m_UTM13S_N_x_x_x_010_106_043F_20240128T183530_20240128T183551_PIC0_01.nc']\n\n\n\n\nOpen data with xarray\nFirst, we’ll programmatically get the filename we just downloaded and then view the file via xarray.\n\nds_raster = xr.open_mfdataset(f'data_downloads/SWOT_L2_HR_Raster*', engine='h5netcdf')\nds_raster\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1520, y: 1519)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 4.488e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 4.426e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(1519, 1520), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-02T15:24:17Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1520y: 1519Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 4.488e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 448600., 448700., 448800.])y(y)float644.274e+06 4.274e+06 ... 4.426e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 4425600., 4425700., 4425800.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.47 MB\n18.47 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(1519, 1520), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.24 MB\n9.24 MB\n\n\nShape\n(1519, 1520)\n(1519, 1520)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1520 1519\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 447900.0, 448000.0, 448100.0, 448200.0, 448300.0, 448400.0,\n 448500.0, 448600.0, 448700.0, 448800.0],\n dtype='float64', name='x', length=1520))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 4424900.0, 4425000.0, 4425100.0, 4425200.0, 4425300.0, 4425400.0,\n 4425500.0, 4425600.0, 4425700.0, 4425800.0],\n dtype='float64', name='y', length=1519))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-02T15:24:17Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-01-28T18:35:30.338268Ztime_granule_end :2024-01-28T18:35:51.435533Ztime_coverage_start :2024-01-28T18:35:30.881182Ztime_coverage_end :2024-01-28T18:35:50.897419Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_106_084L_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_085L_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_086L_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_087L_20240128T183550_20240128T183601_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_084R_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_085R_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXC_010_106_087R_20240128T183550_20240128T183601_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_106_084L_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_085L_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_086L_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_087L_20240128T183550_20240128T183601_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_084R_20240128T183520_20240128T183531_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_085R_20240128T183530_20240128T183541_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_086R_20240128T183540_20240128T183551_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_106_087R_20240128T183550_20240128T183601_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :01\n\n\n\n\nQuick interactive plot with hvplot\nNote: this is not filtered by quality\n\nds_raster.wse.hvplot.image(y='y', x='x')\n\n\n\n\n\n \n\n\n\n\n\n\n6. SLC\n\n\nSearch for data collection and time of interest\n\nslc_results = earthaccess.search_data(short_name = 'SWOT_L1B_HR_SLC_2.0', \n #temporal = ('2024-01-01 00:00:00', '2024-01-30 23:59:59'), # can also specify by time\n bounding_box = (-106.62, 38.809, -106.54, 38.859)) # Lake Travis near Austin, TX\n\nGranules found: 291\n\n\nLet’s download one data file! earthaccess.download has a list as the input format, so we need to put brackets around the single file we pass.\n\nearthaccess.download([slc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 2.25 GB\n\n\nQUEUEING TASKS | : 100%|██████████| 1/1 [00:00<00:00, 113.65it/s]\nPROCESSING TASKS | : 100%|██████████| 1/1 [04:44<00:00, 284.14s/it]\nCOLLECTING RESULTS | : 100%|██████████| 1/1 [00:00<?, ?it/s]\n\n\n['data_downloads\\\\SWOT_L1B_HR_SLC_566_022_137L_20230629T015538_20230629T015549_PGC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe L1B_HR_SLC product file contains five NetCDF data group called the slc, xfactor, noise, tvp, and grdem groups. More info can be found in the product description document within the dataset table for each group.\n\nds_SLC = xr.open_mfdataset(\"data_downloads/SWOT_L1B_HR_SLC*.nc\", group = 'slc', engine='h5netcdf')\nds_SLC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset> Size: 2GB\nDimensions: (num_lines: 22804, num_pixels: 5622, complex_depth: 2)\nDimensions without coordinates: num_lines, num_pixels, complex_depth\nData variables:\n slc_plus_y (num_lines, num_pixels, complex_depth) float32 1GB dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>\n slc_minus_y (num_lines, num_pixels, complex_depth) float32 1GB dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>\n slc_qual (num_lines) float32 91kB dask.array<chunksize=(22804,), meta=np.ndarray>\nAttributes:\n description: Single look complex images for plus_y and minus_y channelsxarray.DatasetDimensions:num_lines: 22804num_pixels: 5622complex_depth: 2Coordinates: (0)Data variables: (3)slc_plus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>long_name :single look complex image for the plus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the plus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n9.99 MiB\n\n\nShape\n(22804, 5622, 2)\n(3258, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5622 22804\n\n\n\n\nslc_minus_y(num_lines, num_pixels, complex_depth)float32dask.array<chunksize=(3258, 804, 1), meta=np.ndarray>long_name :single look complex image for the minus_y channelunits :1valid_min :-1e+20valid_max :1e+20comment :SLC complex image for the minus_y channel (arbitrary scaling consistent with the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.96 GiB\n9.99 MiB\n\n\nShape\n(22804, 5622, 2)\n(3258, 804, 1)\n\n\nDask graph\n98 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 2 5622 22804\n\n\n\n\nslc_qual(num_lines)float32dask.array<chunksize=(22804,), meta=np.ndarray>long_name :SLC quality flagstandard_name :status_flagflag_meanings :tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 32 64 128]valid_min :0valid_max :231comment :Flag indicating conditions that may affect the quality of the SLC data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n89.08 kiB\n89.08 kiB\n\n\nShape\n(22804,)\n(22804,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 22804 1\n\n\n\n\nIndexes: (0)Attributes: (1)description :Single look complex images for plus_y and minus_y channels\n\n\n\n\nPlot SLC data\n\n# function to get interferogram from slc images\n\ndef interfere(slc):\n # convert to complex array\n slc_plus_y = slc.slc_plus_y[:,:,0] + 1j * slc.slc_plus_y[:,:,1]\n slc_minus_y = slc.slc_minus_y[:,:,0] + 1j * slc.slc_minus_y[:,:,1]\n # get interferogram quantities\n ifgram = slc_plus_y * np.conj(slc_minus_y)\n mag = np.abs(ifgram)\n phase = np.arctan2(np.imag(ifgram), np.real(ifgram))\n return ifgram, np.real(np.abs(slc_plus_y)), np.real(np.abs(slc_minus_y)), mag, phase\n\n\n# ignore the divide-by-zero warning in log10\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# make a plot of slc interferogram\nifgram, power_plus_y, power_minus_y, mag, phase = interfere(ds_SLC)\nplt.imshow(10*np.log10(np.abs(ifgram)), interpolation='none', cmap='gray', aspect='auto')\nplt.clim((0,90))\nplt.colorbar().set_label('interferogram magnitude (dB)')\nplt.imshow(phase, interpolation='none', cmap='hsv', alpha=0.5, aspect='auto')\nplt.colorbar().set_label('interferometric phase')\n\n\n\n\n\n\n\n\n\n# also plot just the power image\nplt.imshow(10*np.log10(power_plus_y), interpolation='none', cmap='gray', aspect='auto')\nplt.clim((0,45))\nplt.colorbar().set_label('interferometric power (plus_y channel)')", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "SWOT", + "Access & Visualization", + "SWOT Hydrology", + "Local" + ] + }, { "objectID": "notebooks/datasets/SWOT_PIXC_Area_localmachine.html#how-to-aggregate-pixc-data-to-estimate-water-body-areas", "href": "notebooks/datasets/SWOT_PIXC_Area_localmachine.html#how-to-aggregate-pixc-data-to-estimate-water-body-areas", @@ -4734,1604 +4952,1386 @@ ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#summary", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#summary", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Summary", - "text": "Summary\n\nVisualizing Discharge\nThe following notebook shows how to visualize discharge time series data on a map. The notebook takes the mean of the timeseries for a river reach’s discharge estimates and visualizes this mean discharge.\n\n\nGranule structure (background)\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\nYou can explore the SoS further in this notebook: https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html\n\n\nTable of Modules (Algorithms) and Discharge variables\nThe following lists the algorithms alongside their discharge variables and location in the SoS results file assuming that the SoS is an open file represented by the results variable.\n\n\n\n\n\n\n\n\nModule (Algorithm)\nDischarge Variable\nLocation in the SoS\n\n\n\n\nHiVDI\nQ\nresults[“hivdi”][“Q”]\n\n\nMetroMan\nallq\nresults[“metroman”][“allq”]\n\n\nMOMMA\nQ\nresults[“momma”][“Q”]\n\n\nneoBAM\nq1, q2, or q3\nresults[“neobam”][“q”][“q1”]\n\n\nSAD\nQa\nresults[“sad”][“Qa”]\n\n\nSIC4DVar\nQ_da\nresults[“sic4dvar”][“Q_da”]\n\n\nMOI HiVDI\nq\nresults[“moi”][“hivdi”][“q”]\n\n\nMOI MetroMan\nq\nresults[“moi”][“metroman”][“q”]\n\n\nMOI MOMMA\nq\nresults[“moi”][“momma”][“q”]\n\n\nMOI neoBAM\nq\nresults[“moi”][“qeobam”][“q”]\n\n\nMOI SAD\nq\nresults[“moi”][“sad”][“q”]\n\n\nMOI SIC4DVar\nq\nresults[“moi”][“sic4dvar”][“q”]", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] - }, - { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#requirements", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#requirements", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] - }, - { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#learning-objectives", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#learning-objectives", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nTo locate an algorithms discharge data.\nTake the mean of discharge over a reach.\nVisualize mean discharge on a map.", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] - }, - { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#import-packages", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#import-packages", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Import Packages", - "text": "Import Packages\n\nimport datetime\nimport pathlib\nimport warnings\n\nimport branca.colormap as cm\nimport earthaccess\nimport folium\nimport geopandas as gpd\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd\nimport shapely", + "objectID": "notebooks/datasets/SWOT_quality_flag_demo.html#use-earthaccess-to-search-swot-data", + "href": "notebooks/datasets/SWOT_quality_flag_demo.html#use-earthaccess-to-search-swot-data", + "title": "SWOT Quality Flag Demonstration", + "section": "Use earthaccess to search SWOT data", + "text": "Use earthaccess to search SWOT data\nHere we use the SSH shortname, SWOT_L2_LR_SSH_Expert_2.0\n\nssh_results = earthaccess.search_data(short_name = 'SWOT_L2_LR_SSH_Expert_2.0', \n temporal = (\"2024-03-22 00:00:00\", \"2024-03-22 23:59:59\"))#,\n #granule_name = '*_Expert_012_455*') #if you know what cycle and pass you want, you can be more specific\n\nGranules found: 29\n\n\n\nIf accessing via Local Machine\n\n# If you are on a local machine, download the first file to your local computer\nearthaccess.download(ssh_results[0], \"./data_downloads/SWOT_files\")\n\n Getting 1 granules, approx download size: 0.03 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_files\\\\SWOT_L2_LR_SSH_Expert_012_428_20240321T235733_20240322T004901_PIC0_01.nc']\n\n\n\n# Open via xarray\nds = xr.open_mfdataset(\"./data_downloads/SWOT_files/SWOT_L2_LR_SSH_Expert*.nc\")#, mask_and_scale=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (num_lines: 9866, num_pixels: 69,\n num_sides: 2)\nCoordinates:\n latitude (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n longitude (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n latitude_nadir (num_lines) float64 dask.array<chunksize=(9866,), meta=np.ndarray>\n longitude_nadir (num_lines) float64 dask.array<chunksize=(9866,), meta=np.ndarray>\nDimensions without coordinates: num_lines, num_pixels, num_sides\nData variables: (12/98)\n time (num_lines) datetime64[ns] dask.array<chunksize=(9866,), meta=np.ndarray>\n time_tai (num_lines) datetime64[ns] dask.array<chunksize=(9866,), meta=np.ndarray>\n ssh_karin (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_qual (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssh_karin_uncert (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ssha_karin (num_lines, num_pixels) float64 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n ... ...\n swh_ssb_cor_source (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n swh_ssb_cor_source_2 (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n wind_speed_ssb_cor_source_2 (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\n volumetric_correlation_uncert (num_lines, num_pixels) float32 dask.array<chunksize=(9866, 69), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.7\n title: Level 2 Low Rate Sea Surfa...\n institution: CNES\n source: Ka-band radar interferometer\n history: 2024-03-24T22:39:40Z : Cre...\n platform: SWOT\n ... ...\n ellipsoid_semi_major_axis: 6378137.0\n ellipsoid_flattening: 0.0033528106647474805\n good_ocean_data_percent: 67.62656103685167\n ssha_variance: 0.7787372594877449\n references: V1.2.1\n equator_longitude: 52.58xarray.DatasetDimensions:num_lines: 9866num_pixels: 69num_sides: 2Coordinates: (4)latitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlongitude(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlatitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :latitude of satellite nadir pointstandard_name :latitudeunits :degrees_northquality_flag :orbit_qualvalid_min :-80000000valid_max :80000000comment :Geodetic latitude [-80,80] (degrees north of equator) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nlongitude_nadir(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :longitude of satellite nadir pointstandard_name :longitudeunits :degrees_eastquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Longitude (degrees east of Grenwich meridian) of the satellite nadir point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nData variables: (98)time(num_lines)datetime64[ns]dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in UTCstandard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\ntime_tai(num_lines)datetime64[ns]dask.array<chunksize=(9866,), meta=np.ndarray>long_name :time in TAIstandard_name :timetai_utc_difference :37.0comment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nssh_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using radiometer measurements for wet troposphere effects on the KaRIn measurement (e.g., rad_wet_tropo_cor and sea_state_bias_cor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 134217728 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4212113375comment :Quality flag for sea surface height from KaRIn in ssh_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly uncertaintyunits :mvalid_min :0valid_max :60000comment :1-sigma uncertainty on the sea surface height from the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_ssb_missing bad_radiometer_corr_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 134217728 268435456 536870912\n 1073741824 2147483648]valid_min :0valid_max :4279222239comment :Quality flag for the SSHA from KaRIn in the ssha_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface heightstandard_name :sea surface height above reference ellipsoidunits :mquality_flag :ssh_karin_2_qualvalid_min :-15000000valid_max :150000000comment :Fully corrected sea surface height measured by KaRIn. The height is relative to the reference ellipsoid defined in the global attributes. This value is computed using model-based estimates for wet troposphere effects on the KaRIn measurement (e.g., model_wet_tropo_cor and sea_state_bias_cor_2).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssh_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sea surface height from KaRInstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809460191comment :Quality flag for sea surface height from KaRIn in ssh_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_2(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomalyunits :mquality_flag :ssha_karin_2_qualvalid_min :-1000000valid_max :1000000comment :Sea surface height anomaly from the KaRIn measurement = ssh_karin_2 - mean_sea_surface_cnescls - solid_earth_tide - ocean_tide_fes – internal_tide_hret - pole_tide - dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nssha_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea surface height anomaly quality flagstandard_name :status_flagflag_meanings :suspect_large_ssh_delta suspect_large_ssh_std suspect_large_ssh_window_std suspect_beam_used suspect_less_than_nine_beams suspect_ssb_out_of_range suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_ssb_not_computable degraded_media_delays_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_tide_corrections_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 64\n 128 256 512 1024 2048 4096\n 8192 32768 65536 131072 262144 524288\n 16777216 33554432 67108864 536870912 1073741824 2147483648]valid_min :0valid_max :3876569055comment :Quality flag for the SSHA from KaRIn in the ssha_karin_2 variable\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\npolarization_karin(num_lines, num_sides)objectdask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :polarization for each side of the KaRIn swathcomment :H denotes co-polarized linear horizontal, V denotes co-polarized linear vertical.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n157.86 kB\n157.86 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nobject\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nswh_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from KaRInstandard_name :sea_surface_wave_significant_heightunits :mquality_flag :swh_karin_qualvalid_min :0valid_max :15000comment :Significant wave height from KaRIn volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for significant wave height from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_rain_likely suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 32 128 256 512\n 1024 2048 4096 8192 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809361848comment :Quality flag for significant wave height from KaRIn in swh_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on significant wave height from KaRInunits :mvalid_min :0valid_max :25000comment :1-sigma uncertainty on significant wave height from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. Radiometer measurements provide the atmospheric attenuation (sig0_cor_atmos_rad).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4077862815comment :Quality flag for sigma0 from KaRIn in sig0_karin_qual variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :1-sigma uncertainty on sigma0 from KaRInunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty on sigma0 from KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :normalized radar cross section (sigma0) from KaRInstandard_name :surface_backwards_scattering_coefficient_of_radar_waveunits :1quality_flag :sig0_karin_2_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) from KaRIn in real, linear units (not decibels). The value may be negative due to noise subtraction. The value is corrected for instrument calibration and atmospheric attenuation. A meteorological model provides the atmospheric attenuation (sig0_cor_atmos_model).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for sigma0 from KaRIn.standard_name :status_flagflag_meanings :suspect_large_nrcs_delta suspect_large_nrcs_std suspect_large_nrcs_window_std suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 1 2 4 8 16 128\n 256 512 1024 2048 4096 8192\n 65536 131072 262144 524288 16777216 33554432\n 536870912 1073741824 2147483648]valid_min :0valid_max :3809427359comment :Quality flag for sigma0 from KaRIn in sig0_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_radiometer_media_attenuation_missing bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 268435456 536870912 1073741824\n 2147483648]valid_min :0valid_max :4077862808comment :Quality flag for wind speed from KaRIn in wind_speed_karin variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wind speed from KaRInstandard_name :wind_speedunits :m/squality_flag :wind_speed_karin_2_qualvalid_min :0valid_max :65000comment :Wind speed from KaRIn computed from sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_karin_2_qual(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for wind speed from KaRIn.standard_name :status_flagflag_meanings :suspect_beam_used suspect_less_than_nine_beams suspect_pixel_used suspect_num_pt_avg suspect_karin_telem suspect_orbit_control suspect_sc_event_flag suspect_tvp_qual suspect_volumetric_corr degraded_media_attenuation_missing degraded_beam_used degraded_large_attitude degraded_karin_ifft_overflow bad_karin_telem bad_very_large_attitude bad_outside_of_range degraded bad_not_usableflag_masks :[ 8 16 128 256 512 1024\n 2048 4096 8192 65536 131072 262144\n 524288 16777216 33554432 536870912 1073741824 2147483648]valid_min :0valid_max :3809427352comment :Quality flag for wind speed from KaRIn in wind_speed_karin_2 variable.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nnum_pt_avg(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :number of samples averagedunits :1valid_min :0valid_max :289comment :Number of native unsmoothed, beam-combined KaRIn samples averaged.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_wind_speed_karin_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_wind_speed_karin_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute wind speed from KaRInstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the wind speed estimate from KaRIn data in wind_speed_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_nadir_altimeter(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from nadir altimeterstandard_name :sea_surface_wave_significant_heightunits :mvalid_min :0valid_max :15000comment :Significant wave height from nadir altimeter.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :significant wave height from wave modelstandard_name :sea_surface_wave_significant_heightsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :0valid_max :15000comment :Significant wave height from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_wave_direction(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface wave directionsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :degreevalid_min :0valid_max :36000comment :Mean sea surface wave direction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_wave_period_t02(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :t02 mean wave periodstandard_name :sea_surface_wind_wave_mean_period_from_variance_spectral_density_second_frequency_momentsource :Meteo France Wave Model (MF-WAM)institution :Meteo Franceunits :svalid_min :0valid_max :10000comment :Sea surface wind wave mean period from model spectral density second moment.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_model_u(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :u component of model windstandard_name :eastward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Eastward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_model_v(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :v component of model windstandard_name :northward_windsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :m/svalid_min :-30000valid_max :30000comment :Northward component of the atmospheric model wind vector at 10 meters.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_rad(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :wind speed from radiometerstandard_name :wind_speedsource :Advanced Microwave Radiometerunits :m/svalid_min :0valid_max :65000comment :Wind speed from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\ndistance_to_coast(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :distance to coastsource :MODIS/GlobCoverinstitution :European Space Agencyunits :mvalid_min :-21000valid_max :21000comment :Approximate distance to the nearest coast point along the Earth surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheading_to_coast(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :heading to coastunits :degreesvalid_min :0valid_max :35999comment :Approximate compass heading (0-360 degrees with respect to true north) to the nearest coast point.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nancillary_surface_classification_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndynamic_ice_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic ice flagstandard_name :status_flagsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATflag_meanings :no_ice probable_ice ice no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Dynamic ice flag for the location of the KaRIn measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrain_flag(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain flagstandard_name :status_flagflag_meanings :no_rain probable_rain rain no_dataflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Flag indicates that signal is attenuated, probably from rain.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_surface_type_flag(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer surface type flagstandard_name :status_flagsource :Advanced Microwave Radiometerflag_meanings :open_ocean coastal_ocean landflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the validity and type of processing applied to generate the wet troposphere correction (rad_wet_tropo_cor). A value of 0 indicates that open ocean processing is used, a value of 1 indicates coastal processing, and a value of 2 indicates that rad_wet_tropo_cor is invalid due to land contamination.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nsc_altitude(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :altitude of KMSF originstandard_name :height_above_reference_ellipsoidunits :mquality_flag :orbit_qualvalid_min :0valid_max :2000000000comment :Altitude of the KMSF origin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\norbit_alt_rate(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbital altitude rate with respect to mean sea surfaceunits :m/svalid_min :-3500valid_max :3500comment :Orbital altitude rate with respect to the mean sea surface.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.46 kB\n39.46 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\ncross_track_angle(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :cross-track angle from true northunits :degreesvalid_min :0valid_max :359999999comment :Angle with respect to true north of the cross-track direction to the right of the spacecraft velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_roll(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :roll of the spacecraftstandard_name :platform_roll_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude roll angle; positive values move the +y antenna down.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_pitch(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :pitch of the spacecraftstandard_name :platform_pitch_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude pitch angle; positive values move the KMSF +x axis up.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nsc_yaw(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :yaw of the spacecraftstandard_name :platform_yaw_angleunits :degreesquality_flag :orbit_qualvalid_min :-1799999valid_max :1800000comment :KMSF attitude yaw angle relative to the nadir track. The yaw angle is a right-handed rotation about the nadir (downward) direction. A yaw value of 0 deg indicates that the KMSF +x axis is aligned with the horizontal component of the Earth-relative velocity vector. A yaw value of 180 deg indicates that the spacecraft is in a yaw-flipped state, with the KMSF -x axis aligned with the horizontal component of the Earth-relative velocity vector.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nvelocity_heading(num_lines)float64dask.array<chunksize=(9866,), meta=np.ndarray>long_name :heading of the spacecraft Earth-relative velocity vectorunits :degreesquality_flag :orbit_qualvalid_min :0valid_max :359999999comment :Angle with respect to true north of the horizontal component of the spacecraft Earth-relative velocity vector. A value of 90 deg indicates that the spacecraft velocity vector pointed due east. Values between 0 and 90 deg indicate that the velocity vector has a northward component, and values between 90 and 180 deg indicate that the velocity vector has a southward component.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\norbit_qual(num_lines)float32dask.array<chunksize=(9866,), meta=np.ndarray>long_name :orbit quality flagstandard_name :status_flagflag_meanings :good orbit_estimated_during_a_maneuver orbit_interpolated_over_data_gap orbit_extrapolated_for_a_duration_less_than_1_day orbit_extrapolated_for_a_duration_between_1_to_2_days orbit_extrapolated_for_a_duration_greater_than_2_days bad_attitudeflag_values :[ 0 4 5 6 7 8 64]valid_min :0valid_max :64comment :Flag indicating the quality of the reconstructed attitude and orbit ephemeris. A value of 0 indicates the reconstructed attitude and orbit ephemeris are both good. Non-zero values less than 64 indicate that the reconstructed attitude is good but there are issues that degrade the quality of the orbit ephemeris. A value of 64 indicates that the reconstructed attitude is degraded or bad.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n39.46 kB\n39.46 kB\n\n\nShape\n(9866,)\n(9866,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 9866 1\n\n\n\n\nlatitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average latitude of samples used to compute SSHstandard_name :latitudeunits :degrees_northvalid_min :-80000000valid_max :80000000comment :Latitude of measurement [-80,80]. Positive latitude is North latitude, negative latitude is South latitude. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nlongitude_avg_ssh(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :weighted average longitude of samples used to compute SSHstandard_name :longitudeunits :degrees_eastvalid_min :0valid_max :359999999comment :Longitude of measurement. East longitude relative to Greenwich meridian. This value may be biased away from a nominal grid location if some of the native, unsmoothed samples were discarded during processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ncross_track_distance(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :cross track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Distance of sample from nadir. Negative values indicate the left side of the swath, and positive values indicate the right side of the swath.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nx_factor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :radiometric calibration X factor as a composite value for the X factors of the +y and -y channelsunits :1valid_min :0.0valid_max :1e+20comment :Radiometric calibration X factor as a linear power ratio.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_cor_atmos_model(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1quality_flag :sig0_karin_2_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsig0_cor_atmos_rad(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from radiometer datasource :Advanced Microwave Radiometerunits :1quality_flag :sig0_karin_qualvalid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from radiometer data as a linear power multiplier (not decibels). sig0_cor_atmos_rad is already applied in computing sig0_karin.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndoppler_centroid(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :doppler centroid estimated by KaRInunits :1/svalid_min :-30000valid_max :30000comment :Doppler centroid (in hertz or cycles per second) estimated by KaRIn.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nphase_bias_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used for phase bias calculationunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used for phase bias calculation during L1B processing.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nobp_ref_surface(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height of reference surface used by on-board-processorunits :mvalid_min :-15000000valid_max :150000000comment :Height (relative to the reference ellipsoid) of the reference surface used by the KaRIn on-board processor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_tmb_187(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 18.7 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 18.7 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_tmb_238(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 23.8 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :13000valid_max :25000comment :Main beam brightness temperature measurement at 23.8 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_tmb_340(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :radiometer main beam brightness temperature at 34.0 GHzstandard_name :toa_brightness_temperaturesource :Advanced Microwave Radiometerunits :Kvalid_min :15000valid_max :28000comment :Main beam brightness temperature measurement at 34.0 GHz. Value is unsmoothed (along-track averaging has not been performed).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_water_vapor(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :water vapor content from radiometerstandard_name :atmosphere_water_vapor_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :15000comment :Integrated water vapor content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nrad_cloud_liquid_water(num_lines, num_sides)float32dask.array<chunksize=(9866, 2), meta=np.ndarray>long_name :liquid water content from radiometerstandard_name :atmosphere_cloud_liquid_water_contentsource :Advanced Microwave Radiometerunits :kg/m^2valid_min :0valid_max :2000comment :Integrated cloud liquid water content from radiometer measurements.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n78.93 kB\n78.93 kB\n\n\nShape\n(9866, 2)\n(9866, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 9866\n\n\n\n\nmean_sea_surface_cnescls(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_cnescls_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (CNES/CLS)source :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_cnescls).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_dtu(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height (DTU)source :DTU18institution :DTUunits :mvalid_min :-1500000valid_max :1500000comment :Mean sea surface height above the reference ellipsoid. The value is referenced to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_sea_surface_dtu_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean sea surface height accuracy (DTU)source :DTU18institution :DTUunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean sea surface height (mean_sea_surface_dtu)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ngeoid(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-1500000valid_max :1500000comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_dynamic_topography(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topographysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :-30000valid_max :30000comment :Mean dynamic topography above the geoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmean_dynamic_topography_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :mean dynamic topography accuracysource :CNES_CLS_2022institution :CNES/CLSunits :mvalid_min :0valid_max :10000comment :Accuracy of the mean dynamic topography.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndepth_or_elevation(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ocean depth or land elevationsource :Altimeter Corrected Elevations, version 2institution :European Space Agencyunits :mvalid_min :-12000valid_max :10000comment :Ocean depth or land elevation above reference ellipsoid. Ocean depth (bathymetry) is given as negative values, and land elevation positive values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsolid_earth_tide(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-10000valid_max :10000comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_fes(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_fes) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_got(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric ocean tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-300000valid_max :300000comment :Geocentric ocean tide height. Includes the sum total of the ocean tide, the corresponding load tide (load_tide_got) and equilibrium long-period ocean tide height (ocean_tide_eq).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nload_tide_fes(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_fes).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nload_tide_got(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-2000valid_max :2000comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value has already been added to the corresponding ocean tide height value (ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_eq(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :equilibrium long-period ocean tide heightunits :mvalid_min :-2000valid_max :2000comment :Equilibrium long-period ocean tide height. This value has already been added to the corresponding ocean tide height values (ocean_tide_fes and ocean_tide_got).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nocean_tide_non_eq(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :non-equilibrium long-period ocean tide heightsource :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-2000valid_max :2000comment :Non-equilibrium long-period ocean tide height. This value is reported as a relative displacement with repsect to ocean_tide_eq. This value can be added to ocean_tide_eq, ocean_tide_fes, or ocean_tide_got, or subtracted from ssha_karin and ssha_karin_2, to account for the total long-period ocean tides from equilibrium and non-equilibrium contributions.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninternal_tide_hret(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (HRET)source :Zaron (2019)units :mvalid_min :-2000valid_max :2000comment :Coherent internal ocean tide. This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninternal_tide_sol2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :coherent internal tide (Model 2)source :Noneunits :mvalid_min :-2000valid_max :2000comment :Coherent internal tide. This value is currently always defaulted.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\npole_tide(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-2000valid_max :2000comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height, the ocean pole tide height, and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ndac(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dynamic atmospheric correctionsource :MOG2Dinstitution :LEGOS/CNES/CLSunits :mvalid_min :-12000valid_max :12000comment :Model estimate of the effect on sea surface topography due to high frequency air pressure and wind effects and the low-frequency height from inverted barometer effect (inv_bar_cor). This value is subtracted from the ssh_karin and ssh_karin_2 to compute ssha_karin and ssha_karin_2, respectively. Use only one of inv_bar_cor and dac.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\ninv_bar_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :static inverse barometer effect on sea surface heightunits :mvalid_min :-2000valid_max :2000comment :Estimate of static effect of atmospheric pressure on sea surface height. Above average pressure lowers sea surface height. Computed by interpolating ECMWF pressure fields in space and time. The value is included in dac. To apply, add dac to ssha_karin and ssha_karin_2 and subtract inv_bar_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmodel_dry_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-30000valid_max :-15000comment :Equivalent vertical correction due to dry troposphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nmodel_wet_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from weather model datasource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mquality_flag :ssh_karin_2_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from weather model data. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin_2) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrad_wet_tropo_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :wet troposphere vertical correction from radiometer datasource :Advanced Microwave Radiometerunits :mquality_flag :ssh_karin_qualvalid_min :-10000valid_max :0comment :Equivalent vertical correction due to wet troposphere delay from radiometer measurements. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height (ssh_karin) results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\niono_cor_gim_ka(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mquality_flag :ssh_karin_2_qualvalid_min :-5000valid_max :0comment :Equivalent vertical correction due to ionosphere delay. The reported sea surface height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheight_cor_xover(num_lines, num_pixels)float64dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :height correction from crossover calibrationunits :mquality_flag :height_cor_xover_qualvalid_min :-100000valid_max :100000comment :Height correction from crossover calibration. To apply this correction the value of height_cor_xover should be added to the value of ssh_karin, ssh_karin_2, ssha_karin, and ssha_karin_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.45 MB\n5.45 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nheight_cor_xover_qual(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :quality flag for height correction from crossover calibrationstandard_name :status_flagflag_meanings :good suspect badflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating the quality of the height correction from crossover calibration. Values of 0, 1, and 2 indicate that the correction is good, suspect, and bad, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nrain_rate(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :rain rate from weather modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mm/hrvalid_min :0valid_max :200comment :Rain rate from weather model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nice_conc(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :concentration of sea icestandard_name :sea_ice_area_fractionsource :EUMETSAT Ocean and Sea Ice Satellite Applications Facilityinstitution :EUMETSATunits :%valid_min :0valid_max :10000comment :Concentration of sea ice from model.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsea_state_bias_cor(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nsea_state_bias_cor_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :sea state bias correctionsource :CNESunits :mvalid_min :-6000valid_max :0comment :Sea state bias correction used to compute ssh_karin_2. Adding the reported correction to the reported sea surface height results in the uncorrected sea surface height. The wind_speed_karin_2 value is used to compute this quantity.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nswh_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for significant wave height information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of significant wave height information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_ssb_cor_source(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nwind_speed_ssb_cor_source_2(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :source flag for wind speed information used to compute sea state bias correctionstandard_name :status_flagflag_meanings :nadir_altimeter karin modelflag_masks :[1 2 4]valid_min :0valid_max :7comment :Bit flag that indicates the source of wind speed information that was used to compute the sea state bias correction in sea_state_bias_cor_2.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nvolumetric_correlation(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :20000comment :Volumetric correlation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nvolumetric_correlation_uncert(num_lines, num_pixels)float32dask.array<chunksize=(9866, 69), meta=np.ndarray>long_name :volumetric correlation standard deviationunits :1quality_flag :ssh_karin_2_qualvalid_min :0valid_max :10000comment :1-sigma uncertainty computed analytically using observed correlation and effective number of looks. Two-sided error bars (volumetric_correlation-volumetric_correlation_uncert, volumetric_correlation+volumetric_correlation_uncert) include 68% of probability distribution.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.72 MB\n2.72 MB\n\n\nShape\n(9866, 69)\n(9866, 69)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 69 9866\n\n\n\n\nIndexes: (0)Attributes: (62)Conventions :CF-1.7title :Level 2 Low Rate Sea Surface Height Data Product - Expert SSH with Wind and Waveinstitution :CNESsource :Ka-band radar interferometerhistory :2024-03-24T22:39:40Z : Creationplatform :SWOTreference_document :D-56407_SWOT_Product_Description_L2_LR_SSHcontact :podaac@jpl.nasa.govcycle_number :12pass_number :428equator_time :2024-03-22T00:23:15.167000Zshort_name :L2_LR_SSHproduct_file_id :Expertcrid :PIC0product_version :01pge_name :PGE_L2_LR_SSHpge_version :5.0.2time_coverage_start :2024-03-21T23:57:33.259925time_coverage_end :2024-03-22T00:49:01.265518geospatial_lon_min :328.86312899999996geospatial_lon_max :136.307662geospatial_lat_min :-78.271942geospatial_lat_max :78.27206799999999left_first_longitude :328.86312899999996left_first_latitude :78.27200599999999left_last_longitude :136.288291left_last_latitude :-77.05370099999999right_first_longitude :328.880955right_first_latitude :77.053837right_last_longitude :136.307662right_last_latitude :-78.27186999999999wavelength :0.008385803020979021transmit_antenna :minus_yxref_l1b_lr_intf_file :SWOT_L1B_LR_INTF_012_428_20240321T235729_20240322T004904_PIC0_01.ncxref_l2_nalt_gdr_files :SWOT_IPN_2PfP012_427_20240321_230606_20240321_235733.nc, SWOT_IPN_2PfP012_428_20240321_235733_20240322_004900.nc, SWOT_IPN_2PfP012_429_20240322_004900_20240322_014027.ncxref_l2_rad_gdr_files :SWOT_IPRAD_2PaP012_427_20240321_230603_20240321_235737_PIC0_01.nc, SWOT_IPRAD_2PaP012_428_20240321_235729_20240322_004904_PIC0_01.nc, SWOT_IPRAD_2PaP012_429_20240322_004856_20240322_014031_PIC0_01.ncxref_int_lr_xover_cal_file :SWOT_INT_LR_XOverCal_20240321T235723_20240322T235815_PIC0_01.ncxref_statickarincal_files :SWOT_StaticKaRInCalAdjustableParam_20000101T000000_20991231T235959_20230823T210000_v106.ncxref_param_l2_lr_precalssh_file :SWOT_Param_L2_LR_PreCalSSH_20000101T000000_20991231T235959_20230815T120500_v301.ncxref_orbit_ephemeris_file :SWOT_POR_AXVCNE20240323_105038_20240321_225923_20240323_005923.ncxref_reforbittrack_files :SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtxref_meteorological_sealevel_pressure_files :SMM_PMA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_PMA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_PMA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_wettroposphere_files :SMM_WEA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_WEA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_WEA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_wind_files :SMM_VWA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_UWA_AXVCNE20240322_031037_20240321_180000_20240321_180000, SMM_VWA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_UWA_AXVCNE20240322_051603_20240322_000000_20240322_000000, SMM_UWA_AXVCNE20240322_163941_20240322_060000_20240322_060000, SMM_VWA_AXVCNE20240322_163941_20240322_060000_20240322_060000xref_meteorological_surface_pressure_files :SMM_PSA_AXVCNE20240322_054027_20240321_180000_20240321_180000, SMM_PSA_AXVCNE20240322_054027_20240322_000000_20240322_000000, SMM_PSA_AXVCNE20240322_174027_20240322_060000_20240322_060000xref_meteorological_temperature_files :SMM_T2M_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_T2M_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_T2M_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_meteorological_water_vapor_files :SMM_CWV_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_CWV_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_CWV_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_meteorological_cloud_liquid_water_files :SMM_CLW_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_CLW_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_CLW_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_model_significant_wave_height_files :SMM_SWH_AXPCNE20240322_054027_20240321_180000_20240321_180000.grb, SMM_SWH_AXPCNE20240322_054027_20240322_000000_20240322_000000.grb, SMM_SWH_AXPCNE20240322_174027_20240322_060000_20240322_060000.grbxref_gim_files :JPLQ0810.24I, JPLQ0820.24Ixref_pole_location_file :SMM_PO1_AXXCNE20240324_020000_19900101_000000_20240920_000000xref_dac_files :SMM_MOG_AXPCNE20240322_074502_20240321_180000_20240321_180000, SMM_MOG_AXPCNE20240322_074502_20240322_000000_20240322_000000, SMM_MOG_AXPCNE20240322_203000_20240322_060000_20240322_060000xref_precipitation_files :SMM_LSR_AXFCNE20240321_185544_20240321_180000_20240321_180000.grb, SMM_CRR_AXFCNE20240321_185544_20240321_180000_20240321_180000.grb, SMM_CRR_AXFCNE20240322_065522_20240322_000000_20240322_000000.grb, SMM_LSR_AXFCNE20240322_065522_20240322_000000_20240322_000000.grb, SMM_CRR_AXFCNE20240322_065522_20240322_060000_20240322_060000.grb, SMM_LSR_AXFCNE20240322_065522_20240322_060000_20240322_060000.grbxref_sea_ice_mask_files :SMM_ICN_AXFCNE20240322_095633_20240321_000000_20240321_235959.nc, SMM_ICS_AXFCNE20240322_095633_20240321_000000_20240321_235959.nc, SMM_ICN_AXFCNE20240323_041507_20240322_000000_20240322_235959.nc, SMM_ICS_AXFCNE20240323_042002_20240322_000000_20240322_235959.ncxref_wave_model_files :SMM_WMA_AXPCNE20240322_072016_20240321_030000_20240322_000000.grb, SMM_WMA_AXPCNE20240323_072017_20240322_030000_20240323_000000.grbxref_geco_database_version :v102ellipsoid_semi_major_axis :6378137.0ellipsoid_flattening :0.0033528106647474805good_ocean_data_percent :67.62656103685167ssha_variance :0.7787372594877449references :V1.2.1equator_longitude :52.58\n\n\n\n\nIf accessing via AWS Cloud\n\n#If you are on the cloud, skip the download step above and access the file via xarray directly\nds = xr.open_mfdataset(earthaccess.open([ssh_results[0]]))#, mask_and_scale=False)\nds\n\n\n\nList all L2 LR SSH quality flag variables in a new python dictionary:\n\nquality_variables = {}\n\nfor name, variable in ds.variables.items():\n if name.endswith(\"qual\"):\n quality_variables[name] = None\n\nsorted(list(quality_variables))\n\n['height_cor_xover_qual',\n 'orbit_qual',\n 'sig0_karin_2_qual',\n 'sig0_karin_qual',\n 'ssh_karin_2_qual',\n 'ssh_karin_qual',\n 'ssha_karin_2_qual',\n 'ssha_karin_qual',\n 'swh_karin_qual',\n 'wind_speed_karin_2_qual',\n 'wind_speed_karin_qual']\n\n\nDepending on the data product, the quality flag may not end with qual, you may need to alter the above code for your particular dataset. See the summary chart in the introduction.\n\nFor this example, we will use the ssha_karin_2 variable from the L2_LR_SSH dataset.\n\nvariable_name = \"ssha_karin_2\"\n\nquality_variable_name = f\"{variable_name}_qual\"\n\nprint(variable_name, quality_variable_name)\n\nssha_karin_2 ssha_karin_2_qual\n\n\nSelect the ssha_karin_2_qual variable and print its header information:\n\nqual = ds.variables[quality_variable_name].copy() \n\nprint(qual)\n\n<xarray.Variable (num_lines: 9866, num_pixels: 69)>\ndask.array<copy, shape=(9866, 69), dtype=float64, chunksize=(9866, 69), chunktype=numpy.ndarray>\nAttributes:\n long_name: sea surface height anomaly quality flag\n standard_name: status_flag\n flag_meanings: suspect_large_ssh_delta suspect_large_ssh_std suspect_lar...\n flag_masks: [ 1 2 4 8 16 ...\n valid_min: 0\n valid_max: 3876569055\n comment: Quality flag for the SSHA from KaRIn in the ssha_karin_2 ...\n\n\nThe flag_meanings and flag_masks attributes define the quality fields/values assigned to each bit (and/or sequence of bits) comprising the integers in the quality variable array. (Refer to the CF Conventions documentation and SWOT PDDs for additional info about standard attributes stored in each netcdf file from SWOT.) The flag meanings/masks attributes are typically space-delimited strings.\n\n\nMake a simple lookup table for the ssha_karin_2_qual variable:\n\natts = dict(qual.attrs.copy())\n\nflags = pd.DataFrame({'flag_meanings': atts.get(\"flag_meanings\").split(\" \"), \n 'flag_masks': atts.get(\"flag_masks\"), }) \\\n .set_index(\"flag_meanings\")\n\ndisplay(flags)\n\n\n\n\n\n\n\n\nflag_masks\n\n\nflag_meanings\n\n\n\n\n\nsuspect_large_ssh_delta\n1\n\n\nsuspect_large_ssh_std\n2\n\n\nsuspect_large_ssh_window_std\n4\n\n\nsuspect_beam_used\n8\n\n\nsuspect_less_than_nine_beams\n16\n\n\nsuspect_ssb_out_of_range\n64\n\n\nsuspect_pixel_used\n128\n\n\nsuspect_num_pt_avg\n256\n\n\nsuspect_karin_telem\n512\n\n\nsuspect_orbit_control\n1024\n\n\nsuspect_sc_event_flag\n2048\n\n\nsuspect_tvp_qual\n4096\n\n\nsuspect_volumetric_corr\n8192\n\n\ndegraded_ssb_not_computable\n32768\n\n\ndegraded_media_delays_missing\n65536\n\n\ndegraded_beam_used\n131072\n\n\ndegraded_large_attitude\n262144\n\n\ndegraded_karin_ifft_overflow\n524288\n\n\nbad_karin_telem\n16777216\n\n\nbad_very_large_attitude\n33554432\n\n\nbad_tide_corrections_missing\n67108864\n\n\nbad_outside_of_range\n536870912\n\n\ndegraded\n1073741824\n\n\nbad_not_usable\n2147483648\n\n\n\n\n\n\n\nNow print the list of unique integer values in the ssha_karin_2_qual variable array. Each value is a sum of an assortment of the numbers above we made in our lookup table. We will decode the quality bits for each one in a new column of our lookup table.\n\nunq_ints_qual = sorted(list(set(qual.load().data.astype(np.int64).flatten().tolist())))\n\nprint(f\"\\n# Counted {len(unq_ints_qual)} unique integers in '{quality_variable_name}' variable array:\\n\\n{unq_ints_qual}\\n\")\n\n\n# Counted 385 unique integers in 'ssha_karin_2_qual' variable array:\n\n[0, 1, 4, 5, 128, 129, 130, 132, 133, 134, 135, 144, 145, 146, 148, 149, 150, 256, 257, 258, 261, 384, 385, 386, 388, 389, 390, 391, 400, 401, 402, 404, 405, 406, 407, 2184, 2185, 2186, 2188, 2189, 2190, 2191, 2200, 2201, 2204, 2205, 2206, 2207, 2440, 2441, 2442, 2444, 2445, 2446, 2447, 2456, 2457, 2458, 2460, 2461, 2462, 2463, 8328, 8329, 8332, 8333, 8344, 8345, 8346, 8348, 8349, 8350, 8584, 8585, 8586, 8588, 8589, 8590, 8591, 8600, 8601, 8602, 8604, 8605, 8606, 8607, 10376, 10380, 10381, 10392, 10393, 10396, 10397, 10398, 10632, 10633, 10634, 10636, 10637, 10638, 10639, 10648, 10649, 10650, 10652, 10653, 10654, 10655, 1073774592, 1073774593, 1073774594, 1073774596, 1073774597, 1073774608, 1073774609, 1073774613, 1073774720, 1073774721, 1073774724, 1073774725, 1073774736, 1073774737, 1073774741, 1073774848, 1073774849, 1073774850, 1073774852, 1073774853, 1073774854, 1073774855, 1073774864, 1073774865, 1073774866, 1073774868, 1073774869, 1073774870, 1073774976, 1073774977, 1073774978, 1073774980, 1073774981, 1073774992, 1073774993, 1073774994, 1073774996, 1073774997, 1073774998, 1073782792, 1073782793, 1073782920, 1073782921, 1073782936, 1073782937, 1073782941, 1073783053, 1073783064, 1073783176, 1073783177, 1073783178, 1073783192, 1073783193, 1073783194, 1073783196, 1073783197, 1073783198, 1073783199, 1074397184, 1074397185, 1074397188, 1074397189, 1074397200, 1074397201, 1074397204, 1074397205, 1074397312, 1074397313, 1074397316, 1074397317, 1074397328, 1074397329, 1074397332, 1074397333, 1074397440, 1074397441, 1074397442, 1074397444, 1074397445, 1074397446, 1074397447, 1074397456, 1074397457, 1074397458, 1074397460, 1074397461, 1074397462, 1074397463, 1074397568, 1074397569, 1074397570, 1074397572, 1074397573, 1074397574, 1074397575, 1074397584, 1074397585, 1074397586, 1074397588, 1074397589, 1074397590, 1074397591, 1074399232, 1074399233, 1074399236, 1074399237, 1074399240, 1074399241, 1074399244, 1074399245, 1074399248, 1074399249, 1074399252, 1074399253, 1074399256, 1074399257, 1074399260, 1074399261, 1074399369, 1074399372, 1074399373, 1074399385, 1074399388, 1074399389, 1074399488, 1074399489, 1074399492, 1074399493, 1074399494, 1074399496, 1074399497, 1074399500, 1074399501, 1074399502, 1074399503, 1074399504, 1074399505, 1074399506, 1074399508, 1074399509, 1074399510, 1074399512, 1074399513, 1074399514, 1074399516, 1074399517, 1074399518, 1074399519, 1074399624, 1074399625, 1074399626, 1074399628, 1074399629, 1074399630, 1074399631, 1074399640, 1074399641, 1074399642, 1074399644, 1074399645, 1074399646, 1074399647, 1074405376, 1074405377, 1074405381, 1074405384, 1074405385, 1074405392, 1074405393, 1074405396, 1074405397, 1074405400, 1074405401, 1074405405, 1074405521, 1074405525, 1074405528, 1074405529, 1074405532, 1074405533, 1074405632, 1074405633, 1074405637, 1074405640, 1074405641, 1074405648, 1074405649, 1074405650, 1074405652, 1074405653, 1074405656, 1074405657, 1074405658, 1074405660, 1074405661, 1074405662, 1074405769, 1074405773, 1074405776, 1074405777, 1074405780, 1074405781, 1074405784, 1074405785, 1074405786, 1074405788, 1074405789, 1074405790, 1074407436, 1074407437, 1074407440, 1074407441, 1074407444, 1074407445, 1074407448, 1074407449, 1074407452, 1074407453, 1074407564, 1074407576, 1074407577, 1074407581, 1074407688, 1074407692, 1074407693, 1074407696, 1074407697, 1074407700, 1074407701, 1074407704, 1074407705, 1074407708, 1074407709, 1074407816, 1074407817, 1074407818, 1074407820, 1074407821, 1074407832, 1074407833, 1074407834, 1074407836, 1074407837, 1074407838, 1074407839, 1074429952, 1074429953, 1074429957, 1074429968, 1074429969, 1074429972, 1074430097, 1074430208, 1074430210, 1074430212, 1074430213, 1074430224, 1074430225, 1074430228, 1074430352, 1074430353, 1074430356, 1074438145, 1074438148, 1074438161, 1074438164, 1074438420, 1074438421, 1074438548, 1074438549, 1074438552, 1074438553, 1074438556, 1074438557, 2684354816, 2684354820, 2751463684]\n\n\n\n\n\nCreate a bitwise True/False mapping for each unique integer in the ssha_karin_2_qual array.\nIt’s often advantageous to construct a data mask based on the pixels/cells that you’d like to include in your analysis (rather than exclude from it; masking in vs. masking out).\n\ndef qual_bits_iter(n):\n while n:\n b = n & (~n+1)\n yield b\n n ^= b\n\ndecomposed_qual = {}\nfor i in sorted(unq_ints_qual):\n if i not in decomposed_qual:\n decomposed_qual[i] = qual_bits_iter(i)\n\ntype(decomposed_qual), len(decomposed_qual)\n\n(dict, 385)\n\n\nAdd one new column for each unique integer in the ssha_karin_qual variable. Highlight table cells that contain True, which indicates the quality criteria on the left/index applies to the pixels/cells in ssha_karin wherever the ssha_karin_qual array contains one of the corresponding integers.\n\nnew_columns_qual = {}\nfor i, j in enumerate(list(set(decomposed_qual))):\n new_columns_qual[j] = flags['flag_masks'] \\\n .apply(lambda x: x in [b for b in qual_bits_iter(j)])\n\nlookup = flags.join(pd.DataFrame(new_columns_qual).sort_index(axis=1)).copy()\n\ndisplay(lookup.style.apply(lambda x: ['background-color:yellow' if all([i,type(i)==bool]) else '' for i in x]))\n\n\n\n\n\n\n \nflag_masks\n0\n1\n4\n5\n128\n129\n130\n132\n133\n134\n135\n144\n145\n146\n148\n149\n150\n256\n257\n258\n261\n384\n385\n386\n388\n389\n390\n391\n400\n401\n402\n404\n405\n406\n407\n2184\n2185\n2186\n2188\n2189\n2190\n2191\n2200\n2201\n2204\n2205\n2206\n2207\n2440\n2441\n2442\n2444\n2445\n2446\n2447\n2456\n2457\n2458\n2460\n2461\n2462\n2463\n8328\n8329\n8332\n8333\n8344\n8345\n8346\n8348\n8349\n8350\n8584\n8585\n8586\n8588\n8589\n8590\n8591\n8600\n8601\n8602\n8604\n8605\n8606\n8607\n10376\n10380\n10381\n10392\n10393\n10396\n10397\n10398\n10632\n10633\n10634\n10636\n10637\n10638\n10639\n10648\n10649\n10650\n10652\n10653\n10654\n10655\n1073774592\n1073774593\n1073774594\n1073774596\n1073774597\n1073774608\n1073774609\n1073774613\n1073774720\n1073774721\n1073774724\n1073774725\n1073774736\n1073774737\n1073774741\n1073774848\n1073774849\n1073774850\n1073774852\n1073774853\n1073774854\n1073774855\n1073774864\n1073774865\n1073774866\n1073774868\n1073774869\n1073774870\n1073774976\n1073774977\n1073774978\n1073774980\n1073774981\n1073774992\n1073774993\n1073774994\n1073774996\n1073774997\n1073774998\n1073782792\n1073782793\n1073782920\n1073782921\n1073782936\n1073782937\n1073782941\n1073783053\n1073783064\n1073783176\n1073783177\n1073783178\n1073783192\n1073783193\n1073783194\n1073783196\n1073783197\n1073783198\n1073783199\n1074397184\n1074397185\n1074397188\n1074397189\n1074397200\n1074397201\n1074397204\n1074397205\n1074397312\n1074397313\n1074397316\n1074397317\n1074397328\n1074397329\n1074397332\n1074397333\n1074397440\n1074397441\n1074397442\n1074397444\n1074397445\n1074397446\n1074397447\n1074397456\n1074397457\n1074397458\n1074397460\n1074397461\n1074397462\n1074397463\n1074397568\n1074397569\n1074397570\n1074397572\n1074397573\n1074397574\n1074397575\n1074397584\n1074397585\n1074397586\n1074397588\n1074397589\n1074397590\n1074397591\n1074399232\n1074399233\n1074399236\n1074399237\n1074399240\n1074399241\n1074399244\n1074399245\n1074399248\n1074399249\n1074399252\n1074399253\n1074399256\n1074399257\n1074399260\n1074399261\n1074399369\n1074399372\n1074399373\n1074399385\n1074399388\n1074399389\n1074399488\n1074399489\n1074399492\n1074399493\n1074399494\n1074399496\n1074399497\n1074399500\n1074399501\n1074399502\n1074399503\n1074399504\n1074399505\n1074399506\n1074399508\n1074399509\n1074399510\n1074399512\n1074399513\n1074399514\n1074399516\n1074399517\n1074399518\n1074399519\n1074399624\n1074399625\n1074399626\n1074399628\n1074399629\n1074399630\n1074399631\n1074399640\n1074399641\n1074399642\n1074399644\n1074399645\n1074399646\n1074399647\n1074405376\n1074405377\n1074405381\n1074405384\n1074405385\n1074405392\n1074405393\n1074405396\n1074405397\n1074405400\n1074405401\n1074405405\n1074405521\n1074405525\n1074405528\n1074405529\n1074405532\n1074405533\n1074405632\n1074405633\n1074405637\n1074405640\n1074405641\n1074405648\n1074405649\n1074405650\n1074405652\n1074405653\n1074405656\n1074405657\n1074405658\n1074405660\n1074405661\n1074405662\n1074405769\n1074405773\n1074405776\n1074405777\n1074405780\n1074405781\n1074405784\n1074405785\n1074405786\n1074405788\n1074405789\n1074405790\n1074407436\n1074407437\n1074407440\n1074407441\n1074407444\n1074407445\n1074407448\n1074407449\n1074407452\n1074407453\n1074407564\n1074407576\n1074407577\n1074407581\n1074407688\n1074407692\n1074407693\n1074407696\n1074407697\n1074407700\n1074407701\n1074407704\n1074407705\n1074407708\n1074407709\n1074407816\n1074407817\n1074407818\n1074407820\n1074407821\n1074407832\n1074407833\n1074407834\n1074407836\n1074407837\n1074407838\n1074407839\n1074429952\n1074429953\n1074429957\n1074429968\n1074429969\n1074429972\n1074430097\n1074430208\n1074430210\n1074430212\n1074430213\n1074430224\n1074430225\n1074430228\n1074430352\n1074430353\n1074430356\n1074438145\n1074438148\n1074438161\n1074438164\n1074438420\n1074438421\n1074438548\n1074438549\n1074438552\n1074438553\n1074438556\n1074438557\n2684354816\n2684354820\n2751463684\n\n\nflag_meanings\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nsuspect_large_ssh_delta\n1\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_large_ssh_std\n2\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_large_ssh_window_std\n4\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nTrue\nFalse\nFalse\nTrue\nFalse\nTrue\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nFalse\nTrue\nTrue\n\n\nsuspect_beam_used\n8\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_less_than_nine_beams\n16\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_ssb_out_of_range\n64\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_pixel_used\n128\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nsuspect_num_pt_avg\n256\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\n\n\nsuspect_karin_telem\n512\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_orbit_control\n1024\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_sc_event_flag\n2048\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_tvp_qual\n4096\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nsuspect_volumetric_corr\n8192\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_ssb_not_computable\n32768\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_media_delays_missing\n65536\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\ndegraded_beam_used\n131072\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\ndegraded_large_attitude\n262144\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\ndegraded_karin_ifft_overflow\n524288\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nbad_karin_telem\n16777216\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nbad_very_large_attitude\n33554432\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\n\n\nbad_tide_corrections_missing\n67108864\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\n\n\nbad_outside_of_range\n536870912\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\n\n\ndegraded\n1073741824\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nTrue\nFalse\nFalse\nFalse\n\n\nbad_not_usable\n2147483648\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nFalse\nTrue\nTrue\nTrue\n\n\n\n\n\nNote the distribution of the highlighted cells in the table above. (And see my earlier point about integer size and the number significant bits.)\n\n\nFinally, create a mask based on some criteria selected from the table above.\nFor a simple example, let’s create a mask that excludes pixels that have quality flags prefixed with “bad” or “degraded”, which includes all the flag meanings in this list:\n\nflags_to_mask = sorted([i for i in lookup.index if i.startswith(('bad', 'degraded', 'suspect', ))])\n\ndisplay(flags_to_mask)\n\n['bad_karin_telem',\n 'bad_not_usable',\n 'bad_outside_of_range',\n 'bad_tide_corrections_missing',\n 'bad_very_large_attitude',\n 'degraded',\n 'degraded_beam_used',\n 'degraded_karin_ifft_overflow',\n 'degraded_large_attitude',\n 'degraded_media_delays_missing',\n 'degraded_ssb_not_computable',\n 'suspect_beam_used',\n 'suspect_karin_telem',\n 'suspect_large_ssh_delta',\n 'suspect_large_ssh_std',\n 'suspect_large_ssh_window_std',\n 'suspect_less_than_nine_beams',\n 'suspect_num_pt_avg',\n 'suspect_orbit_control',\n 'suspect_pixel_used',\n 'suspect_sc_event_flag',\n 'suspect_ssb_out_of_range',\n 'suspect_tvp_qual',\n 'suspect_volumetric_corr']\n\n\n\nNow select the columns that contain True in any of the rows indexed by the list of flags_to_mask:\n\ntmp = lookup.copy() # Make a copy of the table.\n\ndel tmp['flag_masks'] # Remove the 'flag_masks' column.\n\nindices = tmp.loc[flags_to_mask].apply(lambda x: x.any()).copy() # Get a boolean array of integers that comprise the mask.\n\nintegers = sorted(tmp.columns[indices].astype(np.int64).tolist()) # Get the columns/integers with one or more flag set to True.\n\nprint(len(integers))\n\n384\n\n\n\n\nNow get the 2d boolean index where ssha_karin_2_qual array contains any of the integers in the list.\n\nssha_karin_2_mask = np.isin(qual.load().data, integers)\n\nprint(f\"Masked: {ssha_karin_2_mask.sum()} / {ssha_karin_2_mask.size}\\n\")\n\ndisplay(ssha_karin_2_mask)\n\nMasked: 428494 / 680754\n\n\n\narray([[ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n ...,\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True],\n [ True, True, True, ..., True, True, True]])\n\n\n\n\nConvert the boolean mask array to the equivalent 0,1 integer array and add it to the xarray Dataset as a new variable:\n\nout = ds.copy()\n\nout['mask'] = out[variable_name].copy()\nout['mask'].data = np.where(out.ancillary_surface_classification_flag==0, ssha_karin_2_mask.astype(np.int64), 0)\nout['mask'].attrs = {}\n\n#correct for cross over calibration for the ssha variable so it plots correctly\nout['ssha_karin_2_corrected'] = out.ssha_karin_2 + out.height_cor_xover\n\n\n\n\n\nPlot\n\n#Plot\nSLICE = slice(5000, 5500)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 6), sharey=True) #sharex=True, \n\nLVLS = sorted(set(list(qual.load().isel(num_lines=SLICE).data.flatten())))\n\nout.ssha_karin_2_qual.isel(num_lines=SLICE).astype(int) \\\n .plot(ax=axes[0], levels=LVLS, add_colorbar=True, cbar_kwargs={'orientation': 'horizontal', 'spacing': 'uniform', 'ticks': LVLS})\n\nout.mask.isel(num_lines=SLICE) \\\n .plot(ax=axes[1], colors=['black'], add_colorbar=True, cbar_kwargs={'orientation': 'horizontal', 'ticks': [1], }, levels=[0, 1] )\n\nssha_karin_2_masked = out.ssha_karin_2_corrected \\\n .where(out.mask==0, np.nan).copy()\n\nssha_karin_2_masked.isel(num_lines=SLICE) \\\n .plot(ax=axes[2], add_colorbar=True, cbar_kwargs={'orientation': 'horizontal'}, )\n\n\n\n\n\n\n\n\nWe’ve applied the quality mask to the ssha_karin_2 variable and visualized the result!", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" + "Access & Visualization", + "Quality Flags" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#authenticate", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#authenticate", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Authenticate", - "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x11fc666c0>", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] + "objectID": "notebooks/SearchDownload_SWOTviaCMR.html#summary", + "href": "notebooks/SearchDownload_SWOTviaCMR.html#summary", + "title": "Search and Download SWOT Data via earthaccess", + "section": "Summary", + "text": "Summary\nThis notebook will find and download pre-validated SWOT hydrology data (v2.0) programmatically via earthaccess python library. For more information about earthaccess visit: https://nsidc.github.io/earthaccess/" }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#search-and-access-sos-data", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#search-and-access-sos-data", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Search and Access SoS data", - "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] + "objectID": "notebooks/SearchDownload_SWOTviaCMR.html#requirements", + "href": "notebooks/SearchDownload_SWOTviaCMR.html#requirements", + "title": "Search and Download SWOT Data via earthaccess", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport geopandas as gpd\nimport glob\nfrom pathlib import Path\nimport pandas as pd\nimport os\nimport zipfile\nimport earthaccess\n\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login() \n\n\n\nSearch for SWOT data links\nWe want to find the SWOT files for a particular pass over North America.\nEach dataset has it’s own unique shortname, which can be used to search earthaccess. Shortnames can be found on dataset landing pages or Earthdata Search Collections.\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nWater Mask Pixel Cloud NetCDF - SWOT_L2_HR_PIXC_2.0\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\nRiver Vector Shapefile - SWOT_L2_HR_RiverSP_2.0\nLake Vector Shapefile - SWOT_L2_HR_LakeSP_2.0\nRaster NetCDF - SWOT_L2_HR_Raster_2.0\n\nLet’s start our search for River Vector Shapefiles with a particular pass, pass 013. SWOT files come in “reach” and “node” versions in the same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’ and call out a specific pass number that we want.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n #temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_013_NA*') # here we filter by Reach files (not node), pass=013, continent code=NA\n\nGranules found: 6\n\n\nDuring the science orbit, a pass will be repeated once every 21 days. A particular location may have different passes observe it within the 21 days, however. See the SWOT swath visualizer for your location!\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"./datasets/data_downloads/SWOT_files/\")\nfolder = Path(\"./datasets/data_downloads/SWOT_files\")\n\n Getting 6 granules, approx download size: 0.0 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.zip\nDownloaded: ./datasets/data_downloads/SWOT_files/SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.zip\n\n\n\n\nShapefiles come in a .zip format, and need to be unzipped in the existing folder\n\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\nos.listdir(folder)\n\n['SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.zip',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shx',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shp',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.prj',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_009_013_NA_20240104T143502_20240104T143504_PIC0_01.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.prj',\n 'SWOT_L2_HR_RiverSP_Reach_010_013_NA_20240125T112008_20240125T112010_PIC0_02.shp.xml',\n 'SWOT_L2_HR_RiverSP_Reach_007_013_NA_20231123T210452_20231123T210454_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.zip',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shx',\n 'SWOT_L2_HR_RiverSP_Reach_008_013_NA_20231214T174955_20231214T174957_PIC0_01.shp',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.dbf',\n 'SWOT_L2_HR_RiverSP_Reach_011_013_NA_20240215T080513_20240215T080514_PIC0_01.prj']" }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#locate-gauge-and-rive-discharge-data.", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#locate-gauge-and-rive-discharge-data.", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Locate gauge and rive discharge data.", - "text": "Locate gauge and rive discharge data.\nWe can now locate gauge and river discharge data from the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n\n# Get discharge for a specific river name\nriver_names = results['reaches']['river_name'][:]\nreach_idx = np.where(river_names[:] == RIVER_NAME)\n\n\n# Filter out missing values\ndischarge = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][:][reach_idx]\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\n\n# Loop through each reach and filter out places where the missing value is present\nfor i in range(discharge.shape[0]):\n is_missing = np.all(discharge[i] == missing)\n if is_missing:\n discharge[i] = np.array([np.nan])\n else:\n discharge[i][discharge[i] == missing] = np.nan\n\n# discharge = discharge[data_indexes] \nprint(f\"Discharge values:\\n {discharge}\")\nprint(f\"Length of discharge values: {discharge.shape}\")\n\nDischarge values:\n [array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 54.07821944,\n 49.94874936, 34.29138816, 34.49135369])\n array([ nan, nan, nan, nan, nan,\n nan, 82.61844383, nan, nan, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 2907.9691168 ,\n 3153.60845063, 3297.52519565, nan, 2184.5119275 ,\n 2488.26914856])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 140.25074677, 7878.00373995,\n 1852.91098506, nan, nan, nan,\n nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 4464.2000491 , 5722.24574639,\n nan, 279.63722341, 258.96348657, 323.14058122,\n 4320.51866836])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, nan, nan, nan,\n 3172.76812796])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, 812.95022706, 821.39065048,\n 824.5340281 , 748.25414935, 750.22182631, 727.4228604 ,\n 714.90032622])\n array([ nan, nan, nan, nan, nan,\n nan, 12.96023473, 13.62441855, 9.2229579 , 6.78091378,\n 6.08133493, 3.86084087, 4.35815961])\n array([ nan, nan, nan, nan, nan,\n nan, 46.33641998, 44.15285669, nan, 14.58184889,\n nan, 0.6631935 , 5.5124224 ])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n nan, nan, 482.5083491])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 52.73158663, nan, 28.40903799,\n nan, 9.20201576, 1.32055668])\n array([ nan, nan, nan, nan,\n nan, nan, 280.86449094, 205.30851846,\n 110.83887881, 151.87592498, 227.77297649, 93.05295619,\n 81.05582342])\n array([ nan, nan, nan, nan, nan,\n nan, 47.52573484, nan, nan, nan,\n nan, 77.78871975, 12.8748962 ])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 19.66703691, nan, nan,\n nan, nan, nan])\n array([ nan, nan, nan, nan, nan,\n nan, 96.90955888, 45.20619634, 5.87241546, nan,\n nan, nan, 0.43745264])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, 16.7157942 , 14.55850863, nan, 5.07303443,\n 4.12986955, 2.43344827, 3.19803766])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 17.64858373, 14.15283703, 7.97109699,\n 3.93440203, 3.08442744, 2.44310106, 2.33711971])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 4.47810394, 1.72949116, 1.83256864, 1.75216572])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 98.51437115, 90.98432077, 98.10419242,\n nan, 57.94006526, 30.77548924, 57.57734148])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 50.55048997, nan,\n 26.59220618, 23.64661731, 24.57567818, 23.99663384])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 69.2017186 , 55.13156023, nan,\n nan, 32.72661602, 25.27141885, 27.32154394])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 91.85689278,\n 118.09762553, 70.72385117, 117.09601965, 46.02141169,\n 43.47693004, 58.09836739])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 66.50971298, 64.91180821,\n 57.92947014, 52.98187408, 50.83445596, 52.76051291])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 70.04344344, 65.22378172,\n 55.93499204, 50.85696393, 56.55554003, 57.94008371])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 11.61540995, 12.1144766 , 12.34147342, 13.03231781])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n 100.96540712, 100.02751124, 91.80281586, 93.81840639,\n 94.86759615, 99.19542762])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 1213.67194541,\n 1138.18496353, 1115.0978839 , 1069.45943177, 1082.94584138,\n 1198.94024353, 1108.93895269])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 149.84091602,\n 143.07347301, 142.0394067 , 134.96703933, 134.45761119,\n 142.42974651, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 479.13397319,\n 431.81058979, 419.96984402, nan, 495.59938085,\n nan, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 117.09868443,\n 122.22892084, nan, 113.9907313 , 114.47006025,\n 123.33244731, nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, 0.34485608, 0.35643217, 3.14244405,\n 4.29356865, 2.06295992, 3.93507027, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 1517.63972134,\n 1338.77519837, 5921.30623408, nan, 3735.38675824,\n 5768.54043902, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 150.0785271 ,\n 138.15145821, 115.59306174, nan, 122.53882181,\n 102.65471851, 170.72795537])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 225.29351257,\n 282.74613246, nan, nan, nan,\n 28.93018406, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, 284.92595543,\n 269.58929591, 200.69054755, 199.35693809, 262.95554178,\n 274.66925045, 196.70624072])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, 13.99616776, 28.98604862,\n 38.61180849, 3.45407562, 1.8285061 , 0.43871852, 31.92912359])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 361.15208977, nan, 79.9505899 ,\n 56.65382349, 315.28092266, nan])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, nan,\n 11.40702748, 9.05996153, 10.35840011, 10.52491965, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n 18066.12312538, nan, 13155.40783521, 13592.3818625 ,\n 13460.42744663, 15166.61524739, 15473.56388479])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 8.01126872e+00, 8.30272947e-01, nan,\n nan, nan, 1.17583270e+04])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 38.15129006,\n 3.3873721 , nan, nan, nan, nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 0.46128164, 359.28851327, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 25.22047988,\n nan, nan, nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 3498.82326002, nan, nan,\n nan, nan, nan])\n array([nan])\n array([ nan, nan, nan, nan,\n nan, nan, nan, nan,\n nan, 3701.80872278, nan, nan,\n nan, nan, nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan])\n array([ nan, nan, nan, nan, nan,\n nan, nan, nan, nan, 35.46511394,\n 38.00128732, nan, 39.64547151, 43.47713267, 45.55741719])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])\n array([nan]) array([nan]) array([nan]) array([nan]) array([nan])]\nLength of discharge values: (146,)\n\n\n\n# Take the mean of the algorithm's river discharge - requires a loop because of ragged arrays\nmean_discharge = []\nfor d in discharge:\n with warnings.catch_warnings():\n warnings.simplefilter(\"ignore\", category=RuntimeWarning) # Ignore mean of empty slice as this is expected\n mean_discharge.append(np.nanmean(d)) # Ignore NaNs\nprint(f\"Mean discharge:\\n {mean_discharge}\")\nprint(f\"Mean discharge length: {len(mean_discharge)}\")\n\nMean discharge:\n [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 43.20242766259139, 82.6184438345387, nan, 2806.3767678265503, nan, 3290.3884905945197, nan, 2561.4509591772926, nan, nan, nan, 3172.768127964829, nan, 771.382009704293, 8.126980052616233, 22.24934829272215, 482.50834910152236, 22.915799264864788, 164.39565275437067, 46.06311693081852, 19.667036911352756, 37.10640583102956, nan, 7.68478212404095, 7.367366854486422, 2.4480823643843834, 72.31596338656968, 29.87232509528331, 41.93057152878337, 77.9101568923245, 57.65463904823475, 59.425800813779496, 12.275919445942492, 96.77952739610087, 1132.4627517441627, 141.1346987945013, nan, 456.62844696408314, 118.22416882714128, 2.355888522926942, 3656.3296702111575, 133.2907571236616, nan, 178.98994303187487, 241.2705385597663, nan, nan, nan, 17.034921242178314, nan, nan, nan, 203.25935645781158, nan, 10.33757719434832, 14819.086566983768, nan, nan, nan, nan, nan, nan, nan, 3922.3895222840197, 20.769331076880015, 179.8748974544238, nan, 25.22047987608233, nan, 3498.8232600199126, nan, 3701.808722784879, nan, nan, nan, nan, nan, nan, nan, nan, 40.42928452605076, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]\nMean discharge length: 146\n\n\n\n# Convert discharge and reach identifiers into DataFrame\nreach_ids = results[\"reaches\"][\"reach_id\"][:][reach_idx].filled()\npdf = pd.DataFrame({\n \"reach_id\": reach_ids,\n \"discharge\": mean_discharge\n})\npdf.head()\n\n\n\n\n\n\n\n\nreach_id\ndischarge\n\n\n\n\n0\n23261000181\nNaN\n\n\n1\n23261000191\nNaN\n\n\n2\n23261000201\nNaN\n\n\n3\n23261000211\nNaN\n\n\n4\n23261000221\nNaN\n\n\n\n\n\n\n\n\nresults.close() # Close the NetCDF dataset", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] + "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html", + "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html", + "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", + "section": "", + "text": "Read more about the EOSDIS Cloud at NASA Earthdata." }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#read-in-sword-to-get-topology-data-for-river-name", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#read-in-sword-to-get-topology-data-for-river-name", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Read in SWORD to get topology data for river name", - "text": "Read in SWORD to get topology data for river name\nWe will need to use SWORD to visualize a river’s topology. This will need to be downloaded onto your local computer and placed in a directory that you can reference in the code below. You can SWORD from this site: https://www.swordexplorer.com/. You will need to read in the correct SWORD shapefile by selecting the HydroBASINS Pfafstetter level 2 basins (hbXX) within each continent. See the SWORD Product Description Document for more information.\n\n# Read in SWORD data as GeoPandas DataFrame\nsword = pathlib.Path(\"path/to/SWORD/shapefiles/EU/eu_sword_reaches_hb23_v16.shp\")\ngdf = gpd.read_file(sword)\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nn_rch_dn\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\n\n\n\n\n0\n-6.049157\n37.218576\n23120100011\n13823.649876\n69\n2.5\n0.501996\n108.0\n3443.195570\n1419.435181\n...\n1\n23120100556\n23120100545\n141 447\n2\n1\nNODATA\nNaN\n0\nLINESTRING (-6.10323 37.17382, -6.10289 37.173...\n\n\n1\n-6.078171\n37.217731\n23120100021\n10958.610152\n55\n0.7\n0.000000\n332.0\n4306.172957\n49838.097656\n...\n1\n23120100031\n23120100545\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.10323 37.17382, -6.10356 37.174...\n\n\n2\n-6.033200\n37.302991\n23120100031\n10894.357022\n54\n0.7\n0.004637\n256.0\n2452.139491\n49793.073567\n...\n1\n23120100041\n23120100021\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.05928 37.26167, -6.05927 37.261...\n\n\n3\n-6.015671\n37.393440\n23120100041\n10926.456281\n55\n1.0\n0.099503\n180.0\n445.458881\n49748.591937\n...\n1\n23120100061 23120100051\n23120100031\n447\n1\n1\nNODATA\nNaN\n0\nLINESTRING (-6.02252 37.34482, -6.02251 37.345...\n\n\n4\n-6.028455\n37.461068\n23120100051\n11942.410756\n60\n3.3\n0.039395\n54.0\n458.125217\n2011.318237\n...\n1\n23120100364\n23120100041\n447\n1\n1\nRivera de Huelva\nNaN\n0\nLINESTRING (-6.00566 37.44168, -6.00599 37.441...\n\n\n\n\n5 rows × 30 columns\n\n\n\n\n# Locate reach identifiers for river of interest\nreach_mask = gdf[\"reach_id\"].isin(reach_ids)\ngdf = gdf[reach_mask]\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nn_rch_dn\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\n\n\n\n\n3526\n6.233655\n51.825947\n23261000181\n8580.296766\n43\n9.300000\n0.219616\n375.374664\n923.545609\n159179.679845\n...\n1\n23261000191\n23261000171\n236 514\n2\n1\nRhine\n2\n0\nLINESTRING (6.17589 51.83773, 6.17628 51.83759...\n\n\n3527\n6.323893\n51.780903\n23261000191\n8586.191571\n43\n9.400001\n0.198737\n377.863434\n2695.005803\n159093.279060\n...\n1\n23261000201\n23261000181\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.28873 51.81080, 6.28912 51.81067...\n\n\n3528\n6.403613\n51.742265\n23261000201\n8582.119596\n43\n10.300000\n0.042619\n374.370209\n3483.753299\n159008.223035\n...\n1\n23261000211\n23261000191\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.36071 51.75371, 6.36116 51.75367...\n\n\n3529\n6.509667\n51.674094\n23261000211\n17893.641182\n89\n11.000000\n0.041548\n404.123932\n5500.626216\n158919.468921\n...\n1\n23261000231 23261000221\n23261000201\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.41422 51.71362, 6.41455 51.71344...\n\n\n3530\n6.608218\n51.634048\n23261000221\n1289.550762\n6\n12.100000\n0.000000\n127.000000\n4780.127500\n158732.593750\n...\n1\n23261000274\n23261000211\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.60434 51.63966, 6.60457 51.63917...\n\n\n\n\n5 rows × 30 columns\n\n\n\n\n# Join discharge to GeoPandas DataFrame and extract discharge and geometries\ngdf = gdf.join(pdf.set_index(\"reach_id\"), on=\"reach_id\")\ngdf[\"discharge\"] = gdf[\"discharge\"].fillna(missing)\ngdf.head()\n\n\n\n\n\n\n\n\nx\ny\nreach_id\nreach_len\nn_nodes\nwse\nwse_var\nwidth\nwidth_var\nfacc\n...\nrch_id_up\nrch_id_dn\nswot_orbit\nswot_obs\ntype\nriver_name\nedit_flag\ntrib_flag\ngeometry\ndischarge\n\n\n\n\n3526\n6.233655\n51.825947\n23261000181\n8580.296766\n43\n9.300000\n0.219616\n375.374664\n923.545609\n159179.679845\n...\n23261000191\n23261000171\n236 514\n2\n1\nRhine\n2\n0\nLINESTRING (6.17589 51.83773, 6.17628 51.83759...\n-1.000000e+12\n\n\n3527\n6.323893\n51.780903\n23261000191\n8586.191571\n43\n9.400001\n0.198737\n377.863434\n2695.005803\n159093.279060\n...\n23261000201\n23261000181\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.28873 51.81080, 6.28912 51.81067...\n-1.000000e+12\n\n\n3528\n6.403613\n51.742265\n23261000201\n8582.119596\n43\n10.300000\n0.042619\n374.370209\n3483.753299\n159008.223035\n...\n23261000211\n23261000191\n236 514\n2\n1\nRhine\nNaN\n0\nLINESTRING (6.36071 51.75371, 6.36116 51.75367...\n-1.000000e+12\n\n\n3529\n6.509667\n51.674094\n23261000211\n17893.641182\n89\n11.000000\n0.041548\n404.123932\n5500.626216\n158919.468921\n...\n23261000231 23261000221\n23261000201\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.41422 51.71362, 6.41455 51.71344...\n-1.000000e+12\n\n\n3530\n6.608218\n51.634048\n23261000221\n1289.550762\n6\n12.100000\n0.000000\n127.000000\n4780.127500\n158732.593750\n...\n23261000274\n23261000211\n57 236 363 514\n4\n1\nRhine\nNaN\n0\nLINESTRING (6.60434 51.63966, 6.60457 51.63917...\n-1.000000e+12\n\n\n\n\n5 rows × 31 columns", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] + "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#overview", + "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#overview", + "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", + "section": "Overview", + "text": "Overview\nThis tutorial uses satellite data products to analyze the relationships between river height and land water equivalent thickness in the Amazon River estuary. Users can expand on these examples to also include sea surface salinity, sea surface temperature, and ocean color for example, for a more comprehensive exploration of the Amazon river basin’s estuary and coastal region. The contents are useful for the ocean, coastal and terrestrial hydrosphere disciplines, showcasing how to use on premises and Earthdata cloud datasets, existing Earthdata cloud services and functionalities, and Earthdata User Interface (UI) and Application Programming Interfaces (API).\n\nLearning objectives:\n\nSearch for land water equivalent (LWE) thickness (GRACE/GRACE-FO) and river discharge data (MEaSUREs Pre-SWOT)\nAccess LWE thickeness dataset in Zarr format from Earthdata Cloud (AWS) using the Harmony API (specifically the Zarr reformatted service)\nAccess discharge dataset from PODAAC on premise (server) data archive\nSubset both, plot and compare coincident data.\n\n\n\nDatasets\nThe tutorial uses a combination of cloud and on premises datasets: - JPL GRACE and GRACE-FO Mascon Ocean, Ice, and Hydrology Equivalent Water Height Coastal Resolution Improvement (CRI) Filtered Release 06 Version 02 - Provides land water equivalent (LWE) thickness for observing seasonal changes in water storage around the river. When discharge is high, the change in water storage will increase, pointing to a wet season. Source data are from GRACE and GRACE-FO. - Pre SWOT Hydrology GRRATS Daily River Heights and Storage Version 2 - Provides virtual gauges to stand in for discharge data from Surface Water and Ocean Topography (SWOT). MEaSUREs contains river height products, not discharge, but river height is directly related to discharge and thus will act as a good substitute. Data were produced for the Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program." }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#visualize-mean-discharge-on-a-map", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html#visualize-mean-discharge-on-a-map", - "title": "Visualizing discharge in the SWORD of Science (SoS)", - "section": "Visualize mean discharge on a map", - "text": "Visualize mean discharge on a map\nOnce the mean discharge has been calculated and the SWORD topology data has been read in, you can now map the discharge!\n\n# Create map\nmax_x = np.median(gdf[\"x\"])\nmax_y = np.median(gdf[\"y\"])\nm = folium.Map([max_y, max_x], zoom_start=10, tiles=\"cartodb positron\")\n\n\n# Create a color map\nmin_d = np.min(gdf[\"discharge\"])\nmax_d = np.max(gdf[\"discharge\"])\ncolor_map = cm.LinearColormap([\"black\", \"red\", \"yellow\", \"green\"], vmin=min_d, vmax=max_d)\ncolor_map.add_to(m)\ncolor_map\n\n-999999999999.0-833333330862.7-666666661726.3-499999992590.0-333333323453.6-166666654317.314819.086566983768\n\n\n\n# Create a tool tip to display reach identifier and discharge values\ntooltip = folium.GeoJsonTooltip(\n fields=[\"reach_id\", \"discharge\"],\n aliases=[\"Reach Identifier:\", \"Mean Discharge:\"],\n sticky=False,\n labels=True,\n style=\"\"\"\n background-color: #F0EFEF;\n border: 2px solid black;\n border-radius: 3px;\n box-shadow: 3px;\n \"\"\",\n max_width=800\n)\n\n\n# Visualize mean discharge\nfolium.GeoJson(\n gdf,\n style_function=lambda feature: { \n \"color\": color_map(feature[\"properties\"][\"discharge\"]),\n \"weight\": 3,\n },\n tooltip=tooltip\n).add_to(m)\nm\n\nMake this Notebook Trusted to load map: File -> Trust Notebook\n\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Visualizing river discharge" - ] + "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#requirements", + "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#requirements", + "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", + "section": "Requirements", + "text": "Requirements\nThis notebook was developed to run in the AWS cloud (us-west-2 region), next to the Earthdata Cloud (PO.DAAC) data holdings, to leverage cloud optimized data formats (e.g. Zarr) and the Earthdata Harmony API, specifically the Zarr refomrating service. For more informaion on Harmony, please see https://harmony.earthdata.nasa.gov/ .\n\nBefore you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\nIn this notebook, we will be calling the authentication in the below cell, a work around if you do not yet have a netrc file.\nThis notebook was developed in Python 3.6.\n\nfrom urllib import request\nfrom http.cookiejar import CookieJar\nfrom getpass import getpass\nimport netrc\nfrom platform import system\nfrom os.path import join, isfile, basename, abspath, expanduser\n\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n \nsetup_earthdata_login_auth('urs.earthdata.nasa.gov')\n\nPlease provide your Earthdata Login credentials for access.\nYour info will only be passed to urs.earthdata.nasa.gov and will not be exposed in Jupyter.\n\n\nUsername: nickles\nPassword: ···········\n\n\n\nimport time\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nfrom urllib import request\nfrom urllib.request import urlopen\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\nimport cartopy.crs as ccrs\nimport cartopy\nimport zarr\nimport s3fs\nfrom IPython.display import HTML\nfrom json import dumps, loads\n\n\n\nEndpoints\nSet a few endpoints for use during the remainder of the workflow:\n\ncmr = \"cmr.earthdata.nasa.gov\"\nurs = \"urs.earthdata.nasa.gov\"\nharmony = \"harmony.earthdata.nasa.gov\"\n\ncmr, urs, harmony\n\n('cmr.earthdata.nasa.gov',\n 'urs.earthdata.nasa.gov',\n 'harmony.earthdata.nasa.gov')" }, { - "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#import-packages", - "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#import-packages", - "title": "Hydrocron API: SWOT Time Series Examples", - "section": "Import Packages", - "text": "Import Packages\n\nimport dask\nimport dask.dataframe as dd\nfrom dask.distributed import Client\nimport hvplot.dask\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport pprint\nimport requests\n\nimport datetime\nfrom io import StringIO", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Hydrocron Time Series" - ] + "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#cloud-data-from-jpl-grace-and-grace-fo-mascon", + "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#cloud-data-from-jpl-grace-and-grace-fo-mascon", + "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", + "section": "Cloud data from JPL GRACE and GRACE-FO Mascon", + "text": "Cloud data from JPL GRACE and GRACE-FO Mascon\n\n\n\ngrace mascon\n\n\nJPL GRACE and GRACE-FO Mascon Ocean, Ice, and Hydrology Equivalent Water Height Coastal Resolution Improvement (CRI) Filtered Release 06 Version 02\nThis dataset contains gridded monthly global water storage/height anomalies relative to a time-mean, derived from GRACE and GRACE-FO and processed at JPL using the Mascon approach (Version2/RL06). These data are provided in a single data file in netCDF format, and can be used for analysis for ocean, ice, and hydrology phenomena. This version of the data employs a Coastal Resolution Improvement (CRI) filter that reduces signal leakage errors across coastlines. The water storage/height anomalies are given in equivalent water thickness units (cm). The solution provided here is derived from solving for monthly gravity field variations in terms of geolocated spherical cap mass concentration functions, rather than global spherical harmonic coefficients. Additionally, realistic geophysical information is introduced during the solution inversion to intrinsically remove correlated error. Thus, these Mascon grids do not need to be destriped or smoothed, like traditional spherical harmonic gravity solutions. The complete Mascon solution consists of 4,551 relatively independent estimates of surface mass change that have been derived using an equal-area 3-degree grid of individual mascons. A subset of these individual mascons span coastlines, and contain mixed land and ocean mass change signals.\nFor more information, please visit https://grace.jpl.nasa.gov/data/get-data/jpl_global_mascons/.\nFor a detailed description on the Mascon solution, including the mathematical derivation, implementation of geophysical constraints, and solution validation, please see Watkins et al., 2015, doi: 10.1002/2014JB011547. For a detailed description of the CRI filter implementation, please see Wiese et al., 2016, doi: 10.1002/2016WR019344.\n\nMetadata\nData from the TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2 dataset can be obtained from AWS S3. Use its ShortName to retrieve the collection metadata from CMR:\n\ngrace_ShortName = \"TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2\"\ngrace_ShortName\n\n'TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2'\n\n\n\nCollection (dataset)\nGet the UMM Collection metadata using requests.get:\n\nr = requests.get(url=f\"https://{cmr}/search/collections.umm_json\", \n params={'provider': \"POCLOUD\", \n 'ShortName': grace_ShortName})\n\ngrace_coll = r.json()\ngrace_coll['hits']\n\n1\n\n\nThere should be only one result. Select and print its CMR Search metadata:\n\ngrace_coll_meta = grace_coll['items'][0]['meta']\ngrace_coll_meta\n\n{'revision-id': 21,\n 'deleted': False,\n 'format': 'application/vnd.nasa.cmr.umm+json',\n 'provider-id': 'POCLOUD',\n 'user-id': 'chen5510',\n 'has-formats': True,\n 'associations': {'variables': ['V2079350316-POCLOUD',\n 'V2079362050-POCLOUD',\n 'V2112016640-POCLOUD',\n 'V2112016643-POCLOUD',\n 'V2112016651-POCLOUD',\n 'V2112016653-POCLOUD',\n 'V2112016655-POCLOUD',\n 'V2112016657-POCLOUD'],\n 'services': ['S2004184019-POCLOUD'],\n 'tools': ['TL2108419875-POCLOUD']},\n 's3-links': ['podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/',\n 'podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/'],\n 'has-spatial-subsetting': True,\n 'native-id': 'JPL+GRACE+and+GRACE-FO+Mascon+Ocean,+Ice,+and+Hydrology+Equivalent+Water+Height+Coastal+Resolution+Improvement+(CRI)+Filtered+Release+06+Version+02',\n 'has-transforms': False,\n 'has-variables': True,\n 'concept-id': 'C1938032626-POCLOUD',\n 'revision-date': '2022-09-30T20:16:20.101Z',\n 'has-temporal-subsetting': True,\n 'concept-type': 'collection'}\n\n\n\n\nGranule (file)\nGet the UMM Granule metadata using requests.get:\n\nr = requests.get(url=f\"https://{cmr}/search/granules.umm_json\", \n params={'provider': \"POCLOUD\", \n 'ShortName': grace_ShortName})\n\ngrace_gran = r.json()\ngrace_gran['hits']\n\n1\n\n\nAs you can see, one result was returned (one hit). Print the CMR Search metadata for the granule (meta):\n\ngrace_gran['items'][0]['meta']\n\n{'concept-type': 'granule',\n 'concept-id': 'G2435507181-POCLOUD',\n 'revision-id': 1,\n 'native-id': 'GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI',\n 'provider-id': 'POCLOUD',\n 'format': 'application/vnd.nasa.cmr.umm+json',\n 'revision-date': '2022-09-02T17:44:24.135Z'}\n\n\nThe other component in each result (from the list of items) is the UMM metadata, accessible from the umm key. Print the RelatedUrls metadata field for the granule:\n\ngrace_gran['items'][0]['umm']['RelatedUrls']\n\n[{'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Description': 'Download GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Type': 'GET DATA'},\n {'URL': 's3://podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc',\n 'Description': 'This link provides direct download access via S3 to the granule',\n 'Type': 'GET DATA VIA DIRECT ACCESS'},\n {'URL': 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Description': 'Download GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Type': 'EXTENDED METADATA'},\n {'URL': 's3://podaac-ops-cumulus-public/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc.md5',\n 'Description': 'This link provides direct download access via S3 to the granule',\n 'Type': 'EXTENDED METADATA'},\n {'URL': 'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'Description': 'api endpoint to retrieve temporary credentials valid for same-region direct s3 access',\n 'Type': 'VIEW RELATED INFORMATION'},\n {'URL': 'https://opendap.earthdata.nasa.gov/collections/C1938032626-POCLOUD/granules/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI',\n 'Type': 'USE SERVICE API',\n 'Subtype': 'OPENDAP DATA',\n 'Description': 'OPeNDAP request URL'}]\n\n\nWe want the URL corresponding to 'Type': 'GET DATA'. Select the URL from appropriate item in the list, then print:\n\ngrace_url = grace_gran['items'][0]['umm']['RelatedUrls'][0]['URL']\ngrace_url\n\n'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06_V2/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.nc'\n\n\nThen, to do a regular HTTPS download:\nr = requests.get(grace_url)\nwith open('tutorial7_data_GRACEFO.nc', 'wb') as f:\n f.write(r.content)\n\n!ncdump -h tutorial7_data_GRACEFO.nc\nBut we’ll use the Harmony API’s Zarr Reformatter service instead of downloading the entire granule. The zarr format will allow us to open and download/read just the data that we require for our Amazon Basin study area.\n\n\n\nRequest to Harmony API: Zarr Reformatter\nIf you have a jobID you’d like to re-visit instead of running this command again, modify the cell below to set the async_jobId then skip to Format and display the complete url to the Harmony API job:.\nIf you are running for the first time, proceed to the next cells to submit the harmony request.\n\n#async_jobId = \"dfefc536-768c-4db3-a7d2-c326e9253042\" # jobId belongs to dev. You wont have access.\nasync_jobId = None \n\nSee important usage note below if this is your first time submitting a request to the Zarr Reformatter service.\nThe Zarr Reformatter service operates on an input Collection concept-id (a CMR construct). The service will accept more user-friendly inputs (like a Collection ShortName) in future releases. Here’s how you identify the CMR concept-id for the JPL GRACE/GRACE-FO Mascon dataset:\n\ncollection_concept_id = grace_coll_meta['concept-id']\ncollection_concept_id\n\n'C1938032626-POCLOUD'\n\n\nMost of this next cell will only evaluate if there’s NOT a valid job identifier set to the async_jobId variable above. It submits the Harmony request, and prints the JSON response.\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection_id = Collection(collection_concept_id) \n\nrequest = Request(\n collection=collection_id,\n format='application/x-zarr'\n)\n\nrequest.is_valid()\n\nTrue\n\n\n\nif async_jobId is None:\n print(harmony_client.request_as_curl(request))\n async_jobId = harmony_client.submit(request)\n print(f'Job ID: {async_jobId}')\n print('\\n Waiting for the job to finish. . .\\n')\n response = harmony_client.result_json(async_jobId, show_progress=True)\n print(\"\\n. . .DONE!\")\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=9dd333f7ecce24b1bb77b97e8f6f7a12' -H 'User-Agent: python-requests/2.28.0 harmony-py/0.4.2 Linux/5.4.156-83.273.amzn2.x86_64 CPython/3.9.13' 'https://harmony.earthdata.nasa.gov/C1938032626-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-zarr'\nJob ID: 9c93ee8e-1b5d-4d65-bacd-a91070e0c44c\n\n Waiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\nQuery for the job status and links in case the request is still processing:\n\nwhile True:\n job_json = harmony_client.status(async_jobId)\n if job_json['status'] != 'running':\n break\n print(f\"# Job status is running. Progress is {job_json['progress']}. Trying again.\")\n time.sleep(5)\n\nlinks = []\nif job_json['status'] == 'successful' and job_json['progress'] == 100:\n print(\"# Job progress is 100%. Links to job outputs are displayed below:\")\n links = [link['href'] for link in response['links']]\n display(links)\nelse:\n print(job_json)\n\n# Job progress is 100%. Links to job outputs are displayed below:\n\n\n['https://harmony.earthdata.nasa.gov/stac/9c93ee8e-1b5d-4d65-bacd-a91070e0c44c/',\n 'https://harmony.earthdata.nasa.gov/cloud-access.sh',\n 'https://harmony.earthdata.nasa.gov/cloud-access',\n 's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/',\n 's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.zarr',\n 'https://harmony.earthdata.nasa.gov/jobs/9c93ee8e-1b5d-4d65-bacd-a91070e0c44c?linktype=https&page=1&limit=2000']\n\n\nAccess url for the output zarr file\nThe new zarr dataset is staged for us in an S3 bucket. The url is the second to last one in the list shown above.\nSelect the url and display below:\n\nzarr_url = links[-2]\nzarr_url\n\n's3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9298ce19-2552-4803-a812-a10cdcde55aa/GRCTellus.JPL.200204_202207.GLO.RL06M.MSCNv02CRI.zarr'\n\n\nAccess credentials for the output zarr file\nCredentials provided at the third and fourth urls in the list grant authenticated access to your staged S3 resources.\nGrab the credentials as a JSON string, load to a Python dictionary, and display their expiration date:\n\nfrom urllib import request\nfrom urllib.request import urlopen\n\nwith request.urlopen(f\"https://{harmony}/cloud-access\") as f:\n creds = loads(f.read())\n\ncreds['Expiration']\n\n'2022-11-08T07:42:41.000Z'\n\n\n\n\nOpen staged zarr file with s3fs\nWe use the AWS s3fs package to get metadata about the zarr data store and list its contents:\n\nzarr_fs = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\nzarr_store = zarr_fs.get_mapper(root=zarr_url, check=False)\nzarr_dataset = zarr.open(zarr_store)\n\nprint(zarr_dataset.tree())\n\n/\n ├── lat (360,) float64\n ├── lat_bounds (360, 2) float64\n ├── lon (720,) float64\n ├── lon_bounds (720, 2) float64\n ├── lwe_thickness (211, 360, 720) float64\n ├── time (211,) float64\n ├── time_bounds (211, 2) float64\n └── uncertainty (211, 360, 720) float64\n\n\nNow print metadata for the lwe_thickness variable:\n\nprint(zarr_dataset.lwe_thickness.info)\n\nName : /lwe_thickness\nType : zarr.core.Array\nData type : float64\nShape : (211, 360, 720)\nChunk shape : (125, 125, 125)\nOrder : C\nRead-only : False\nCompressor : Blosc(cname='lz4', clevel=5, shuffle=SHUFFLE, blocksize=0)\nStore type : zarr.storage.KVStore\nNo. bytes : 437529600 (417.3M)\nNo. bytes stored : 76942675 (73.4M)\nStorage ratio : 5.7\nChunks initialized : 36/36\n\n\n\n\n\nOpen staged zarr file with xarray\nHere’s the documentation for xarray’s zarr reader: http://xarray.pydata.org/en/stable/generated/xarray.open_zarr.html\nOpen the zarr dataset and print the dataset:\n\nds_GRACE = xr.open_dataset(zarr_store, engine=\"zarr\")\nprint(ds_GRACE)\n\nSubset by Latitude/Longitude\nOnce we have obtained all the data, to make processing quicker, we are going to subset datasets by latitude/longitude for the Amazon River estuary.\nOnce we have obtained the GRACE-FO data, we should spatial subset the data to the minimal area covering the Amazon River estuary. This will reduce processing load and reduce cloud costs for the user.\nMake a GRACE-FO subset and display the min, max of the lat and lon variables:\n\nsubset_GRACE = ds_GRACE.sel(lat=slice(-18, 10), lon=slice(275, 330))\nprint(subset_GRACE.lat.min().data, \n subset_GRACE.lat.max().data,\n subset_GRACE.lon.min().data,\n subset_GRACE.lon.max().data)\n\nSelect the variable for Land Water Equivalent Thickness (lwe_thickness)\nGrab the land water equivalent thickness variable from the GRACE subset:\n\nlwe = subset_GRACE.lwe_thickness\nprint(lwe)\n\n\n\nPlots\nWe will create an animation from sequential GRACE-FO plots over the Amazon Rainforest in the following cells. Define two functions to make the process a bit more convenient:\n\ndef setup_map(ax, pmap, ds_subset, x, y, var, t, cmap, levels, extent):\n title = str(pd.to_datetime(ds_subset.time[t].values))\n pmap.set_title(title, fontsize=14)\n pmap.coastlines()\n pmap.set_extent(extent)\n pmap.add_feature(cartopy.feature.RIVERS)\n variable_desired = var[t,:,:]\n cont = pmap.contourf(x, y, variable_desired, cmap=cmap, levels=levels, zorder=1)\n return cont\n\ndef animate_ts(framenumber, ax, pmap, ds_subset, x, y, var, t, cmap, levels, extent):\n cont = setup_map(ax, pmap, ds_subset, x, y, var, t + framenumber, cmap, levels, extent) \n return cont\n\nPlot the first timestep in the JPL GRACE/GRACE-FO Mascon time series:\n\n# Initialize a matplotlib plot object and add subplot:\nfig = plt.figure(figsize=[13,9]) \nax = fig.add_subplot(1, 1, 1)\n\n# Configure axes to display projected data using PlateCarree crs:\npmap = plt.axes(projection=ccrs.PlateCarree())\n\n# Get arrays of x and y to label the plot axes:\nx,y = np.meshgrid(subset_GRACE.lon, subset_GRACE.lat) \n\n# Set a few constants for plotting the GRACE-FO time series:\ntime_start = 168\ncmap_name = \"bwr_r\"\ncmap_levels = np.linspace(-100., 100., 14)\nmap_extent = [-85, -30, -16, 11]\n\n# Plot the first timestep: \ncont = setup_map(ax, pmap, subset_GRACE, x, y, lwe, time_start, cmap_name, cmap_levels, map_extent)\n\nfig.colorbar(cont, ticks=cmap_levels, orientation='horizontal', label='Land Water Equivalent Thickness (cm)')\n\nPlot all the 2019 timesteps sequentially to create an animation of land water equivalent thickness for the Amazon Rainforest territories:\n\nani = animation.FuncAnimation(fig, animate_ts, frames=range(0,12), fargs=(\n ax, pmap, subset_GRACE, x, y, lwe, time_start, cmap_name, cmap_levels, map_extent\n), interval=500)\n\nHTML(ani.to_html5_video())\n\nUser note: You will need to install ‘ffmpeg’ in the cmd prompt to save the .mpg to disk. Use the following command to install from the conda-forge channel:\nconda install -c conda-forge ffmpeg\nUncomment, run the next cell to save the animation to MP4:\n\n#ani.save(\"tutorial7_animation_GRACEFO.mp4\", writer=animation.FFMpegWriter())" }, { - "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#set-up-dask-workers-for-parallelization", - "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#set-up-dask-workers-for-parallelization", - "title": "Hydrocron API: SWOT Time Series Examples", - "section": "Set up Dask Workers for Parallelization", - "text": "Set up Dask Workers for Parallelization\n\nA note on Dask\nWe use Dask for the notebook as it aggregates the data into a Dask DataFrame which can then be used in a variety of ways to explore, visualize, and analyze the data and it optimizes these operations by preforming various tasks in parallel. See the Dask Documentation for more information.\nWe also recognize that it may be a bit complex to use for smaller queries and offer the recommedation below to set the number of workers n_workers to 1 which will run the operations on a single thread instead of parallel.\n\nclient = Client(n_workers=4) # Set to n workers for number of CPUs or parallel processes or set to 1 worker to run things on a single thread\nclient\n\n\n\n\n\n\n\n\nClient\n\nScheduler: tcp://127.0.0.1:63944\nDashboard: http://127.0.0.1:8787/status\n\nCluster\n\nWorkers: 4\nCores: 16\nMemory: 34.16 GB", - "crumbs": [ - "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Hydrocron Time Series" - ] + "objectID": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#on-prem-hydro-data-from-pre-swot-measures-program", + "href": "notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html#on-prem-hydro-data-from-pre-swot-measures-program", + "title": "Use Case: Study Amazon Estuaries with Data from the EOSDIS Cloud", + "section": "On-prem hydro data from Pre-SWOT MEaSUREs program", + "text": "On-prem hydro data from Pre-SWOT MEaSUREs program\nData from PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2 are not currently available on the cloud, but we can access via the PO.DAAC’s on-prem OPeNDAP service (Hyrax) instead.\n\nThe guidebook explains the details of the Pre-SWOT MEaSUREs data: https://podaac-tools.jpl.nasa.gov/drive/files/allData/preswot_hydrology/L2/rivers/docs/GRRATS_user_handbookV2.pdf\nAccess URL for PO.DAAC on-prem OPeNDAP service\nIdentify an appropriate OPeNDAP endpoint through the following steps:\n\nGo to the project/mission page on the PO.DAAC portal (e.g. for Pre-SWOT MEaSUREs: https://podaac.jpl.nasa.gov/MEaSUREs-Pre-SWOT)\nChoose the dataset of interest. Go to the “Data Access” tab of the corresponding dataset landing page, which should like the OPeNDAP access link (for compatible datasets, e.g. for the daily river heights from virtual stations: https://podaac-opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/).\nNavigate to the desired NetCDF file and copy the endpoint (e.g. for our Amazon Basin use case we choose the South America file: https://opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/South_America_Amazon1kmdaily.nc).\n\n\nOpen netCDF file with xarray\nOpen the netCDF dataset via OPeNDAP using xarray:\n\nds_MEaSUREs = xr.open_dataset('https://opendap.jpl.nasa.gov/opendap/allData/preswot_hydrology/L2/rivers/daily/South_America_Amazon1kmdaily.nc')\nprint(ds_MEaSUREs)\n\n<xarray.Dataset>\nDimensions: (X: 3311, Y: 3311, distance: 3311, time: 9469,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-08T15:20:40.665117184 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 ...\n lat (Y) float64 ...\n FD (distance) float64 ...\n height (distance, time) float64 ...\n sat (charlength) |S64 ...\n storage (distance, time) float64 ...\n LakeFlag (distance) float64 ...\n Storage_uncertainty (distance, time) float64 ...\n IceFlag (time) float64 ...\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: -0.6550700975069503\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 92.7681246287056\n geospatial_vertical_min: -3.563409518163376\n geospatial_vertical_units: m\n geospatial_vertical_positive: up\n\n\nOur desired variable is height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Amazon estuary. Time is between April 8, 1993 and April 20, 2019.\n\n\nPlot\nAmazon River heights for March 16, 2018\nPlot the river distances and associated heights on the map at time t=9069:\n\nfig = plt.figure(figsize=[13,9]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-85, -30, -20, 20])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()\n\n\n\n\n\n\n\n\nFor GRACE-FO, plotting lwe_thickness[107:179,34,69] indicates time, latitude, and longitude indices corresponding to the pixel for the time period 1/2019 to 12/2019 at lat/lon (-0.7, -50). For the 2019 year, measurements of LWE thickness followd expected patterns of high volume of water from the river output into the estuary.\n2011-2019 Seasonality Plots (WIP)\nFor GRACE-FO, plotting lwe_thickness[107:179,34,69] indicates time, latitude, and longitude indices corresponding to the pixel for the time period 8/2011 to 12/2019 at lat/lon (-0.7, -50).\n\n#plot variables associated with river\nfig, ax1 = plt.subplots(figsize=[12,7])\n#plot river height\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\n\n#plot LWE thickness on secondary axis\nax2 = ax1.twinx()\nax2.plot(subset_GRACE.time[107:179], subset_GRACE.lwe_thickness[107:179,34,69], color = 'darkorange')\n\nax1.set_xlabel('Date')\nax2.set_ylabel('Land Water Equivalent Thickness (cm)', color='darkorange')\nax1.set_ylabel('River Height (m)', color='darkblue')\nax2.legend(['GRACE-FO'], loc='upper right')\nax1.legend(['Pre-SWOT MEaSUREs'], loc='lower right')\n\nplt.title('Amazon Estuary, 2011-2019 Lat, Lon = (-0.7, -50)')\n\nplt.show()" }, { - "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#obtain-sword-reach-ids", - "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#obtain-sword-reach-ids", - "title": "Hydrocron API: SWOT Time Series Examples", - "section": "Obtain SWORD reach IDs", - "text": "Obtain SWORD reach IDs\nIn this section, we query the Feature Translation Service (FTS) to give us a list of river IDs from the SWOT River Database (SWORD). One river reach ID has the format CBBBBBRRRRT and a node ID has the format, CBBBBBRRRRNNNT where C stands for continent, B for basin, R for reach, N for node, and T for type. The first 6 digits of the id (CBBBBB) are the HydroBASINS Pfafstetter level 6 basin code, where the first digit represents one of nine continental regions (1 = Africa, 2 = Europe, 3 = Siberia, 4 = Asia, 5 = Oceania, 6 = South America, 7 = North America, 8 = Arctic, 9 = Greenland), and the remaining digits are nested basin levels 2–6. In this example, we search by the beginning of a SWORD ID (basin code). For example, ID 732520 represents multiple reaches along the Savannah River and its tributaries in Georgia, USA.\nThe query_fts function can query the Feature Translation Service for reach identifiers by river name, reach identifier, HUC, or region. In this notebook, the function is used to query the FTS for reach identifiers associated with the basin identifier, and can be altered to search via river name. You can query the FTS and use a combination of page_size and page_number parameters to retrieve all reach identifier results for a query.\n\n# Assign URLs to Variables for the APIs we use, FTS and Hydrocron\nFTS_URL = \"https://fts.podaac.earthdata.nasa.gov/v1\" \nHYDROCRON_URL = \"https://soto.podaac.earthdatacloud.nasa.gov/hydrocron/v1/timeseries\"\n\n# BASIN or RIVER to query FTS for\nBASIN_IDENTIFIER = \"732520\" # to search via basin ID, find within SWORD database\nRIVER_NAME = \"Rhine\" # to search via river name\n\n\ndef query_fts(query_url, params):\n \"\"\"Query Feature Translation Service (FTS) for reach identifers using the query_url parameter.\n\n Parameters\n ----------\n query_url: str - URL to use to query FTS\n params: dict - Dictionary of parameters to pass to query\n\n Returns\n -------\n dict of results: hits, page_size, page_number, reach_ids\n \"\"\"\n\n reaches = requests.get(query_url, params=params)\n reaches_json = reaches.json()\n\n hits = reaches_json['hits']\n if 'search on' in reaches_json.keys():\n page_size = reaches_json['search on']['page_size']\n page_number = reaches_json['search on']['page_number']\n else:\n page_size = 0\n page_number = 0\n\n return {\n \"hits\": hits,\n \"page_size\": page_size,\n \"page_number\": page_number,\n \"reach_ids\": [ item['reach_id'] for item in reaches_json['results'] ]\n }\n\n\n# Search by basin code\nquery_url = f\"{FTS_URL}/rivers/reach/{BASIN_IDENTIFIER}\"\nprint(f\"Searching by basin ...{query_url}\")\n\n# Search by river name\n# query_url = f\"{FTS_URL}/rivers/{RIVER_NAME}\" #if searching via river name instead\n# print(f\"Searching by river name ...{query_url}\")\n\npage_size = 100 # Set FTS to retrieve 100 results at a time\npage_number = 1 # Set FTS to retrieve the first page of results\nhits = 1 # Set hits to intial value to start while loop\nreach_ids = []\nwhile (page_size * page_number) != 0 and len(reach_ids) < hits:\n params = { \"page_size\": page_size, \"page_number\": page_number }\n results = query_fts(query_url, params)\n \n hits = results['hits']\n page_size = results['page_size']\n page_number = results['page_number'] + 1\n reach_ids.extend(results['reach_ids'])\n\n print(\"page_size: \", page_size, \", page_number: \", page_number - 1, \", hits: \", hits, \", # reach_ids: \", len(reach_ids))\n \nprint(\"Total number of reaches: \", len(reach_ids))\nreach_ids = list(set(reach_ids)) # Remove duplicates\nprint(\"Total number of non-duplicate reaches: \", len(reach_ids))\n\nSearching by basin ...https://fts.podaac.earthdata.nasa.gov/v1/rivers/reach/732520\npage_size: 100 , page_number: 1 , hits: 190 , # reach_ids: 100\npage_size: 100 , page_number: 2 , hits: 190 , # reach_ids: 190\nTotal number of reaches: 190\nTotal number of non-duplicate reaches: 190\n\n\nOnce you have a list of reach identifiers, you can query Hydrocron for SWOT time series data. For now, we will just pull the first 10 reaches we discovered.\n\nreach_ids = reach_ids[:10]\nlen(reach_ids)\n\n10", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#summary", + "href": "notebooks/meetings_workshops/arctic_2019.html#summary", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "Summary", + "text": "Summary\nHere, we compare salinity from the SMAP satellite and Saildrone in-situ measurements. Both datasets are located within the cloud.\n\nFollow along with the Data in Action story:\nBy the end of this notebook, you will have recreated a similar plot to the one featured in this Data-in-Action story:\nhttps://podaac.jpl.nasa.gov/DataAction-2021-10-05-Monitoring-Changes-in-the-Arctic-Using-Saildrone-SMAP-Satellite-and-Ocean-Models-Data\n\n\nShortnames of datasets used here:\nSMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5: https://podaac.jpl.nasa.gov/dataset/SMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5\nSAILDRONE_ARCTIC: https://podaac.jpl.nasa.gov/dataset/SAILDRONE_ARCTIC", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Hydrocron Time Series" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#query-hydrocron-for-time-series-data", - "href": "notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html#query-hydrocron-for-time-series-data", - "title": "Hydrocron API: SWOT Time Series Examples", - "section": "Query Hydrocron for time series data", - "text": "Query Hydrocron for time series data\n\nDask Delayed Function to Query in Parallel\nWe define a function that will query hydrocron and return a database of the time series data for the reaches identified. This is defined as a Dask delayed function with the @dask.delayed decorator so that we can query reaches in parallel and return a Dask Dataframe to use in our visualizations.\n\n@dask.delayed\ndef query_hydrocron(query_url, reach_id, start_time, end_time, fields, empty_df):\n \"\"\"Query Hydrocron for reach-level time series data.\n\n Parameters\n ----------\n query_url: str - URL to use to query FTS\n reach_id: str - String SWORD reach identifier\n start_time: str - String time to start query\n end_time: str - String time to end query\n fields: list - List of fields to return in query response\n empty_df: pandas.DataFrame that contains empty query results\n\n Returns\n -------\n pandas.DataFrame that contains query results\n \"\"\"\n\n params = {\n \"feature\": \"Reach\",\n \"feature_id\": reach_id,\n \"output\": \"csv\",\n \"start_time\": start_time,\n \"end_time\": end_time,\n \"fields\": fields\n }\n results = requests.get(query_url, params=params)\n if \"results\" in results.json().keys():\n results_csv = results.json()[\"results\"][\"csv\"]\n df = pd.read_csv(StringIO(results_csv))\n else:\n df = empty_df\n\n return df\n\n\n\nCreate the query for Hydrocron!\nAll parameter options are listed in the Hydrocron documentation: https://podaac.github.io/hydrocron/timeseries.html\n\n%%time\n# Create queries that return Pandas.DataFrame objects\nstart_time = \"2023-07-28T00:00:00Z\"\nend_time = \"2024-04-16T00:00:00Z\"\nfields = \"reach_id,time_str,wse\"\nresults = []\nfor reach in reach_ids:\n # Create an empty dataframe for cases where no data is returned for a reach identifier\n empty_df = pd.DataFrame({\n \"reach_id\": np.int64(reach),\n \"time_str\": datetime.datetime(1900, 1, 1).strftime(\"%Y-%m-%dT%H:%M:%S\"),\n \"wse\": -999999999999.0,\n \"wse_units\": \"m\"\n }, index=[0])\n results.append(query_hydrocron(HYDROCRON_URL, reach, start_time, end_time, fields, empty_df))\n\n# Load DataFrame results into dask.dataframe\nddf = dd.from_delayed(results)\nddf.head(n=20, npartitions=len(reach_ids))\n\nCPU times: user 444 ms, sys: 131 ms, total: 575 ms\nWall time: 10.7 s\n\n\n\n\n\n\n\n\n\nreach_id\ntime_str\nwse\nwse_units\n\n\n\n\n0\n73252000433\n2024-02-09T04:28:31Z\n1.004017e+02\nm\n\n\n1\n73252000433\n2024-02-09T15:17:26Z\n9.985260e+01\nm\n\n\n2\n73252000433\n2024-03-01T01:13:37Z\n1.272824e+02\nm\n\n\n3\n73252000433\n2024-03-01T12:02:32Z\n1.005151e+02\nm\n\n\n4\n73252000433\n2024-03-21T21:58:40Z\n1.103624e+02\nm\n\n\n5\n73252000433\n2024-04-11T18:43:45Z\n1.142618e+02\nm\n\n\n6\n73252000433\n2024-04-12T05:32:40Z\n1.006057e+02\nm\n\n\n0\n73252001533\n2024-02-09T04:28:41Z\n2.006382e+02\nm\n\n\n1\n73252001533\n2024-02-09T15:17:16Z\n2.007256e+02\nm\n\n\n2\n73252001533\n2024-03-01T01:13:47Z\n2.008445e+02\nm\n\n\n3\n73252001533\n2024-03-01T12:02:22Z\n2.016775e+02\nm\n\n\n4\n73252001533\n2024-03-21T21:58:50Z\n2.009672e+02\nm\n\n\n5\n73252001533\n2024-04-11T18:43:55Z\n2.008128e+02\nm\n\n\n6\n73252001533\n2024-04-12T05:32:30Z\n2.008465e+02\nm\n\n\n0\n73252001404\n1900-01-01T00:00:00\n-1.000000e+12\nm\n\n\n0\n73252001434\n2024-01-30T06:06:26Z\n-1.000000e+12\nm\n\n\n1\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n2\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n3\n73252001434\n2024-02-20T02:51:31Z\n-1.000000e+12\nm\n\n\n4\n73252001434\nno_data\n-1.000000e+12\nm\n\n\n\n\n\n\n\n\n# Remove fill values for missing observations\nddf = ddf.loc[(ddf[\"wse\"] != -999999999999.0)]\n\n# Convert time_str to datetime format\nddf.time_str = dd.to_datetime(ddf.time_str)\n\nddf.head(n=20, npartitions=len(reach_ids))\n\n\n\n\n\n\n\n\nreach_id\ntime_str\nwse\nwse_units\n\n\n\n\n0\n73252000433\n2024-02-09 04:28:31+00:00\n100.4017\nm\n\n\n1\n73252000433\n2024-02-09 15:17:26+00:00\n99.8526\nm\n\n\n2\n73252000433\n2024-03-01 01:13:37+00:00\n127.2824\nm\n\n\n3\n73252000433\n2024-03-01 12:02:32+00:00\n100.5151\nm\n\n\n4\n73252000433\n2024-03-21 21:58:40+00:00\n110.3624\nm\n\n\n5\n73252000433\n2024-04-11 18:43:45+00:00\n114.2618\nm\n\n\n6\n73252000433\n2024-04-12 05:32:40+00:00\n100.6057\nm\n\n\n0\n73252001533\n2024-02-09 04:28:41+00:00\n200.6382\nm\n\n\n1\n73252001533\n2024-02-09 15:17:16+00:00\n200.7256\nm\n\n\n2\n73252001533\n2024-03-01 01:13:47+00:00\n200.8445\nm\n\n\n3\n73252001533\n2024-03-01 12:02:22+00:00\n201.6775\nm\n\n\n4\n73252001533\n2024-03-21 21:58:50+00:00\n200.9672\nm\n\n\n5\n73252001533\n2024-04-11 18:43:55+00:00\n200.8128\nm\n\n\n6\n73252001533\n2024-04-12 05:32:30+00:00\n200.8465\nm\n\n\n0\n73252001695\n2024-01-29 06:05:14+00:00\n-0.2095\nm\n\n\n3\n73252001695\n2024-02-19 02:50:19+00:00\n-0.1801\nm\n\n\n4\n73252001695\n2024-02-19 13:40:15+00:00\n0.1047\nm\n\n\n6\n73252001695\n2024-03-10 23:35:22+00:00\n-0.0288\nm\n\n\n7\n73252001695\n2024-03-11 10:25:17+00:00\n0.2217\nm\n\n\n9\n73252001695\n2024-03-31 20:20:26+00:00\n-0.0407\nm\n\n\n\n\n\n\n\n\n# Plot results\nline_plot = ddf.hvplot(x=\"time_str\", y=\"wse\", by=\"reach_id\", kind=\"line\", persist=True)\nline_plot.opts(xrotation=90)\n\nscatter_plot = ddf.hvplot(x=\"time_str\", y=\"wse\", by=\"reach_id\", kind=\"scatter\", persist=True)\nline_plot * scatter_plot\n\n\n\n\n\n \n\n\n\n\n\nclient.close()", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#requirements", + "href": "notebooks/meetings_workshops/arctic_2019.html#requirements", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "Requirements", + "text": "Requirements\n\n1. Compute environment\nThis tutorial can only be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. netrc File\nYou will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\nImport Libraries\n\n# To access dataset using Earthaccess\nimport earthaccess\n\n# To access dataset without Earthaccess\nimport os\nimport s3fs\nimport requests\nimport glob\n\n# To open dataset\nimport xarray as xr\n\n# For plotting\nimport matplotlib.pyplot as plt\nimport cartopy\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Hydrocron Time Series" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#summary", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#summary", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Summary", - "text": "Summary\n\nLooking at discharge in the SoS\nIt can be helpful to plot the flow law parameter estimation (FLPE) algorithm discharge alongside the integrator (MOI) discharge produced for that algorithm PLUS overlapping in situ gauge data. Note that not all rivers have gauge data associated with them. In this notebook we will look at the steps to plot SoS discharge values produced from running the Confluence workflow alongside in situ gauge data gathered and stored in the priors.\n\n\nGranule structure (background)\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow in the cloud which enables quick data access and compute on SWOT data. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gage data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\nThe cloud-based workflow (“Confluence”) that produces the SoS will produce discharge parameter estimates which the SWOT mission will use to produce discharge. This discharge will be stored in the SWOT shapefiles as the official SWOT discharge. However, the Confluence workflow produces discharge time series alongside the discharge parameter estimates in order to preview what will eventually stored in the SWOT shapefiles. Users can reference the SoS for the latest discharge time series recognizing that the official SWOT discharge data product lives in the SWOT shapefiles.\nThe SoS is organized by continent following SWOT River Database (SWORD) structure and naming conventions. It is indexed on the same reach and node identifier dimensions found in SWORD. Time series data is stored by cycle and pass on an observation dimension.\nMore information is available in the SWOT-Confluence Github repository: * Documentation for priors * Documentation for results\nResults are organized into groups corresponding to modules in the SWOT-Confluence processing software. Modules are described in the Confluence Module Documentation.\nYou can explore the SoS further in this notebook: https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html\n\n\nLocate data for a river that has gauges\nWe will select the Ohio River as we know it has gauge data associated with it from the USGS but feel free to modify the constants below for your river of choice!\n\n\nTable of Gauge Agencies by Continent\nThe following list the continent with associated gauge agency and group name of the gauge agency as it is stored in the SoS.\n\n\n\n\n\n\n\n\nContinent\nGroup Name\nGauge Agency\n\n\n\n\nAfrica\nGRDC\nGlobal Runoff Data Centre\n\n\nAsia\nGRDC\nGlobal Runoff Data Centre\n\n\nAsia\nMLIT\nMinistry of Land, Infrastructure, Transport, Tourism\n\n\nEurope\nGRDC\nGlobal Runoff Data Centre\n\n\nEurope\nDEFRA\nDepartment of Environment Food & Rural Affairs\n\n\nEurope\nEAU\nHub’Eau France\n\n\nNorth America\nGRDC\nGlobal Runoff Data Centre\n\n\nNorth America\nUSGS\nUnited State Geological Survey\n\n\nNorth America\nWSC\nWater Survey Canada\n\n\nOceania\nGRDC\nGlobal Runoff Data Centre\n\n\nOceania\nABOM\nAustralian Government Bureau of Meteorology\n\n\nSouth America\nGRDC\nGlobal Runoff Data Centre\n\n\nSouth America\nDGA\nDireccion General de Aguas\n\n\nSouth America\nHidroweb\nHidroweb", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#smap-dataset", + "href": "notebooks/meetings_workshops/arctic_2019.html#smap-dataset", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "SMAP dataset", + "text": "SMAP dataset\nSearch for and open this dataset as an example of using Earthaccess\n\nauth = earthaccess.login(strategy=\"netrc\")\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 06/18/2023\nUsing .netrc file for EDL\n\n\n\nshort_name=\"SMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5\"\n\nresults = earthaccess.search_data(\n short_name=short_name,\n cloud_hosted=True,\n temporal=(\"2019-05-01T00:00:00\", \"2019-10-01T00:00:00\"),\n bounding_box=(-170,65,-160,71) # (west, south, east, north)\n)\n\nGranules found: 122\n\n\n\nds_sss = xr.open_mfdataset(earthaccess.open(results))\n\n Opening 122 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\nplot_west = -170\nplot_east = -160\nplot_south = 60\nplot_north = 75\n\nlat_bnds, lon_bnds = [plot_south, plot_north], [plot_west+360, plot_east+360] # Turn the longitudes in (-180,0) to (0,360)\nds_sss_subset_0 = ds_sss.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_sss_subset_0['latitude'] = ds_sss_subset_0.lat\nds_sss_subset_0['longitude'] = ds_sss_subset_0.lon-360\nds_sss_subset = ds_sss_subset_0.swap_dims({'lat':'latitude', 'lon':'longitude'})\nds_sss_subset\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 40, latitude: 60, time: 122,\n uncertainty_components: 9, iceflag_components: 3)\nCoordinates:\n lon (longitude) float32 190.1 190.4 ... 199.6 199.9\n lat (latitude) float32 60.12 60.38 60.62 ... 74.62 74.88\n * time (time) datetime64[ns] 2019-04-27T12:00:00 ... 201...\n * latitude (latitude) float32 60.12 60.38 60.62 ... 74.62 74.88\n * longitude (longitude) float32 -169.9 -169.6 ... -160.4 -160.1\nDimensions without coordinates: uncertainty_components, iceflag_components\nData variables: (12/19)\n nobs (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n nobs_RF (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n nobs_40km (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap_RF (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap_unc (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n ... ...\n fland (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n gice_est (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n surtep (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n winspd (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sea_ice_zones (time, latitude, longitude) int8 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n anc_sea_ice_flag (time, latitude, longitude, iceflag_components) int8 dask.array<chunksize=(1, 60, 40, 3), meta=np.ndarray>\nAttributes: (12/65)\n Conventions: CF-1.7, ACDD-1.3\n title: SMAP ocean surfac...\n version: V5.0 Validated Re...\n summary: The dataset conta...\n acknowledgement: Funded under Subc...\n processing_level: L3\n ... ...\n Source_of_SMAP_SSS_retrievals: T. Meissner, F. W...\n Source_of_ancillary_SST: Canada Meteorolog...\n Source_of_ancillary_CCMP_wind_speed: Mears, C. et al.,...\n Source_of_ancillary_AMSR2_sea_ice_flag_and_correction: Meissner, T. and ...\n Source_of_ancillary_land_mask: 1 km land/water m...\n Source_of_ancillary_reference_SSS_from_HYCOM: Hybrid Coordinate...xarray.DatasetDimensions:longitude: 40latitude: 60time: 122uncertainty_components: 9iceflag_components: 3Coordinates: (5)lon(longitude)float32190.1 190.4 190.6 ... 199.6 199.9standard_name :longitudeaxis :Xlong_name :center longitude of grid cellunits :degrees_eastvalid_min :0.0valid_max :360.0coverage_content_type :coordinatearray([190.125, 190.375, 190.625, 190.875, 191.125, 191.375, 191.625, 191.875,\n 192.125, 192.375, 192.625, 192.875, 193.125, 193.375, 193.625, 193.875,\n 194.125, 194.375, 194.625, 194.875, 195.125, 195.375, 195.625, 195.875,\n 196.125, 196.375, 196.625, 196.875, 197.125, 197.375, 197.625, 197.875,\n 198.125, 198.375, 198.625, 198.875, 199.125, 199.375, 199.625, 199.875],\n dtype=float32)lat(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)time(time)datetime64[ns]2019-04-27T12:00:00 ... 2019-10-...standard_name :timeaxis :Tlong_name :reference time of analyzed variable field corresponding to center of the product time intervalcoverage_content_type :coordinatearray(['2019-04-27T12:00:00.000000000', '2019-04-28T12:00:00.000000000',\n '2019-04-29T12:00:00.000000000', '2019-04-30T12:00:00.000000000',\n '2019-05-01T12:00:00.000000000', '2019-05-02T12:00:00.000000000',\n '2019-05-03T12:00:00.000000000', '2019-05-04T12:00:00.000000000',\n '2019-05-05T12:00:00.000000000', '2019-05-06T12:00:00.000000000',\n '2019-05-07T12:00:00.000000000', '2019-05-08T12:00:00.000000000',\n '2019-05-09T12:00:00.000000000', '2019-05-10T12:00:00.000000000',\n '2019-05-11T12:00:00.000000000', '2019-05-12T12:00:00.000000000',\n '2019-05-13T12:00:00.000000000', '2019-05-14T12:00:00.000000000',\n '2019-05-15T12:00:00.000000000', '2019-05-16T12:00:00.000000000',\n '2019-05-17T12:00:00.000000000', '2019-05-18T12:00:00.000000000',\n '2019-05-19T12:00:00.000000000', '2019-05-20T12:00:00.000000000',\n '2019-05-21T12:00:00.000000000', '2019-05-22T12:00:00.000000000',\n '2019-05-23T12:00:00.000000000', '2019-05-24T12:00:00.000000000',\n '2019-05-25T12:00:00.000000000', '2019-05-26T12:00:00.000000000',\n '2019-05-27T12:00:00.000000000', '2019-05-28T12:00:00.000000000',\n '2019-05-29T12:00:00.000000000', '2019-05-30T12:00:00.000000000',\n '2019-05-31T12:00:00.000000000', '2019-06-01T12:00:00.000000000',\n '2019-06-02T12:00:00.000000000', '2019-06-03T12:00:00.000000000',\n '2019-06-04T12:00:00.000000000', '2019-06-05T12:00:00.000000000',\n '2019-06-06T12:00:00.000000000', '2019-06-07T12:00:00.000000000',\n '2019-06-08T12:00:00.000000000', '2019-06-09T12:00:00.000000000',\n '2019-06-10T12:00:00.000000000', '2019-06-11T12:00:00.000000000',\n '2019-06-12T12:00:00.000000000', '2019-06-13T12:00:00.000000000',\n '2019-06-14T12:00:00.000000000', '2019-06-15T12:00:00.000000000',\n '2019-06-16T12:00:00.000000000', '2019-07-26T12:00:00.000000000',\n '2019-07-27T12:00:00.000000000', '2019-07-28T12:00:00.000000000',\n '2019-07-29T12:00:00.000000000', '2019-07-30T12:00:00.000000000',\n '2019-07-31T12:00:00.000000000', '2019-08-01T12:00:00.000000000',\n '2019-08-02T12:00:00.000000000', '2019-08-03T12:00:00.000000000',\n '2019-08-04T12:00:00.000000000', '2019-08-05T12:00:00.000000000',\n '2019-08-06T12:00:00.000000000', '2019-08-07T12:00:00.000000000',\n '2019-08-08T12:00:00.000000000', '2019-08-09T12:00:00.000000000',\n '2019-08-10T12:00:00.000000000', '2019-08-11T12:00:00.000000000',\n '2019-08-12T12:00:00.000000000', '2019-08-13T12:00:00.000000000',\n '2019-08-14T12:00:00.000000000', '2019-08-15T12:00:00.000000000',\n '2019-08-16T12:00:00.000000000', '2019-08-17T12:00:00.000000000',\n '2019-08-18T12:00:00.000000000', '2019-08-19T12:00:00.000000000',\n '2019-08-20T12:00:00.000000000', '2019-08-21T12:00:00.000000000',\n '2019-08-22T12:00:00.000000000', '2019-08-23T12:00:00.000000000',\n '2019-08-24T12:00:00.000000000', '2019-08-25T12:00:00.000000000',\n '2019-08-26T12:00:00.000000000', '2019-08-27T12:00:00.000000000',\n '2019-08-28T12:00:00.000000000', '2019-08-29T12:00:00.000000000',\n '2019-08-30T12:00:00.000000000', '2019-08-31T12:00:00.000000000',\n '2019-09-01T12:00:00.000000000', '2019-09-02T12:00:00.000000000',\n '2019-09-03T12:00:00.000000000', '2019-09-04T12:00:00.000000000',\n '2019-09-05T12:00:00.000000000', '2019-09-06T12:00:00.000000000',\n '2019-09-07T12:00:00.000000000', '2019-09-08T12:00:00.000000000',\n '2019-09-09T12:00:00.000000000', '2019-09-10T12:00:00.000000000',\n '2019-09-11T12:00:00.000000000', '2019-09-12T12:00:00.000000000',\n '2019-09-13T12:00:00.000000000', '2019-09-14T12:00:00.000000000',\n '2019-09-15T12:00:00.000000000', '2019-09-16T12:00:00.000000000',\n '2019-09-17T12:00:00.000000000', '2019-09-18T12:00:00.000000000',\n '2019-09-19T12:00:00.000000000', '2019-09-20T12:00:00.000000000',\n '2019-09-21T12:00:00.000000000', '2019-09-22T12:00:00.000000000',\n '2019-09-23T12:00:00.000000000', '2019-09-24T12:00:00.000000000',\n '2019-09-25T12:00:00.000000000', '2019-09-26T12:00:00.000000000',\n '2019-09-27T12:00:00.000000000', '2019-09-28T12:00:00.000000000',\n '2019-09-29T12:00:00.000000000', '2019-09-30T12:00:00.000000000',\n '2019-10-01T12:00:00.000000000', '2019-10-02T12:00:00.000000000',\n '2019-10-03T12:00:00.000000000', '2019-10-04T12:00:00.000000000'],\n dtype='datetime64[ns]')latitude(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)longitude(longitude)float32-169.9 -169.6 ... -160.4 -160.1array([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125], dtype=float32)Data variables: (19)nobs(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of SSS smoothed to approx 70km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nnobs_RF(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of rain filtered SSS smoothed to approx 70km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nnobs_40km(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of SSS at 40km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_RF(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Rain filtered SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_RF_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of rain filtered SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_unc_comp(time, uncertainty_components, latitude, longitude)float32dask.array<chunksize=(1, 9, 60, 40), meta=np.ndarray>long_name :formal uncertainty components of SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformationcomponents :1: ancillary wind speed random. 2: NEDT v-pol. 3: NEDT h-pol. 4: ancillary SST. 5: ancillary wind direction. 6: reflected galaxy. 7: land contamination. 8: sea ice contamination. 9: ancillary wind speed systematic.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.05 MiB\n84.38 kiB\n\n\nShape\n(122, 9, 60, 40)\n(1, 9, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 122 1 40 60 9\n\n\n\n\nsss_smap_40km(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_40km_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_40km_unc_comp(time, uncertainty_components, latitude, longitude)float32dask.array<chunksize=(1, 9, 60, 40), meta=np.ndarray>long_name :formal uncertainty components of SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformationcomponents :1: ancillary wind speed random. 2: NEDT v-pol. 3: NEDT h-pol. 4: ancillary SST. 5: ancillary wind direction. 6: reflected galaxy. 7: land contamination. 8: sea ice contamination. 9: ancillary wind speed systematic.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.05 MiB\n84.38 kiB\n\n\nShape\n(122, 9, 60, 40)\n(1, 9, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 122 1 40 60 9\n\n\n\n\nsss_ref(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Reference sea surface salinity from HYCOMstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :referenceInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\ngland(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :average land fraction weighted by antenna gainstandard_name :land_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nfland(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :average land fraction within 3dB contourstandard_name :land_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\ngice_est(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :estimated sea ice fraction weighted by antenna gainstandard_name :sea_ice_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsurtep(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>standard_name :sea_surface_temperaturelong_name :Ancillary sea surface temperature (from CMC)units :Kelvinvalid_min :0.0valid_max :313.15coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nwinspd(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>standard_name :wind_speedlong_name :Ancillary sea surface wind speed from CCMP NRT that is used in surface roughness correctionunits :m s-1valid_min :0.0valid_max :100.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsea_ice_zones(time, latitude, longitude)int8dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :sea-ice contamination zones at center daystandard_name :quality_flagunits :1coverage_content_type :qualityInformationflag_meaning :0: open ocean scene. no sea-ice contamination. 1: likely sea-ice contamination in SMAP antenna sidelobes. SSS retrieved. 2: likely sea-ice contamination in SMAP antenna sidelobes. SSS retrieved. 3: likely sea-ice contamination in SMAP antenna mainlobe. SSS retrieved. 4: likely sea-ice contamination in SMAP antenna mainlobe. SSS retrieved. 5: likely sea-ice contamination in SMAP antenna mainlobe. no SSS retrieved. 6: AMSR2 50-km footprint contains land. sea-ice check not reliable. no SSS retrieved if AMSR-2 AS-ECV V8.2 sea-ice flag set. 7: no or invalid AMSR2 observation. sea-ice check not possible. no SSS retrieved if climatological sea-ice flag set.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n285.94 kiB\n2.34 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nanc_sea_ice_flag(time, latitude, longitude, iceflag_components)int8dask.array<chunksize=(1, 60, 40, 3), meta=np.ndarray>long_name :ancillary sea-ice detection indicator at center daystandard_name :quality_flagunits :1coverage_content_type :qualityInformationflag_meaning :component 1 of anc_sea_ice_flag: climatological sea-ice flag. component 2 of anc_sea_ice_flag: sea-ice flag from AMSR2 RSS AS-ECV V8.2 3-day map. component 3 of anc_sea_ice_flag: sea-ice flag from Meissner and Manaster.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n857.81 kiB\n7.03 kiB\n\n\nShape\n(122, 60, 40, 3)\n(1, 60, 40, 3)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 122 1 3 40 60\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-04-27 12:00:00', '2019-04-28 12:00:00',\n '2019-04-29 12:00:00', '2019-04-30 12:00:00',\n '2019-05-01 12:00:00', '2019-05-02 12:00:00',\n '2019-05-03 12:00:00', '2019-05-04 12:00:00',\n '2019-05-05 12:00:00', '2019-05-06 12:00:00',\n ...\n '2019-09-25 12:00:00', '2019-09-26 12:00:00',\n '2019-09-27 12:00:00', '2019-09-28 12:00:00',\n '2019-09-29 12:00:00', '2019-09-30 12:00:00',\n '2019-10-01 12:00:00', '2019-10-02 12:00:00',\n '2019-10-03 12:00:00', '2019-10-04 12:00:00'],\n dtype='datetime64[ns]', name='time', length=122, freq=None))latitudePandasIndexPandasIndex(Index([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875],\n dtype='float32', name='latitude'))longitudePandasIndexPandasIndex(Index([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125],\n dtype='float32', name='longitude'))Attributes: (65)Conventions :CF-1.7, ACDD-1.3title :SMAP ocean surface salinityversion :V5.0 Validated Releasesummary :The dataset contains the Level 3 8-day running averages of the NASA/RSS Version 5.0 SMAP Salinity Retrieval Algorithm. It includes all necessary ancillary data and the results of all intermediate steps. The data are gridded on a regular 0.25 deg Earth grid. For details see the Release Notes at https://www.remss.com/missions/smap/salinity/.acknowledgement :Funded under Subcontract No.1664013 between JPL and RSS: Production System for NASA Ocean Salinity Science Team (OSST).processing_level :L3resolution :Spatial resolution: approx 70kmhistory :created by T. Meissnerdate_created :2022-03-29 T12:02:30-0700date_modified :2022-03-29 T12:02:30-0700date_issued :2022-03-29 T12:02:30-0700date_metadata_modified :2022-03-29 T12:02:30-0700institution :Remote Sensing Systems, Santa Rosa, CA, USAsource :RSS SMAP-SSS v5.0 algorithmplatform :SMAPinstrument :SMAP radiometerproject :Production System for NASA Ocean Salinity Science Team (OSST)keywords :SURFACE SALINITY, SALINITY, SMAP, NASA, RSSkeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :CF Standard Name Table v78license :Nonecreator_name :Thomas Meissner, Remote Sensing Systemscreator_email :meissner@remss.comcreator_url :http://www.remss.com/missions/smappublisher_name :Thomas Meissner, Frank Wentz, Andrew Manaster, Richard Lindsley, Marty Brewer, Michael Densberger, Remote Sensing Systemspublisher_email :meissner@remss.compublisher_url :http://www.remss.com/missions/smapid :10.5067/SMP50-3SPCSnaming_authority :gov.nasa.earthdatadataset_citation_authors :T. Meissner, F. Wentz, A. Manaster, R. Lindsley, M. Brewer, M. Densbergerdataset_citation_year :2022dataset_citation_product :Remote Sensing Systems SMAP Level 3 Sea Surface Salinity Standard Mapped Image 8day runningdataset_citation_version :V5.0 Validated Releasedataset_citation_institution :Remote Sensing Systems, Santa Rosa, CA, USAdataset_citation_url :Available online at www.remss.com/missions/smapnetCDF_version_id :4comment :Major changes in V5.0: 1. sea-ice flag: based on AMSR-2 surface emissivties and discriminant analysis. 2. sea-ice correction included. 3. formal uncertainty estimates added.references :1. V5.0 Release Notes at https://www.remss.com/missions/smap/salinity/ 2. Meissner, T.; Wentz, F.J.; Le Vine, D.M. The Salinity Retrieval Algorithms for the NASA Aquarius Version 5 and SMAP Version 3 Releases. Remote Sens. 2018, 10, 1121. https://doi.org/10.3390/rs10071121 3. Meissner, T.; Manaster, A. SMAP Salinity Retrievals near the Sea-Ice Edge Using Multi-Channel AMSR2 Brightness Temperatures. Remote Sens. 2021, 13, 5120. https://doi.org/10.3390/rs13245120year_of_observation :2019center_day_of_observation :117first_orbit :22566last_orbit :22682time_coverage_start :2019-04-23T12:00:00Ztime_coverage_end :2019-05-01T12:00:00Ztime_coverage_duration :P8Dtime_coverage_resolution :P8Dcdm_data_type :gridgeospatial_bounds :2Dgeospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lat_resolution :0.25geospatial_lat_units :degrees_northgeospatial_lon_min :0.0geospatial_lon_max :360.0geospatial_lon_resolution :0.25geospatial_lon_units :degrees_eastgeospatial_bounds_vertical_crs :EPSG:5831geospatial_vertical_min :0geospatial_vertical_max :0Source_of_SMAP_SSS_retrievals :T. Meissner, F. Wentz, A. Manaster, R. Lindsley, M. Brewer, M. Densberger, Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 5.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA doi: 10.5067/SMP50-2SOCS www.remss.com/missions/smap.Source_of_ancillary_SST :Canada Meteorological Center. 2016.GHRSST Level 4 CMC0.1deg Global Foundation Sea Surface Temperature Analysis (GDS version 2). Ver.3.3.doi: 10.5067/GHCMC-4FM03 http://dx.doi.org/10.5067/GHCMC-4FM03.Source_of_ancillary_CCMP_wind_speed :Mears, C. et al., 2018.Remote Sensing Systems CCMP NRT V2.0 wind speed and direction. Remote Sensing Systems, Santa Rosa, CA.Source_of_ancillary_AMSR2_sea_ice_flag_and_correction :Meissner, T. and A. Manaster, 2021. SMAP Salinity Retrievals near the Sea-Ice Edge Using Multi-Channel AMSR2 Brightness Temperatures. Remote Sens. 2021, 13, 5120. https://doi.org/10.3390/rs13245120.Source_of_ancillary_land_mask :1 km land/water mask from OCEAN DISCIPLINE PROCESSING SYSTEM (ODPS) based on World Vector Shoreline (WVS)database and World Data Bank. courtesy of Fred Patt, Goddard Space Flight Center, frederick.s.patt@nasa.gov.Source_of_ancillary_reference_SSS_from_HYCOM :Hybrid Coordinate Ocean Model, GLBa0.08/expt_90.9, Top layer salinity. Available at www.hycom.org.\n\n\n\nsubset_mean_values = ds_sss_subset.sss_smap.mean(dim = 'time', skipna = True)\nsubset_mean_values\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'sss_smap' (latitude: 60, longitude: 40)>\ndask.array<mean_agg-aggregate, shape=(60, 40), dtype=float32, chunksize=(60, 40), chunktype=numpy.ndarray>\nCoordinates:\n lon (longitude) float32 190.1 190.4 190.6 190.9 ... 199.4 199.6 199.9\n lat (latitude) float32 60.12 60.38 60.62 60.88 ... 74.38 74.62 74.88\n * latitude (latitude) float32 60.12 60.38 60.62 60.88 ... 74.38 74.62 74.88\n * longitude (longitude) float32 -169.9 -169.6 -169.4 ... -160.6 -160.4 -160.1xarray.DataArray'sss_smap'latitude: 60longitude: 40dask.array<chunksize=(60, 40), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.38 kiB\n9.38 kiB\n\n\nShape\n(60, 40)\n(60, 40)\n\n\nDask graph\n1 chunks in 373 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60\n\n\n\n\nCoordinates: (4)lon(longitude)float32190.1 190.4 190.6 ... 199.6 199.9standard_name :longitudeaxis :Xlong_name :center longitude of grid cellunits :degrees_eastvalid_min :0.0valid_max :360.0coverage_content_type :coordinatearray([190.125, 190.375, 190.625, 190.875, 191.125, 191.375, 191.625, 191.875,\n 192.125, 192.375, 192.625, 192.875, 193.125, 193.375, 193.625, 193.875,\n 194.125, 194.375, 194.625, 194.875, 195.125, 195.375, 195.625, 195.875,\n 196.125, 196.375, 196.625, 196.875, 197.125, 197.375, 197.625, 197.875,\n 198.125, 198.375, 198.625, 198.875, 199.125, 199.375, 199.625, 199.875],\n dtype=float32)lat(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)latitude(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)longitude(longitude)float32-169.9 -169.6 ... -160.4 -160.1array([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125], dtype=float32)Indexes: (2)latitudePandasIndexPandasIndex(Index([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875],\n dtype='float32', name='latitude'))longitudePandasIndexPandasIndex(Index([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125],\n dtype='float32', name='longitude'))Attributes: (0)", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#requirements", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#requirements", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#saildrone-dataset", + "href": "notebooks/meetings_workshops/arctic_2019.html#saildrone-dataset", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "Saildrone dataset", + "text": "Saildrone dataset\nAccessing this dataset as an example of using s3fs\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\n\nbucket = os.path.join('podaac-ops-cumulus-protected/','SAILDRONE_ARCTIC','saildrone-*-1_minutes-*.nc')\nsd_files = fs_s3.glob(bucket)\nsaildrone_files= [fs_s3.open(file) for file in sorted(sd_files)]\nlen(saildrone_files)\n\n2\n\n\n\nsd6 = xr.open_dataset(saildrone_files[0])\nsd7 = xr.open_dataset(saildrone_files[1])\nsd7\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (trajectory: 1, obs: 215731)\nCoordinates:\n latitude (trajectory, obs) float64 ...\n longitude (trajectory, obs) float64 ...\n time (trajectory, obs) datetime64[ns] ...\n * trajectory (trajectory) float32 1.037e+03\nDimensions without coordinates: obs\nData variables: (12/79)\n SOG (trajectory, obs) float64 ...\n SOG_FILTERED_MEAN (trajectory, obs) float64 ...\n SOG_FILTERED_STDDEV (trajectory, obs) float64 ...\n SOG_FILTERED_MAX (trajectory, obs) float64 ...\n SOG_FILTERED_MIN (trajectory, obs) float64 ...\n COG (trajectory, obs) float64 ...\n ... ...\n TEMP_O2_RBR_MEAN (trajectory, obs) float64 ...\n TEMP_O2_RBR_STDDEV (trajectory, obs) float64 ...\n CHLOR_WETLABS_MEAN (trajectory, obs) float64 ...\n CHLOR_WETLABS_STDDEV (trajectory, obs) float64 ...\n CHLOR_RBR_MEAN (trajectory, obs) float64 ...\n CHLOR_RBR_STDDEV (trajectory, obs) float64 ...\nAttributes: (12/45)\n title: Arctic NASA MISST 2019 Mission\n summary: Saildrone surface observational data for the N...\n ncei_template_version: NCEI_NetCDF_Trajectory_Template_v2.0\n Conventions: CF-1.6, ACDD-1.3\n netcdf_version: 4.6.3\n featureType: trajectory\n ... ...\n keywords_vocabulary: NASA/GCMD\n publisher_name: Saildrone\n publisher_url: www.saildrone.com\n publisher_email: support@saildrone.com\n acknowledgment: Saildrone. 2019. Saildrone Arctic field campai...\n processing_level: Level 2xarray.DatasetDimensions:trajectory: 1obs: 215731Coordinates: (4)latitude(trajectory, obs)float64...standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]longitude(trajectory, obs)float64...standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]time(trajectory, obs)datetime64[ns]...standard_name :timelong_name :time in secondsaxis :T[215731 values with dtype=datetime64[ns]]trajectory(trajectory)float321.037e+03long_name :Trajectory/Drone IDcf_role :trajectory_idcomment :A trajectory is a single deployment of a dronearray([1037.], dtype=float32)Data variables: (79)SOG(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over groundunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute meanunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute stddevunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MAX(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute maxunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MIN(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute minunits :m s-1[215731 values with dtype=float64]COG(trajectory, obs)float64...standard_name :platform_courselong_name :Course over groundunits :degree[215731 values with dtype=float64]COG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_courselong_name :Course over ground one minute meanunits :degree[215731 values with dtype=float64]COG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_courselong_name :Course over ground one minute stddevunits :degree[215731 values with dtype=float64]HDG(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle headingunits :degree[215731 values with dtype=float64]HDG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle heading one minute meanunits :degree[215731 values with dtype=float64]HDG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle heading one minute stddevunits :degree[215731 values with dtype=float64]ROLL_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute meanunits :degree[215731 values with dtype=float64]ROLL_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute stddevunits :degree[215731 values with dtype=float64]ROLL_FILTERED_PEAK(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute peakunits :degree[215731 values with dtype=float64]PITCH_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute meanunits :degree[215731 values with dtype=float64]PITCH_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute stddevunits :degree[215731 values with dtype=float64]PITCH_FILTERED_PEAK(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute peakunits :degree[215731 values with dtype=float64]HDG_WING(trajectory, obs)float64...standard_name :wing_yawlong_name :Wing headingunits :degree[215731 values with dtype=float64]WING_HDG_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_yaw_minute_meanlong_name :Wing heading one minute meanunits :degree[215731 values with dtype=float64]WING_HDG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_yaw_minute_rmslong_name :Wing heading one minute stddevunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_roll_minute_meanlong_name :Wing roll one minute meanunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_roll_minute_rmslong_name :Wing roll one minute stddevunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_PEAK(trajectory, obs)float64...standard_name :wing_roll_minute_maxlong_name :Wing roll one minute peakunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_pitch_minute_meanlong_name :Wing pitch one minute meanunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_pitch_minute_rmslong_name :Wing pitch one minute stddevunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_PEAK(trajectory, obs)float64...standard_name :wing_pitch_minute_maxlong_name :Wing pitch one minute peakunits :degree[215731 values with dtype=float64]WING_ANGLE(trajectory, obs)float64...standard_name :wing_anglelong_name :Wing angleunits :degree[215731 values with dtype=float64]UWND_MEAN(trajectory, obs)float64...standard_name :eastward_windlong_name :Eastward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]UWND_STDDEV(trajectory, obs)float64...standard_name :eastward_windlong_name :Eastward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]VWND_MEAN(trajectory, obs)float64...standard_name :northward_windlong_name :Northward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]VWND_STDDEV(trajectory, obs)float64...standard_name :northward_windlong_name :Northward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WWND_MEAN(trajectory, obs)float64...standard_name :downward_air_velocitylong_name :Downward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WWND_STDDEV(trajectory, obs)float64...standard_name :downward_air_velocitylong_name :Downward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]GUST_WND_MEAN(trajectory, obs)float64...standard_name :wind_speed_of_gustlong_name :Wind gust speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]GUST_WND_STDDEV(trajectory, obs)float64...standard_name :wind_speed_of_gustlong_name :Wind gust speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WIND_HEIGHT_MEAN(trajectory, obs)float64...standard_name :wind_measurement_height_filteredlong_name :Wind measurement heightunits :minstalled_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WIND_HEIGHT_STDDEV(trajectory, obs)float64...standard_name :wind_measurement_height_rmslong_name :Wind measurement height SDunits :minstalled_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]TEMP_AIR_MEAN(trajectory, obs)float64...standard_name :air_temperaturelong_name :Air temperatureunits :degrees_cinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_AIR_STDDEV(trajectory, obs)float64...standard_name :air_temperaturelong_name :Air temperature SDunits :degrees_cinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]RH_MEAN(trajectory, obs)float64...standard_name :relative_humiditylong_name :Relative humidityunits :percentinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]RH_STDDEV(trajectory, obs)float64...standard_name :relative_humiditylong_name :Relative humidity SDunits :percentinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]BARO_PRES_MEAN(trajectory, obs)float64...standard_name :air_pressurelong_name :Air pressureunits :hPainstalled_date :2019-04-09T22:03:51.977028Zdevice_name :Vaisala Barometer (5240536)serial_number :5240536last_calibrated :2018-01-03installed_height :0.2vendor_name :Vaisalamodel_name :PTB210model_product_page :http://www.vaisala.com/en/products/pressure/Pages/PTB210.aspxnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]BARO_PRES_STDDEV(trajectory, obs)float64...standard_name :air_pressurelong_name :Air pressure SDunits :hPainstalled_date :2019-04-09T22:03:51.977028Zdevice_name :Vaisala Barometer (5240536)serial_number :5240536last_calibrated :2018-01-03installed_height :0.2vendor_name :Vaisalamodel_name :PTB210model_product_page :http://www.vaisala.com/en/products/pressure/Pages/PTB210.aspxnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]PAR_AIR_MEAN(trajectory, obs)float64...standard_name :surface_downwelling_photosynthetic_photon_flux_in_airlong_name :Photosynthetically active radiation in airunits :micromol s-1 m-2installed_date :2019-04-09T18:07:44.339577Zdevice_name :LI-COR PAR (9658)serial_number :9658last_calibrated :2018-02-27installed_height :2.6vendor_name :LI-CORmodel_name :LI-192SAmodel_product_page :https://www.licor.com/env/products/light/quantum_underwater.htmlnominal_sampling_schedule :Always onupdate_period :1000.0[215731 values with dtype=float64]PAR_AIR_STDDEV(trajectory, obs)float64...standard_name :surface_downwelling_photosynthetic_photon_flux_in_airlong_name :Photosynthetically active radiation in air SDunits :micromol s-1 m-2installed_date :2019-04-09T18:07:44.339577Zdevice_name :LI-COR PAR (9658)serial_number :9658last_calibrated :2018-02-27installed_height :2.6vendor_name :LI-CORmodel_name :LI-192SAmodel_product_page :https://www.licor.com/env/products/light/quantum_underwater.htmlnominal_sampling_schedule :Always onupdate_period :1000.0[215731 values with dtype=float64]TEMP_IR_SKY_HULL_MEAN(trajectory, obs)float64...standard_name :sky_ir_thermo_temperature_filteredlong_name :Hull Sky IR Temperatureunits :degrees_cinstalled_date :2019-05-14T22:18:38.355856Zdevice_name :Heitronics Sky IR Pyrometer (02413)serial_number :02413installed_height :0.6vendor_name :Heitronicsmodel_name :CT09.10model_product_page :https://www.heitronics.com/en/infrarot-messtechnik/produkte/radiation-thermometers/compact-series/ct09-series/nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SKY_HULL_STDDEV(trajectory, obs)float64...standard_name :sky_ir_thermo_temperature_rmslong_name :Hull Sky IR Temperature SDunits :degrees_cinstalled_date :2019-05-14T22:18:38.355856Zdevice_name :Heitronics Sky IR Pyrometer (02413)serial_number :02413installed_height :0.6vendor_name :Heitronicsmodel_name :CT09.10model_product_page :https://www.heitronics.com/en/infrarot-messtechnik/produkte/radiation-thermometers/compact-series/ct09-series/nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_HULL_UNCOMP_MEAN(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Hull Sea IR Temperatureunits :degrees_cinstalled_date :2019-05-14T22:18:43.869843Zdevice_name :Heitronics Hull IR Pyrometer (12693)serial_number :12693last_calibrated :2018-05-16installed_height :0.6vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_HULL_UNCOMP_STDDEV(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Hull Sea IR Temperature SDunits :degrees_cinstalled_date :2019-05-14T22:18:43.869843Zdevice_name :Heitronics Hull IR Pyrometer (12693)serial_number :12693last_calibrated :2018-05-16installed_height :0.6vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_WING_UNCOMP_MEAN(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Wing Sea IR Temperatureunits :degrees_cinstalled_date :2019-04-09T18:19:51.135128Zdevice_name :Heitronics Wing IR Pyrometer (12605)serial_number :12605last_calibrated :2018-03-12installed_height :2.25vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_WING_UNCOMP_STDDEV(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Wing Sea IR Temperature SDunits :degrees_cinstalled_date :2019-04-09T18:19:51.135128Zdevice_name :Heitronics Wing IR Pyrometer (12605)serial_number :12605last_calibrated :2018-03-12installed_height :2.25vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]WAVE_DOMINANT_PERIOD(trajectory, obs)float64...standard_name :sea_surface_wave_period_at_variance_spectral_density_maximumlong_name :Dominant wave periodunits :sinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]WAVE_SIGNIFICANT_HEIGHT(trajectory, obs)float64...standard_name :sea_surface_wave_significant_heightlong_name :Significant wave heightunits :minstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]TEMP_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]SAL_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinityunits :1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]SAL_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinity SDunits :1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]COND_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivityunits :mS cm-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]COND_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivity SDunits :mS cm-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_CTD_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_CTD_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]SAL_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinityunits :1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]SAL_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinity SDunits :1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]COND_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivityunits :mS cm-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]COND_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivity SDunits :mS cm-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_CONC_SBE37_MEAN(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentrationunits :micromol L-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_CONC_SBE37_STDDEV(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentration SDunits :micromol L-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_SAT_SBE37_MEAN(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturationunits :percentinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_SAT_SBE37_STDDEV(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturation SDunits :percentinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_CONC_RBR_MEAN(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentrationunits :micromol L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_CONC_RBR_STDDEV(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentration SDunits :micromol L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_SAT_RBR_MEAN(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturationunits :percentinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_SAT_RBR_STDDEV(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturation SDunits :percentinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_O2_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_O2_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]CHLOR_WETLABS_MEAN(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentrationunits :microgram L-1installed_date :2019-04-19T17:16:02.129225Zdevice_name :WET Labs Fluorometer (5599)serial_number :5599last_calibrated :2019-04-02installed_height :-0.5vendor_name :WET Labsmodel_name :FLSmodel_product_page :http://www.seabird.com/eco-flnominal_sampling_schedule :12s on, 48s off, centered at :00update_period :1000.0[215731 values with dtype=float64]CHLOR_WETLABS_STDDEV(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentration SDunits :microgram L-1installed_date :2019-04-19T17:16:02.129225Zdevice_name :WET Labs Fluorometer (5599)serial_number :5599last_calibrated :2019-04-02installed_height :-0.5vendor_name :WET Labsmodel_name :FLSmodel_product_page :http://www.seabird.com/eco-flnominal_sampling_schedule :12s on, 48s off, centered at :00update_period :1000.0[215731 values with dtype=float64]CHLOR_RBR_MEAN(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentrationunits :microgram L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]CHLOR_RBR_STDDEV(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentration SDunits :microgram L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]Indexes: (1)trajectoryPandasIndexPandasIndex(Index([1037.0], dtype='float32', name='trajectory'))Attributes: (45)title :Arctic NASA MISST 2019 Missionsummary :Saildrone surface observational data for the NOPP NASA-funded Arctic MSST campaign, 5/14/2019-10/11/2019ncei_template_version :NCEI_NetCDF_Trajectory_Template_v2.0Conventions :CF-1.6, ACDD-1.3netcdf_version :4.6.3featureType :trajectorycdm_data_type :Trajectorystandard_name_vocabulary :CF Standard Name Table v58description :Saildrone NetCDF Formatcreator_name :Saildroneplatform :Saildroneinstitution :Saildronecreator_email :support@saildrone.comcreator_url :https://saildrone.com/date_created :2019-12-04T19:13:20.502874Ztime_coverage_start :2019-05-14T23:00:00.000Ztime_coverage_end :2019-10-11T18:30:00.000Ztime_coverage_resolution :PT1Mtime_coverage_duration :P149DT19H30M0Sarea :Bering and Chukchi Seasdata_mode :delayed-modedrone_id :1037id :75156naming_authority :saildrone.comuuid :9f27a3ef-b53a-4dac-af8c-f87677a2c28fproject :NASA Multi-Sensor Improved Sea Surface Temperature Projectsource :Saildronelicense :2019 CC-BY SAILDRONE Inc. All Rights Reserved. These Data and any resultant Product are the property of SAILDRONE. At SAILDRONE’s sole discretion, these Data may be used for research or educational activities only. You may not use, share or sell the Data for any other purpose including for commercial purposes, or alternatively, have any unauthorized third party use or sell the Data, either for any research, educational and/or commercial purpose(s), without the express prior consent of SAILDRONE.nodc_template_version :NODC_NetCDF_Trajectory_Template_v2.0wmo_id :4803915geospatial_lat_min :53.8444032geospatial_lat_max :75.4970304geospatial_lat_units :degrees_northgeospatial_lon_min :-168.7037952geospatial_lon_max :-146.129856geospatial_lon_units :degrees_easthistory :created post-cruise 1/2020product_version :v01.0keywords :Temperature, Salinity, Wind Vectors, Air Temperature, Humidity, Current Velocity, Saildrone, Arctic, Berring Sea, Chukchi Sea, NASA, NOAAkeywords_vocabulary :NASA/GCMDpublisher_name :Saildronepublisher_url :www.saildrone.compublisher_email :support@saildrone.comacknowledgment :Saildrone. 2019. Saildrone Arctic field campaign surface and ADCP measurements. Ver. 01.0. PO.DAAC, CA, USA. Dataset accessed [YYYY-MM-DD] at https://doi.org/10.5067/SDRON-NOPP0processing_level :Level 2", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#learning-objectives", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#learning-objectives", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nTo locate in situ gauge data stored in the SoS.\nTo locate overlap between in situ observations and times where discharge values were produced.\nPlot gauge data alongside river discharge.", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1036", + "href": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1036", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1036", + "text": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1036\n\nfig = plt.figure(figsize= (16,10))\n\nrows = 1\ncolumns = 2\nax = fig.add_subplot(rows, columns, 1, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns = subset_mean_values.plot.pcolormesh(add_colorbar = False)\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True) \nplt.title('SMAP, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\n\nax = fig.add_subplot(rows, columns, 2, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns6 = plt.scatter(sd6.longitude, sd6.latitude, s = 0.5, c = sd6.SAL_SBE37_MEAN, vmin = 25, vmax = 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True)\nplt.title('Saildrone vehicle 1036, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\nplt.savefig('salinity_comparison_sd1036.png')", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#import-packages", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#import-packages", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Import Packages", - "text": "Import Packages\n\nimport datetime\nimport pathlib\n\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\nimport earthaccess\nimport matplotlib.pyplot as plt\nimport netCDF4 as nc\nimport numpy as np\nimport pandas as pd", + "objectID": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1037", + "href": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1037", + "title": "Ocean Satellite and In-situ Comparison in the Cloud", + "section": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1037", + "text": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1037\n\nfig = plt.figure(figsize= (16,10))\n\nrows = 1\ncolumns = 2\nax = fig.add_subplot(rows, columns, 1, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns = subset_mean_values.plot.pcolormesh(add_colorbar=False)\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True) \nplt.title('SMAP, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\n\nax = fig.add_subplot(rows, columns, 2, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns6 = plt.scatter(sd7.longitude, sd7.latitude, s = 0.5, c = sd7.SAL_SBE37_MEAN, vmin = 25, vmax = 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True)\nplt.title('Saildrone vehicle 1037, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\nplt.savefig('salinity_comparison_sd1037.png')", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Science Data Stories", + "SSS Changes in the Arctic" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#authenticate", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#authenticate", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Authenticate", - "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n<earthaccess.auth.Auth at 0x31276f1d0>", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#set-start-and-end-dates", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#set-start-and-end-dates", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Set start and end dates", + "text": "Set start and end dates\n\nstart_date = \"1992-01-01\"\nend_date = \"2002-12-31\"\n\n# break it down into Year, Month, Day (and minutes and seconds if desired) \n# as inputs to harmony.py call using datetime()\nstart_year = 2002\nstart_month = 1\nstart_day = 1\n\nend_year = 2017\nend_month = 12\nend_day = 31", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#search-and-access-sos-data", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#search-and-access-sos-data", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Search and Access SoS data", - "text": "Search and Access SoS data\nLocate the SoS data of interest and then download for access.\n\n# Search and locate granules\ngranule_info = earthaccess.search_data(\n short_name=\"SWOT_L4_DAWG_SOS_DISCHARGE\",\n temporal=(\"2023-04-07\", \"2023-04-26\"),\n)\ngranule_info\n\nGranules found: 3\n\n\n[Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -21.794, 'SouthBoundingCoordinate': 25.382, 'EastBoundingCoordinate': 25.382, 'NorthBoundingCoordinate': 81.115}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-25T20:01:59.000Z', 'BeginningDateTime': '2023-04-07T22:49:35.000Z'}}\n Size(MB): 983.0999364852905\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -81.139, 'SouthBoundingCoordinate': -52, 'EastBoundingCoordinate': -52, 'NorthBoundingCoordinate': 11.097}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T12:04:55.000Z', 'BeginningDateTime': '2023-04-08T01:51:07.000Z'}}\n Size(MB): 1700.4334163665771\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc'],\n Collection: {'Version': '1', 'ShortName': 'SWOT_L4_DAWG_SOS_DISCHARGE'}\n Spatial coverage: {'HorizontalSpatialDomain': {'Geometry': {'BoundingRectangles': [{'WestBoundingCoordinate': -166.397, 'SouthBoundingCoordinate': 8.09, 'EastBoundingCoordinate': 8.09, 'NorthBoundingCoordinate': 82.311}]}}}\n Temporal coverage: {'RangeDateTime': {'EndingDateTime': '2023-04-26T13:28:35.000Z', 'BeginningDateTime': '2023-04-08T05:36:12.000Z'}}\n Size(MB): 1613.2776679992676\n Data: ['https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_results.nc', 'https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc']]\n\n\n\n# Enter a directory path to store downloaded data in\ndownloads_dir = pathlib.Path(\"data_downloads\")\ndownloads_dir.mkdir(parents=True, exist_ok=True)\n\n# Select a priors and results pair to explore\ndownload_links = [[link for link in earthaccess.results.DataGranule.data_links(granule)] for granule in granule_info]\nprint(\"Select a priors and results file to explore:\")\nfor downloads in download_links: \n for download in downloads:\n if \"priors\" in download: print(download)\n\nSelect a priors and results file to explore:\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/sa_sword_v15_SOS_unconstrained_0001_20240228T205034_priors.nc\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/na_sword_v15_SOS_unconstrained_0001_20240228T205032_priors.nc\n\n\n\n# Select Europe (\"eu\") priors file to work with\npriors_link = \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SWOT_L4_DAWG_SOS_DISCHARGE/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc\"\n\n# Select results\nresults_link = priors_link.replace(\"priors\", \"results\")\n\nearthaccess.download(priors_link, downloads_dir)\nearthaccess.download(results_link, downloads_dir)\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_priors.nc already downloaded\n\n\n\n\n\n\n\n\n\n\n\nFile eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc already downloaded\n\n\n\n\n\n\n\n\n['data_downloads/eu_sword_v15_SOS_unconstrained_0001_20240228T205029_results.nc']\n\n\n\n# Open downloaded files to access SoS granule data\npriors_download = priors_link.split('/')[-1]\nresults_download = results_link.split('/')[-1]\n\npriors = nc.Dataset(downloads_dir.joinpath(priors_download), format=\"NETCDF4\")\nresults = nc.Dataset(downloads_dir.joinpath(results_download), format=\"NETCDF4\")", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#spatial-bounds-region-of-interest-not-used", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#spatial-bounds-region-of-interest-not-used", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Spatial bounds (Region of Interest) – Not used", + "text": "Spatial bounds (Region of Interest) – Not used\n\nwesternmost_longitude = 100.\neasternmost_longitude = 150.\nnorthermost_latitude = 30.\nsouthernmost_latitude = 0.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-and-rive-discharge-data.", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-and-rive-discharge-data.", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate gauge and rive discharge data.", - "text": "Locate gauge and rive discharge data.\nWe can now locate gauge and river discharge data from the SoS using either the data read directly from S3 or downloaded to your local computer.\n\n# Constants\n\n# Select a river\nRIVER_NAME = \"Rhine\"\n\n# Select a discharge algorithm (hivdi, neobam, metroman, momma, sad, sic4dvar)\nDISCHARGE_ALGORITHM = \"hivdi\"\nDISCHARGE_VARIABLE = \"Q\"\n\n# Select a gauge agency\nGAUGE_AGENCY = \"EAU\"", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#setup-the-harmony-py-service-call-and-execute-a-request", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#setup-the-harmony-py-service-call-and-execute-a-request", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Setup the harmony-py service call and execute a request", + "text": "Setup the harmony-py service call and execute a request\n\n# using the the harmony.py service, set up the request and exectue it\necco_collection = Collection(id=ccid)\ntime_range = {'start': datetime(start_year, start_month, start_day), 'stop': datetime(end_year, end_month, end_day)}\nprint(time_range)\n\nharmony_client = Client(env=Environment.PROD)\n\n# in this example set concatentae to 'False' because the monthly input time steps vary slightly\n# (not always centered in the middle of month)\necco_request = Request(collection=ecco_collection, temporal=time_range, format='application/x-zarr', concatenate='False')\n\n# sumbit request and monitor job\necco_job_id = harmony_client.submit(ecco_request)\nprint('\\n Waiting for the job to finish. . .\\n')\necco_response = harmony_client.result_json(ecco_job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n{'start': datetime.datetime(2002, 1, 1, 0, 0), 'stop': datetime.datetime(2017, 12, 31, 0, 0)}\n\nWaiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\n\nYou can also wrap the creation of the Harmony request URL into one function. Shown here for legacy purposes (does not execute a Harmony request):\n\ndef get_harmony_url(ccid,start_date,end_date):\n \"\"\"\n Parameters:\n ===========\n ccid: string\n concept_id of the datset\n date_range: list\n [start_data, end_date] \n \n Return:\n =======\n url: the harmony URL used to perform the netcdf to zarr transformation\n \"\"\"\n \n base = f\"https://harmony.earthdata.nasa.gov/{ccid}\"\n hreq = f\"{base}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset\"\n rurl = f\"{hreq}?format=application/x-zarr\"\n\n #print(rurl)\n\n subs = '&'.join([f'subset=time(\"{start_date}T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")']) \n #subs = subs + '&' + '&'.join([f'subset=lat({southernmost_latitude}:{northermost_latitude})'])\n #subs = subs + '&' + '&'.join([f'subset=lon({westernmost_longitude}:{easternmost_longitude})'])\n\n rurl = f\"{rurl}&{subs}\"\n return rurl\n\nccid='C2129189405-POCLOUD'\nprint(get_harmony_url(ccid,start_date,end_date))\n\n# this is the way you would execute it\n# response = requests.get(url=rurl).json()\n\nhttps://harmony.earthdata.nasa.gov/C2129189405-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr&subset=time(\"1992-01-01T00:00:00.000Z\":\"2002-12-31T23:59:59.999Z\")", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-identifiers", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-identifiers", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate overlapping identifiers", - "text": "Locate overlapping identifiers\nLocate overlapping identifiers for reach and gauge data.\n\n# Locate overlapping reach identifier\nriver_names = results['reaches']['river_name'][:]\nriver_indexes = np.where(river_names == RIVER_NAME)\n\nriver_reach = results[\"reaches\"][\"reach_id\"][river_indexes]\nprint(f\"{RIVER_NAME} reach identifiers:\")\nprint(river_reach)\n\ngauge_reach = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_reach_id\"][:]\nprint(\"Gauge reach identifiers:\")\nprint(gauge_reach)\n\nreach_overlap = np.intersect1d(gauge_reach, river_reach)\nprint(\"Overlapping reaches:\")\nprint(reach_overlap)\n\n# Select the first reach\nreach_id = reach_overlap[0]\nprint(f\"Reach id selected: {reach_id}\")\n\nRhine reach identifiers:\n[23261000181 23261000191 23261000201 23261000211 23261000221 23261000231\n 23261000241 23261000274 23261000371 23261000381 23261000391 23261000401\n 23261000411 23261000421 23261000431 23261000441 23261000451 23261000461\n 23261000471 23261000481 23261000491 23261000501 23261000511 23261000521\n 23261000561 23261000571 23261000581 23261000621 23261000631 23261000641\n 23262000011 23263000011 23263000021 23263000031 23263000061 23263000071\n 23263000081 23263000091 23263000141 23263000151 23263000161 23263000211\n 23263000221 23263000231 23263000241 23263000251 23263000271 23263000281\n 23265000021 23265000031 23265000041 23265000051 23265000061 23267000011\n 23267000021 23267000031 23267000041 23267000051 23267000061 23267000071\n 23267000081 23267000094 23267000101 23267000111 23267000121 23267000131\n 23267000141 23267000154 23267000171 23267000181 23267000194 23267000214\n 23267000224 23267000231 23267000244 23267000304 23267000361 23267000371\n 23267000384 23267000391 23267000401 23267000414 23267000494 23267000501\n 23267000511 23267000524 23267000531 23267000541 23267000551 23267000561\n 23267000571 23267000584 23267000591 23267000604 23267000611 23267000624\n 23267000631 23267000644 23267000651 23267000664 23267000671 23267000684\n 23267000704 23267000711 23267000724 23267000731 23267000744 23269000024\n 23269000031 23269000051 23269000101 23269000114 23269000121 23269000134\n 23269000141 23269000214 23269000221 23269000234 23269000241 23269000254\n 23269000261 23269000271 23269000283 23269000293 23269000311 23269000323\n 23269000333 23269000343 23269000353 23269000371 23269000381 23269000714\n 23269000721 23269000734 23269000741 23269000754 23269000761 23269000774\n 23269000781 23269000794 23269000801 23269000814 23269000824 23269000831\n 23269000841 23269000941]\nGauge reach identifiers:\n[23267000501 23267000121 23267000121 23267000081 23267000081 23267000071\n 23262000901 23262000801 23262000801 23262000731 23262001444 23262001104\n 23262001061 23262001354 23262000551 23262000531 23262000511 23262000491\n 23262001394 23250801191 23250200011 23250600821 23250600484 23250600471\n 23250600441 23250600631 23250200441 23240600314 23240602811 23240600201\n 23240600261 23240600091 23240700491 23240700321 23240700181 23240700081\n 23240700021 23240500101 23240500101 23240600431 23240603204 23240400101\n 23240602381 23240602651 23240100201 23240900074 23240900151 23240700541\n 23240700464 23240400601 23240400491 23240400414 23240400291 23230500654\n 23230500401 23230500301 23230500081 23230400101 23230400101 23230200764\n 23230200744 23230200354 23230200331 23230200986 23230200434 23230200381\n 23230200965 23229000554 23229000211 23229000131 23229000521 23229000101\n 23229000431 23229000024 23228000341 23228000231 23228000151 23228000111\n 23228000091 23227000261 23227000231 23227000181 23227000181 23227000111\n 23227000101 23227000041 23227000011 23226000564 23226000461 23226000351\n 23226000321 23226000311 23226000031 23225000031 23224001551 23224001174\n 23224000821 23224000531 23224000391 23224000331 23224000121 23224000704\n 23224000661 23224000601 23224000601 23224000241 23224000861 23224000191\n 23224000021 23223000041 23222000351 23222000661 23222001144 23222000801\n 23222000011 23221000224 23219000444 23219000071 23214400931 23214400791\n 23214401114 23214400501 23214400111 23214400201 23214400151 23214400041\n 23214400013 23214900374 23214900361 23214900261 23214900224 23214900014\n 23214700141 23214700051 23214700011 23214600374 23214600144 23214300031\n 23214201131 23214200904 23214200691 23214200564 23214200531 23214200091\n 23214200011 23214100051 23214100031 23214100155 23216000611 23216000584\n 23216000561 23216000511 23216000501 23216000441 23216000421 23216000401\n 23216001061 23216001001 23216000721 23212001134 23212001081 23212001014\n 23212000701 23212000674 23212001366 23212000071 23212000051 23212000834\n 23212000364 23212000181 23212001345 23218000304 23218000381 23218000141\n 23218000121 23218000101 21602801794 21602800144 21602902191 21602902121\n 21602901924 21602901501 21602900954 21602700241 21602700121 21602700171\n 21602700011 21602602314 21602602351 21602601944 21602601393 21602601373\n 21602601363 21602600311 21602601251 21602601231 21602601231 21602601821\n 21602602381 21602600631 21602600011 21602300471 21602300441 21602300241\n 21602300774 21602300861 21602300664 21602300221 21602300131 21602300131\n 21602300351 21602100401 21602100264 21602100181 21602100144 21602100535\n 21602100535 21602400711 21602400761 21602400751 21602400744 21602401061\n 21602400221 21602400201 21602200354 21602200681 21602200204 21602200084\n 21603400261 21603400161 21603400141 21603400091 21603400064 21603400051\n 21603200231 21603200261 21603200191 21603300181 21603300154 21603300061\n 21601000171 21601000091 21601000013]\nOverlapping reaches:\n[23267000071 23267000081 23267000121 23267000501]\nReach id selected: 23267000071", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#run-2nd-harmony-netcdf-to-zarr-call", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#run-2nd-harmony-netcdf-to-zarr-call", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Run 2nd Harmony netCDF-to-Zarr call", + "text": "Run 2nd Harmony netCDF-to-Zarr call\n\nShortName = \"ECCO_L4_TEMP_SALINITY_05DEG_MONTHLY_V4R4\"\n\n# 1) Find new concept_id for this dataset\nresponse = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': ShortName,\n 'page_size': 1}\n)\n\nummc = response.json()['items'][0]\nccid = ummc['meta']['concept-id']\n\n# using the the harmony.py service, set up the request and exectue it\necco_collection = Collection(id=ccid)\ntime_range = {'start': datetime(start_year, start_month, start_day), 'stop': datetime(end_year, end_month, end_day)}\n\nharmony_client = Client(env=Environment.PROD)\n\n# in this example set concatentae to 'False' because the monthly input time steps vary slightly\n# (not always centered in the middle of month)\necco_request = Request(collection=ecco_collection, temporal=time_range, format='application/x-zarr', concatenate='False')\n\n# sumbit request and monitor job\necco_job_id = harmony_client.submit(ecco_request)\nprint('\\nWaiting for the job to finish. . .\\n')\necco_response = harmony_client.result_json(ecco_job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n\nWaiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-discharge-and-in-situ-observation-time", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-gauge-discharge-and-in-situ-observation-time", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate gauge discharge and in situ observation time", - "text": "Locate gauge discharge and in situ observation time\nLocate discharge and save the in situ observation time for the reach of interest.\n\n# Get reach index for gauge data\nreach_gauge_index = np.where(gauge_reach == reach_id)\n\n# Get discharge and filter out missing values\nmissing = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_q\"]._FillValue\ngauge_discharge = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_q\"][reach_gauge_index].filled()[0]\nnonmissing_indexes_g = np.where(gauge_discharge != missing)\ngauge_discharge = gauge_discharge[nonmissing_indexes_g]\nprint(f\"Number of gauge discharge values: {len(gauge_discharge)}.\")\n\n# Get time and filter out missing values\ngauge_time = priors[GAUGE_AGENCY][f\"{GAUGE_AGENCY}_qt\"][reach_gauge_index].filled().astype(int)[0]\ngauge_time = gauge_time[nonmissing_indexes_g]\nprint(f\"Number of gauge time values: {len(gauge_time)}.\")\n\n# Convert time from ordinal value\ngauge_time = [ datetime.datetime.fromordinal(gt).strftime(\"%Y%m%d\") for gt in gauge_time ]\n\nNumber of gauge discharge values: 3722.\nNumber of gauge time values: 3722.", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#read-the-s3-zarr-endpoints-and-aggregate-to-single-zarr", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#read-the-s3-zarr-endpoints-and-aggregate-to-single-zarr", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Read the S3 Zarr endpoints and aggregate to single Zarr", + "text": "Read the S3 Zarr endpoints and aggregate to single Zarr\n\n# 1) read the AWS credentials\nprint(ecco_response['message'])\nwith requests.get(ecco_response['links'][2]['href']) as r:\n creds = r.json()\n\nprint( creds.keys() )\nprint(\"AWS credentials expire on: \", creds['Expiration'] )\n\n\n# 2) print root directory and read the s3 URLs into a list\ns3_dir2 = ecco_response['links'][3]['href']\nprint(\"root directory:\", s3_dir2)\ns3_urls2 = [u['href'] for u in ecco_response['links'][4:-1]]\n\n# sort the URLs in time order\ns3_urls2.sort()\n\n# 3) Autenticate AWS S3 credentials\ns3 = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\n\n# 4) Read and concatenate into a single Zarr dataset\ntemp_ds = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls2], dim=\"time\", coords='minimal')\n#temp_ds_group = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls2], dim=\"time\", coords='minimal').groupby('time.month')\n\ntemp_ds\n\nThe job has completed successfully. Contains results in AWS S3. Access from AWS us-west-2 with keys from https://harmony.earthdata.nasa.gov/cloud-access.sh\ndict_keys(['AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration'])\nAWS credentials expire on: 2022-05-03T08:48:44.000Z\nroot directory: s3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9dd5c9b3-84c4-48e5-907d-2bd21d92a60c/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 193, Z: 50, latitude: 360, longitude: 720, nv: 2)\nCoordinates:\n * Z (Z) float32 -5.0 -15.0 -25.0 ... -5.461e+03 -5.906e+03\n Z_bnds (Z, nv) float32 nan -10.0 -10.0 ... -5.678e+03 -6.134e+03\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75\n latitude_bnds (latitude, nv) float32 -90.0 -89.5 -89.5 ... 89.5 89.5 90.0\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8\n longitude_bnds (longitude, nv) float32 -180.0 -179.5 -179.5 ... 179.5 180.0\n * time (time) datetime64[ns] 2001-12-16T12:00:00 ... 2017-12-16T...\n time_bnds (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>\nDimensions without coordinates: nv\nData variables:\n SALT (time, Z, latitude, longitude) float32 dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>\n THETA (time, Z, latitude, longitude) float32 dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.8, ACDD-1.3\n acknowledgement: This research was carried out by the Jet...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon gri...\n coordinates_comment: Note: the global 'coordinates' attribute...\n ... ...\n time_coverage_duration: P1M\n time_coverage_end: 2002-01-01T00:00:00\n time_coverage_resolution: P1M\n time_coverage_start: 2001-12-01T00:00:00\n title: ECCO Ocean Temperature and Salinity - Mo...\n uuid: 7f718714-4159-11eb-8bbd-0cc47a3f819bxarray.DatasetDimensions:time: 193Z: 50latitude: 360longitude: 720nv: 2Coordinates: (8)Z(Z)float32-5.0 -15.0 ... -5.906e+03axis :Zbounds :Z_bndscomment :Non-uniform vertical spacing.coverage_content_type :coordinatelong_name :depth of grid cell centerpositive :upstandard_name :depthunits :marray([-5.000000e+00, -1.500000e+01, -2.500000e+01, -3.500000e+01,\n -4.500000e+01, -5.500000e+01, -6.500000e+01, -7.500500e+01,\n -8.502500e+01, -9.509500e+01, -1.053100e+02, -1.158700e+02,\n -1.271500e+02, -1.397400e+02, -1.544700e+02, -1.724000e+02,\n -1.947350e+02, -2.227100e+02, -2.574700e+02, -2.999300e+02,\n -3.506800e+02, -4.099300e+02, -4.774700e+02, -5.527100e+02,\n -6.347350e+02, -7.224000e+02, -8.144700e+02, -9.097400e+02,\n -1.007155e+03, -1.105905e+03, -1.205535e+03, -1.306205e+03,\n -1.409150e+03, -1.517095e+03, -1.634175e+03, -1.765135e+03,\n -1.914150e+03, -2.084035e+03, -2.276225e+03, -2.491250e+03,\n -2.729250e+03, -2.990250e+03, -3.274250e+03, -3.581250e+03,\n -3.911250e+03, -4.264250e+03, -4.640250e+03, -5.039250e+03,\n -5.461250e+03, -5.906250e+03], dtype=float32)Z_bnds(Z, nv)float32nan -10.0 ... -5.678e+03 -6.134e+03comment :One pair of bounds for each vertical level.coverage_content_type :coordinatelong_name :depths of grid cell upper and lower interfacesarray([[ nan, -10. ],\n [ -10. , -20. ],\n [ -20. , -30. ],\n [ -30. , -40. ],\n [ -40. , -50. ],\n [ -50. , -60. ],\n [ -60. , -70. ],\n [ -70. , -80.01 ],\n [ -80.01 , -90.04 ],\n [ -90.04 , -100.15 ],\n [ -100.15 , -110.47 ],\n [ -110.47 , -121.270004],\n [ -121.270004, -133.03 ],\n [ -133.03 , -146.45 ],\n [ -146.45 , -162.48999 ],\n [ -162.48999 , -182.31 ],\n [ -182.31 , -207.16 ],\n [ -207.16 , -238.26001 ],\n [ -238.26001 , -276.68 ],\n [ -276.68 , -323.18 ],\n...\n [-1155.53 , -1255.54 ],\n [-1255.54 , -1356.87 ],\n [-1356.87 , -1461.4299 ],\n [-1461.4299 , -1572.7599 ],\n [-1572.7599 , -1695.5898 ],\n [-1695.5898 , -1834.6798 ],\n [-1834.6798 , -1993.6199 ],\n [-1993.6199 , -2174.45 ],\n [-2174.45 , -2378. ],\n [-2378. , -2604.5 ],\n [-2604.5 , -2854. ],\n [-2854. , -3126.5 ],\n [-3126.5 , -3422. ],\n [-3422. , -3740.5 ],\n [-3740.5 , -4082. ],\n [-4082. , -4446.5 ],\n [-4446.5 , -4834. ],\n [-4834. , -5244.5 ],\n [-5244.5 , -5678. ],\n [-5678. , -6134.5 ]], dtype=float32)latitude(latitude)float32-89.75 -89.25 ... 89.25 89.75axis :Ybounds :latitude_bndscomment :uniform grid spacing from -89.75 to 89.75 by 0.5coverage_content_type :coordinatelong_name :latitude at grid cell centerstandard_name :latitudeunits :degrees_northarray([-89.75, -89.25, -88.75, ..., 88.75, 89.25, 89.75], dtype=float32)latitude_bnds(latitude, nv)float32-90.0 -89.5 -89.5 ... 89.5 90.0coverage_content_type :coordinatelong_name :latitude bounds grid cellsarray([[-90. , -89.5],\n [-89.5, -89. ],\n [-89. , -88.5],\n [-88.5, -88. ],\n [-88. , -87.5],\n [-87.5, -87. ],\n [-87. , -86.5],\n [-86.5, -86. ],\n [-86. , -85.5],\n [-85.5, -85. ],\n [-85. , -84.5],\n [-84.5, -84. ],\n [-84. , -83.5],\n [-83.5, -83. ],\n [-83. , -82.5],\n [-82.5, -82. ],\n [-82. , -81.5],\n [-81.5, -81. ],\n [-81. , -80.5],\n [-80.5, -80. ],\n...\n [ 80. , 80.5],\n [ 80.5, 81. ],\n [ 81. , 81.5],\n [ 81.5, 82. ],\n [ 82. , 82.5],\n [ 82.5, 83. ],\n [ 83. , 83.5],\n [ 83.5, 84. ],\n [ 84. , 84.5],\n [ 84.5, 85. ],\n [ 85. , 85.5],\n [ 85.5, 86. ],\n [ 86. , 86.5],\n [ 86.5, 87. ],\n [ 87. , 87.5],\n [ 87.5, 88. ],\n [ 88. , 88.5],\n [ 88.5, 89. ],\n [ 89. , 89.5],\n [ 89.5, 90. ]], dtype=float32)longitude(longitude)float32-179.8 -179.2 ... 179.2 179.8axis :Xbounds :longitude_bndscomment :uniform grid spacing from -179.75 to 179.75 by 0.5coverage_content_type :coordinatelong_name :longitude at grid cell centerstandard_name :longitudeunits :degrees_eastarray([-179.75, -179.25, -178.75, ..., 178.75, 179.25, 179.75],\n dtype=float32)longitude_bnds(longitude, nv)float32-180.0 -179.5 ... 179.5 180.0coverage_content_type :coordinatelong_name :longitude bounds grid cellsarray([[-180. , -179.5],\n [-179.5, -179. ],\n [-179. , -178.5],\n ...,\n [ 178.5, 179. ],\n [ 179. , 179.5],\n [ 179.5, 180. ]], dtype=float32)time(time)datetime64[ns]2001-12-16T12:00:00 ... 2017-12-...axis :Tbounds :time_bndscoverage_content_type :coordinatelong_name :center time of averaging periodstandard_name :timearray(['2001-12-16T12:00:00.000000000', '2002-01-16T12:00:00.000000000',\n '2002-02-15T00:00:00.000000000', '2002-03-16T12:00:00.000000000',\n '2002-04-16T00:00:00.000000000', '2002-05-16T12:00:00.000000000',\n '2002-06-16T00:00:00.000000000', '2002-07-16T12:00:00.000000000',\n '2002-08-16T12:00:00.000000000', '2002-09-16T00:00:00.000000000',\n '2002-10-16T12:00:00.000000000', '2002-11-16T00:00:00.000000000',\n '2002-12-16T12:00:00.000000000', '2003-01-16T12:00:00.000000000',\n '2003-02-15T00:00:00.000000000', '2003-03-16T12:00:00.000000000',\n '2003-04-16T00:00:00.000000000', '2003-05-16T12:00:00.000000000',\n '2003-06-16T00:00:00.000000000', '2003-07-16T12:00:00.000000000',\n '2003-08-16T12:00:00.000000000', '2003-09-16T00:00:00.000000000',\n '2003-10-16T12:00:00.000000000', '2003-11-16T00:00:00.000000000',\n '2003-12-16T12:00:00.000000000', '2004-01-16T12:00:00.000000000',\n '2004-02-15T12:00:00.000000000', '2004-03-16T12:00:00.000000000',\n '2004-04-16T00:00:00.000000000', '2004-05-16T12:00:00.000000000',\n '2004-06-16T00:00:00.000000000', '2004-07-16T12:00:00.000000000',\n '2004-08-16T12:00:00.000000000', '2004-09-16T00:00:00.000000000',\n '2004-10-16T12:00:00.000000000', '2004-11-16T00:00:00.000000000',\n '2004-12-16T12:00:00.000000000', '2005-01-16T12:00:00.000000000',\n '2005-02-15T00:00:00.000000000', '2005-03-16T12:00:00.000000000',\n '2005-04-16T00:00:00.000000000', '2005-05-16T12:00:00.000000000',\n '2005-06-16T00:00:00.000000000', '2005-07-16T12:00:00.000000000',\n '2005-08-16T12:00:00.000000000', '2005-09-16T00:00:00.000000000',\n '2005-10-16T12:00:00.000000000', '2005-11-16T00:00:00.000000000',\n '2005-12-16T12:00:00.000000000', '2006-01-16T12:00:00.000000000',\n '2006-02-15T00:00:00.000000000', '2006-03-16T12:00:00.000000000',\n '2006-04-16T00:00:00.000000000', '2006-05-16T12:00:00.000000000',\n '2006-06-16T00:00:00.000000000', '2006-07-16T12:00:00.000000000',\n '2006-08-16T12:00:00.000000000', '2006-09-16T00:00:00.000000000',\n '2006-10-16T12:00:00.000000000', '2006-11-16T00:00:00.000000000',\n '2006-12-16T12:00:00.000000000', '2007-01-16T12:00:00.000000000',\n '2007-02-15T00:00:00.000000000', '2007-03-16T12:00:00.000000000',\n '2007-04-16T00:00:00.000000000', '2007-05-16T12:00:00.000000000',\n '2007-06-16T00:00:00.000000000', '2007-07-16T12:00:00.000000000',\n '2007-08-16T12:00:00.000000000', '2007-09-16T00:00:00.000000000',\n '2007-10-16T12:00:00.000000000', '2007-11-16T00:00:00.000000000',\n '2007-12-16T12:00:00.000000000', '2008-01-16T12:00:00.000000000',\n '2008-02-15T12:00:00.000000000', '2008-03-16T12:00:00.000000000',\n '2008-04-16T00:00:00.000000000', '2008-05-16T12:00:00.000000000',\n '2008-06-16T00:00:00.000000000', '2008-07-16T12:00:00.000000000',\n '2008-08-16T12:00:00.000000000', '2008-09-16T00:00:00.000000000',\n '2008-10-16T12:00:00.000000000', '2008-11-16T00:00:00.000000000',\n '2008-12-16T12:00:00.000000000', '2009-01-16T12:00:00.000000000',\n '2009-02-15T00:00:00.000000000', '2009-03-16T12:00:00.000000000',\n '2009-04-16T00:00:00.000000000', '2009-05-16T12:00:00.000000000',\n '2009-06-16T00:00:00.000000000', '2009-07-16T12:00:00.000000000',\n '2009-08-16T12:00:00.000000000', '2009-09-16T00:00:00.000000000',\n '2009-10-16T12:00:00.000000000', '2009-11-16T00:00:00.000000000',\n '2009-12-16T12:00:00.000000000', '2010-01-16T12:00:00.000000000',\n '2010-02-15T00:00:00.000000000', '2010-03-16T12:00:00.000000000',\n '2010-04-16T00:00:00.000000000', '2010-05-16T12:00:00.000000000',\n '2010-06-16T00:00:00.000000000', '2010-07-16T12:00:00.000000000',\n '2010-08-16T12:00:00.000000000', '2010-09-16T00:00:00.000000000',\n '2010-10-16T12:00:00.000000000', '2010-11-16T00:00:00.000000000',\n '2010-12-16T12:00:00.000000000', '2011-01-16T12:00:00.000000000',\n '2011-02-15T00:00:00.000000000', '2011-03-16T12:00:00.000000000',\n '2011-04-16T00:00:00.000000000', '2011-05-16T12:00:00.000000000',\n '2011-06-16T00:00:00.000000000', '2011-07-16T12:00:00.000000000',\n '2011-08-16T12:00:00.000000000', '2011-09-16T00:00:00.000000000',\n '2011-10-16T12:00:00.000000000', '2011-11-16T00:00:00.000000000',\n '2011-12-16T12:00:00.000000000', '2012-01-16T12:00:00.000000000',\n '2012-02-15T12:00:00.000000000', '2012-03-16T12:00:00.000000000',\n '2012-04-16T00:00:00.000000000', '2012-05-16T12:00:00.000000000',\n '2012-06-16T00:00:00.000000000', '2012-07-16T12:00:00.000000000',\n '2012-08-16T12:00:00.000000000', '2012-09-16T00:00:00.000000000',\n '2012-10-16T12:00:00.000000000', '2012-11-16T00:00:00.000000000',\n '2012-12-16T12:00:00.000000000', '2013-01-16T12:00:00.000000000',\n '2013-02-15T00:00:00.000000000', '2013-03-16T12:00:00.000000000',\n '2013-04-16T00:00:00.000000000', '2013-05-16T12:00:00.000000000',\n '2013-06-16T00:00:00.000000000', '2013-07-16T12:00:00.000000000',\n '2013-08-16T12:00:00.000000000', '2013-09-16T00:00:00.000000000',\n '2013-10-16T12:00:00.000000000', '2013-11-16T00:00:00.000000000',\n '2013-12-16T12:00:00.000000000', '2014-01-16T12:00:00.000000000',\n '2014-02-15T00:00:00.000000000', '2014-03-16T12:00:00.000000000',\n '2014-04-16T00:00:00.000000000', '2014-05-16T12:00:00.000000000',\n '2014-06-16T00:00:00.000000000', '2014-07-16T12:00:00.000000000',\n '2014-08-16T12:00:00.000000000', '2014-09-16T00:00:00.000000000',\n '2014-10-16T12:00:00.000000000', '2014-11-16T00:00:00.000000000',\n '2014-12-16T12:00:00.000000000', '2015-01-16T12:00:00.000000000',\n '2015-02-15T00:00:00.000000000', '2015-03-16T12:00:00.000000000',\n '2015-04-16T00:00:00.000000000', '2015-05-16T12:00:00.000000000',\n '2015-06-16T00:00:00.000000000', '2015-07-16T12:00:00.000000000',\n '2015-08-16T12:00:00.000000000', '2015-09-16T00:00:00.000000000',\n '2015-10-16T12:00:00.000000000', '2015-11-16T00:00:00.000000000',\n '2015-12-16T12:00:00.000000000', '2016-01-16T12:00:00.000000000',\n '2016-02-15T12:00:00.000000000', '2016-03-16T12:00:00.000000000',\n '2016-04-16T00:00:00.000000000', '2016-05-16T12:00:00.000000000',\n '2016-06-16T00:00:00.000000000', '2016-07-16T12:00:00.000000000',\n '2016-08-16T12:00:00.000000000', '2016-09-16T00:00:00.000000000',\n '2016-10-16T12:00:00.000000000', '2016-11-16T00:00:00.000000000',\n '2016-12-16T12:00:00.000000000', '2017-01-16T12:00:00.000000000',\n '2017-02-15T00:00:00.000000000', '2017-03-16T12:00:00.000000000',\n '2017-04-16T00:00:00.000000000', '2017-05-16T12:00:00.000000000',\n '2017-06-16T00:00:00.000000000', '2017-07-16T12:00:00.000000000',\n '2017-08-16T12:00:00.000000000', '2017-09-16T00:00:00.000000000',\n '2017-10-16T12:00:00.000000000', '2017-11-16T00:00:00.000000000',\n '2017-12-16T06:00:00.000000000'], dtype='datetime64[ns]')time_bnds(time, nv)datetime64[ns]dask.array<chunksize=(1, 2), meta=np.ndarray>comment :Start and end times of averaging period.coverage_content_type :coordinatelong_name :time bounds of averaging period\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.02 kiB\n16 B\n\n\nShape\n(193, 2)\n(1, 2)\n\n\nCount\n579 Tasks\n193 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 2 193\n\n\n\n\nData variables: (2)SALT(time, Z, latitude, longitude)float32dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>comment :Defined using CF convention 'Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.' see https://cfconventions.org/Data/cf-standard-names/73/build/cf-standard-name-table.htmlcoverage_content_type :modelResultlong_name :Salinitystandard_name :sea_water_salinityunits :1e-3valid_max :41.26802444458008valid_min :17.106637954711914\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.32 GiB\n14.95 MiB\n\n\nShape\n(193, 50, 360, 720)\n(1, 50, 280, 280)\n\n\nCount\n2509 Tasks\n1158 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 193 1 720 360 50\n\n\n\n\nTHETA(time, Z, latitude, longitude)float32dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>comment :Sea water potential temperature is the temperature a parcel of sea water would have if moved adiabatically to sea level pressure. Note: the equation of state is a modified UNESCO formula by Jackett and McDougall (1995), which uses the model variable potential temperature as input assuming a horizontally and temporally constant pressure of $p_0=-g ho_{0} z$.coverage_content_type :modelResultlong_name :Potential temperature standard_name :sea_water_potential_temperatureunits :degree_Cvalid_max :36.032955169677734valid_min :-2.2909388542175293\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.32 GiB\n14.95 MiB\n\n\nShape\n(193, 50, 360, 720)\n(1, 50, 280, 280)\n\n\nCount\n2509 Tasks\n1158 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 193 1 720 360 50\n\n\n\n\nAttributes: (62)Conventions :CF-1.8, ACDD-1.3acknowledgement :This research was carried out by the Jet Propulsion Laboratory, managed by the California Institute of Technology under a contract with the National Aeronautics and Space Administration.author :Ian Fenty and Ou Wangcdm_data_type :Gridcomment :Fields provided on a regular lat-lon grid. They have been mapped to the regular lat-lon grid from the original ECCO lat-lon-cap 90 (llc90) native model grid.coordinates_comment :Note: the global 'coordinates' attribute describes auxillary coordinates.creator_email :ecco-group@mit.educreator_institution :NASA Jet Propulsion Laboratory (JPL)creator_name :ECCO Consortiumcreator_type :groupcreator_url :https://ecco-group.orgdate_created :2020-12-18T09:50:20date_issued :2020-12-18T09:50:20date_metadata_modified :2021-03-15T22:06:59date_modified :2021-03-15T22:06:59geospatial_bounds_crs :EPSG:4326geospatial_lat_max :90.0geospatial_lat_min :-90.0geospatial_lat_resolution :0.5geospatial_lat_units :degrees_northgeospatial_lon_max :180.0geospatial_lon_min :-180.0geospatial_lon_resolution :0.5geospatial_lon_units :degrees_eastgeospatial_vertical_max :0.0geospatial_vertical_min :-6134.5geospatial_vertical_positive :upgeospatial_vertical_resolution :variablegeospatial_vertical_units :meterhistory :Inaugural release of an ECCO Central Estimate solution to PO.DAACid :10.5067/ECG5M-OTS44institution :NASA Jet Propulsion Laboratory (JPL)instrument_vocabulary :GCMD instrument keywordskeywords :EARTH SCIENCE SERVICES > MODELS > EARTH SCIENCE REANALYSES/ASSIMILATION MODELS, EARTH SCIENCE > OCEANS > SALINITY/DENSITY > SALINITY, EARTH SCIENCE > OCEANS > OCEAN TEMPERATURE > POTENTIAL TEMPERATUREkeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordslicense :Public Domainmetadata_link :https://cmr.earthdata.nasa.gov/search/collections.umm_json?ShortName=ECCO_L4_TEMP_SALINITY_05DEG_MONTHLY_V4R4naming_authority :gov.nasa.jplplatform :ERS-1/2, TOPEX/Poseidon, Geosat Follow-On (GFO), ENVISAT, Jason-1, Jason-2, CryoSat-2, SARAL/AltiKa, Jason-3, AVHRR, Aquarius, SSM/I, SSMIS, GRACE, DTU17MDT, Argo, WOCE, GO-SHIP, MEOP, Ice Tethered Profilers (ITP)platform_vocabulary :GCMD platform keywordsprocessing_level :L4product_name :OCEAN_TEMPERATURE_SALINITY_mon_mean_2001-12_ECCO_V4r4_latlon_0p50deg.ncproduct_time_coverage_end :2018-01-01T00:00:00product_time_coverage_start :1992-01-01T12:00:00product_version :Version 4, Release 4program :NASA Physical Oceanography, Cryosphere, Modeling, Analysis, and Prediction (MAP)project :Estimating the Circulation and Climate of the Ocean (ECCO)publisher_email :podaac@podaac.jpl.nasa.govpublisher_institution :PO.DAACpublisher_name :Physical Oceanography Distributed Active Archive Center (PO.DAAC)publisher_type :institutionpublisher_url :https://podaac.jpl.nasa.govreferences :ECCO Consortium, Fukumori, I., Wang, O., Fenty, I., Forget, G., Heimbach, P., & Ponte, R. M. 2020. Synopsis of the ECCO Central Production Global Ocean and Sea-Ice State Estimate (Version 4 Release 4). doi:10.5281/zenodo.3765928source :The ECCO V4r4 state estimate was produced by fitting a free-running solution of the MITgcm (checkpoint 66g) to satellite and in situ observational data in a least squares sense using the adjoint methodstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsummary :This dataset provides monthly-averaged ocean potential temperature and salinity interpolated to a regular 0.5-degree grid from the ECCO Version 4 Release 4 (V4r4) ocean and sea-ice state estimate. Estimating the Circulation and Climate of the Ocean (ECCO) state estimates are dynamically and kinematically-consistent reconstructions of the three-dimensional, time-evolving ocean, sea-ice, and surface atmospheric states. ECCO V4r4 is a free-running solution of a global, nominally 1-degree configuration of the MIT general circulation model (MITgcm) that has been fit to observations in a least-squares sense. Observational data constraints used in V4r4 include sea surface height (SSH) from satellite altimeters [ERS-1/2, TOPEX/Poseidon, GFO, ENVISAT, Jason-1,2,3, CryoSat-2, and SARAL/AltiKa]; sea surface temperature (SST) from satellite radiometers [AVHRR], sea surface salinity (SSS) from the Aquarius satellite radiometer/scatterometer, ocean bottom pressure (OBP) from the GRACE satellite gravimeter; sea-ice concentration from satellite radiometers [SSM/I and SSMIS], and in-situ ocean temperature and salinity measured with conductivity-temperature-depth (CTD) sensors and expendable bathythermographs (XBTs) from several programs [e.g., WOCE, GO-SHIP, Argo, and others] and platforms [e.g., research vessels, gliders, moorings, ice-tethered profilers, and instrumented pinnipeds]. V4r4 covers the period 1992-01-01T12:00:00 to 2018-01-01T00:00:00.time_coverage_duration :P1Mtime_coverage_end :2002-01-01T00:00:00time_coverage_resolution :P1Mtime_coverage_start :2001-12-01T00:00:00title :ECCO Ocean Temperature and Salinity - Monthly Mean 0.5 Degree (Version 4 Release 4)uuid :7f718714-4159-11eb-8bbd-0cc47a3f819b", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-algorithm-discharge", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-algorithm-discharge", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate algorithm discharge", - "text": "Locate algorithm discharge\nLocate the algorithm discharge for a corresponding reach identifier that has gauge data. We will use HiVDI for this demonstration.\n\n# Locate the reach identifier and associated discharge time series\nreach_q_index = np.where(results['reaches']['reach_id'][:] == reach_id)\nprint(\"Reach Index: \", reach_q_index)\ndischarge_q = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE][reach_q_index][0]\n\n# Filter out missing values\nmissing = results[DISCHARGE_ALGORITHM][DISCHARGE_VARIABLE].missing_value\nnonmissing_indexes = np.where(discharge_q != missing)\ndischarge_q = discharge_q[nonmissing_indexes]\nprint(f\"Number of {DISCHARGE_ALGORITHM.upper()} discharge values: {len(discharge_q)}.\")\nprint(discharge_q)\n\n# Retrieve SWOT observation times and filter out missing values\ntime = results['reaches']['time'][reach_q_index][0]\ntime = time[nonmissing_indexes]\n\n# Convert to discharge time to same format as gauge agency time\nswot_ts = datetime.datetime(2000,1,1,0,0,0) # SWOT timestamp delta\ndischarge_time = [ (swot_ts + datetime.timedelta(seconds=st)).strftime(\"%Y%m%d\") for st in time ]\nprint(f\"Number of {DISCHARGE_ALGORITHM.upper()} time values: {len(time)}.\")\nprint(discharge_time)\n\nReach Index: (array([13158]),)\nNumber of HIVDI discharge values: 7.\n[1213.67194541 1138.18496353 1115.0978839 1069.45943177 1082.94584138\n 1198.94024353 1108.93895269]\nNumber of HIVDI time values: 7.\n['20230418', '20230419', '20230420', '20230422', '20230423', '20230424', '20230425']", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#do-data-masking-calculate-a-sst-anomaly-and-plot-some-figures", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#do-data-masking-calculate-a-sst-anomaly-and-plot-some-figures", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Do data masking, calculate a SST anomaly, and plot some figures", + "text": "Do data masking, calculate a SST anomaly, and plot some figures\n\n# Mask for the good data. Everything else defaults to NaN\n# SST missing value 9.9692100e+36 \n# SSH missing value 9.9692100e+36\ncond = (ssh_ds < 1000)\nssh_ds_masked = ssh_ds['SSH'].where(cond)\n\ncond = (temp_ds < 1000)\ntemp_ds_masked = temp_ds['THETA'].where(cond)\n\n# Derive a SST climatology and subtract it from the SST to create SST anomaly and remove trends\nclimatology_mean = temp_ds_masked.groupby('time.month').mean('time',keep_attrs=True,skipna=False)\ntemp_ds_masked_anomaly = temp_ds_masked.groupby('time.month') - climatology_mean # subtract out longterm monthly mean\n\nfig,ax=plt.subplots(1,3,figsize=(25,5))\n\n# take a slice of the Indian Ocean and plot SSH, SST, SST anomaly\nssh_ds_masked['SSH'][6].sel(longitude=slice(40,120),latitude=slice(-30,20)).plot(ax=ax[0], vmin=-0.5,vmax=1.25)\ntemp_ds_masked['THETA'][6].sel(longitude=slice(40,120),latitude=slice(-30,20), Z=slice(0,-5)).plot(ax=ax[1], vmin=10,vmax=32)\ntemp_ds_masked_anomaly['THETA'][6].sel(longitude=slice(40,120),latitude=slice(-30,20), Z=slice(0,-5)).plot(ax=ax[2], vmin=-2,vmax=2)", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-integrator-moi-discharge", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-integrator-moi-discharge", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate integrator (MOI) discharge", - "text": "Locate integrator (MOI) discharge\nLocate the integrator discharge produced for the algorithm for the reach of interest that has gauge data. As mentioned, we will use HiVDI for this demonstration.\n\n# Locate MOI discharge results for discharge algorithm making sure to filter out missing values\nmoi_q = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"][reach_q_index][0]\nmoi_q = moi_q[nonmissing_indexes]\n\n# Set missing MOI to NaN\nmissing_moi = results[\"moi\"][DISCHARGE_ALGORITHM][\"q\"].missing_value\nmoi_q[moi_q == missing_moi] = np.nan\nprint(f\"Number of integrator {DISCHARGE_ALGORITHM.upper()} discharge values: {len(moi_q)}.\")\nprint(moi_q)\n\nNumber of integrator HIVDI discharge values: 7.\n[334.24668321 297.51701118 290.62386718 259.68934869 261.49240103\n 307.47902449 288.01774716]", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#perform-the-correlations-in-the-east-and-west-indian-ocean", + "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#perform-the-correlations-in-the-east-and-west-indian-ocean", + "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", + "section": "Perform the correlations in the east and west Indian Ocean", + "text": "Perform the correlations in the east and west Indian Ocean\n\n# Western and Eastern Indian Ocean regions (WIO and EIO respectively)\n# EIO; 90 –110 E, 10 S–0N\n# WIO; 50 –70 E, 10 S–10 N\n\n# Group Eastern Indian Ocean data by month. This will make the correlation of all monthly values straightforwrd.\nssh_group = ssh_ds_masked['SSH'].sel(longitude=slice(90,110),latitude=slice(-10,0)).groupby('time.month')\n#temp_group = temp_ds_masked['THETA'].sel(longitude=slice(90,110),latitude=slice(-10,0), Z=-5.0).drop('Z').groupby('time.month')\ntemp_group = temp_ds_masked_anomaly['THETA'].sel(longitude=slice(90,110),latitude=slice(-10,0), Z=-5.0).drop('Z').groupby('time.month')\n\nprint(\" Running correlations in eastern Indian Ocean . . .\\n\") \ncorr = []\nfor month in range(1,13):\n corr.append(xr.corr(ssh_group[month], temp_group[month]))\n #print(\"\\nthe correlation in the east is: \" , xr.corr(ssh_group[month], temp_group[month]).values)\n \n# Do some plotting\nfig,ax=plt.subplots(1,2,figsize=(14,8))\n\nax[0].set_title(\"Spatial correlation in Eastern Indian Ocean\",fontsize=16)\nax[0].set_ylabel(\"Correlation\",fontsize=16)\nax[0].set_xlabel(\"Month\",fontsize=16)\nax[0].set_ylim([-1, 1])\nax[0].plot(corr)\n\n# Repeat for Western Indian Ocean\n# Group the data by month. This will make the correlation of all monthly values straightforwrd.\nssh_group = ssh_ds_masked['SSH'].sel(longitude=slice(50,70),latitude=slice(-10,10)).groupby('time.month')\n#temp_group = temp_ds_masked['THETA'].sel(longitude=slice(50,70),latitude=slice(-10,10), Z=-5.0).drop('Z').groupby('time.month')\ntemp_group = temp_ds_masked_anomaly['THETA'].sel(longitude=slice(50,70),latitude=slice(-10,10), Z=-5.0).drop('Z').groupby('time.month')\n\n\nprint(\" Running correlations in western Indian Ocean . . .\\n\") \ncorr2 =[]\nfor month in range(1,13):\n corr2.append(xr.corr(ssh_group[month], temp_group[month]))\n #print(\"\\nthe correlation in the west is: \" , xr.corr(ssh_group[month], temp_group[month]).values)\n \nax[1].set_title(\"Spatial correlation in Western Indian Ocean\",fontsize=16)\nax[1].set_ylabel(\"Correlation\",fontsize=16)\nax[1].set_xlabel(\"Month\",fontsize=16)\nax[1].set_ylim([-1, 1])\nax[1].plot(corr2)\n\n Running correlations in eastern Indian Ocean . . .\n\n Running correlations in western Indian Ocean . . .", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "ECCO", + "Use Case Demo" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-observations", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#locate-overlapping-observations", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Locate overlapping observations", - "text": "Locate overlapping observations\nWe will need to locate the discharge time series (FLPE and MOI) for the Rhine reach of interest and then determine if there are overlapping in situ observations with SWOT observations.\n\n# Find overlapping time between in situ and SWOT observations\nobs_overlap = list(set(discharge_time).intersection(set(gauge_time)))\nobs_overlap.sort()\nprint(\"Days of observation overlap:\")\nprint(obs_overlap)\n\n# Get indexes of overlap for gauge, algorithm and integrator\ngauge_overlap_index = np.where(np.in1d(gauge_time, obs_overlap))[0]\ndischarge_overlap_index = np.where(np.in1d(discharge_time, obs_overlap))[0]\n\n# Retrieve time and discharge values for indexes\ngauge_time = np.array(gauge_time)[gauge_overlap_index]\ngauge_discharge = np.array(gauge_discharge)[gauge_overlap_index]\n# print(\"Gauge time:\\n\", gauge_time)\nprint(\"Gauge discharge:\\n\", gauge_discharge)\n\ndischarge_time = np.array(discharge_time)[discharge_overlap_index]\ndischarge_algo = np.array(discharge_q)[discharge_overlap_index]\n# print(f\"{DISCHARGE_ALGORITHM} time:\\n\", discharge_time)\nprint(f\"{DISCHARGE_ALGORITHM} discharge:\\n\", discharge_algo)\n\nmoi_q = np.array(moi_q)[discharge_overlap_index]\nprint(f\"MOI discharge for {DISCHARGE_ALGORITHM}:\\n\", moi_q)\n\nDays of observation overlap:\n['20230418', '20230419', '20230420', '20230422', '20230423', '20230424', '20230425']\nGauge discharge:\n [1334.333 1208.255 1148.526 1115.296 1077.891 1080.885 1153.646]\nhivdi discharge:\n [1213.67194541 1138.18496353 1115.0978839 1069.45943177 1082.94584138\n 1198.94024353 1108.93895269]\nMOI discharge for hivdi:\n [334.24668321 297.51701118 290.62386718 259.68934869 261.49240103\n 307.47902449 288.01774716]", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "", + "text": "#!rm *.nc*", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#plotting-results-for-comparison", - "href": "notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html#plotting-results-for-comparison", - "title": "Exploring gauges and river discharge in the SWORD of Science (SoS) dataset", - "section": "Plotting results for comparison", - "text": "Plotting results for comparison\nLet’s plot all discharge time series to better visualize the differences and compare the FLPE, MOI, and gauge discharge values.\n\n# Plot discharge alongside MOI discharge and gauge discharge\n\n# Discharge algorithm Q\nplt.scatter(discharge_time, discharge_algo)\nplt.plot(discharge_time, discharge_algo, label=f\"{DISCHARGE_ALGORITHM.upper()}\")\n\n# MOI Q\nplt.scatter(discharge_time, moi_q)\nplt.plot(discharge_time, moi_q, label=\"MOI\")\n\n# Gauge Q\nplt.scatter(gauge_time, gauge_discharge)\nplt.plot(gauge_time, gauge_discharge, label=\"Gauge\")\n\nplt.suptitle(f\"Discharge Timeseries from {DISCHARGE_ALGORITHM} for the {RIVER_NAME} reach identifier: {reach_id}.\")\nplt.legend()\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#requirements", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#requirements", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Requirements", + "text": "Requirements\nThis workflow was developed using Python 3.9 (and tested against versions 3.7, 3.8). The pyresample package is the only remaining dependency besides common packages like numpy and xarray. You may uncomment the first line of the following cell to install pyresample, if necessary. Then, import all the required Python packages.\n\n#!python -m pip install numpy pyresample xarray\nimport os\nimport tqdm\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport pyresample as pr\nimport matplotlib.pyplot as plt\nfrom concurrent.futures import ThreadPoolExecutor\nfrom pyresample.kd_tree import resample_gauss\nfrom io import StringIO\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n \ndef get_opendap(record: dict):\n for url in record.get(\"RelatedUrls\"):\n if 'opendap.earthdata.nasa.gov' in url.get(\"URL\"):\n return url.get(\"URL\")\n\ndef get_granules(ShortName: str, provider: str=\"POCLOUD\", page_size: int=200, **kwargs):\n url = f\"https://{cmr}/search/granules.umm_json\"\n params = dict(ShortName=ShortName, provider=\"POCLOUD\", page_size=page_size)\n granules = pd.DataFrame(requests.get(url, {**params,**kwargs}).json().get(\"items\"))\n granules['GranuleUR'] = granules.umm.apply(lambda x: x.get(\"GranuleUR\"))\n granules['OPeNDAP'] = granules.umm.apply(get_opendap)\n coverage = granules.umm.apply(lambda x: x.get(\"TemporalExtent\").get(\"RangeDateTime\").values()).apply(list)\n granules['Start'] = coverage.apply(sorted).apply(lambda x: x[0])\n granules['End'] = coverage.apply(sorted).apply(lambda x: x[1])\n return granules", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "SWORD of Science (SoS) Discharge", - "Exploring river discharge and gauge data" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#in-aws-cloud-version", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#in-aws-cloud-version", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "In AWS Cloud Version", - "text": "In AWS Cloud Version\n\nAuthor: Nicholas Tarpinian, PO.DAAC", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#dataset", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#dataset", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Dataset", + "text": "Dataset\n\nAbout the mission\nThis demo uses data acquired by the Sentinel-6A Michael Freilich (S6A) satellite altimetry mission, which provides precise measurements of ocean surface height. It is the latest iteration in a series of missions, which together provide an uninterupted sea surface height record going back more than 30 years.\nSatellite altimetry is a precise science carried out by Ocean Surface Topography researchers through the Jason-series radar altimetry missions. Instrument specifications, operational procedures, data calibration and analysis are sometimes referred to colloquially as “along-track altimetry” (a term that I find useful to understanding the data provided at level 2, like in the dataset we use here).\nLearn more through resources linked in the Appendix).\n\n\nAbout the data\nIn a nutshell:\n\nWhat? calibrated sea surface height measurements,\nWhere? from -66.0 to 66.0 degrees latitude,\nWhen? beginning in June 2021,\nHow? global coverage acquired every 10 days (1 cycle of 128 orbits)\n\n\nFigure: depicted data structure for level-2 along-track altimetry datasets from Sentinel-6A\nPO.DAAC typically refers to datasets by their ShortName: JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F. The ShortName contains the following info for all Sentinel-6 datasets at level 2:\n\nJASON_CS: referring to Jason Continuity of Service (Jason-CS), the mission series/instrument class;\nS6A: referring to Sentinel-6A (instead of Sentinel-6B, which is expected to launch in 2025);\nL2: Level 2, the data processing level;\nALT: Altimetry, the data product type and application;\nLR: Low Resolution, versus High Resolution (HR);\nRED: Reduced, the smaller of two datasets distributed at Level 2 (the other being Standard, which contains more variables)\nOST: Ocean Surface Topography, the science domain/team/community;\nNRT: Near Real Time, the data latency; i.e. accessible within 3 hours (vs. STC or NTC; lower latencies)", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", - "Cloud" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#summary-learning-objectives", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#summary-learning-objectives", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Summary & Learning Objectives", - "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with OPERA DSWx data in the cloud\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on users choice; either by classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’), etc.\nVisualizing the dataset based on its classified layer values.\nMosaicking multiple layers into a single layer.\nUtilizing Change Detection for further analysis.", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#discovery", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#discovery", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Discovery", + "text": "Discovery\nThe unique ‘concept-id’ assigned to each PO.DAAC dataset, or ‘collection’, within the Earthdata system is functionally the same as the ShortName in the context of PO.DAAC’s collections in the cloud (because we also assign unique ShortNames). This cell is downloading metadata to retrieve that identifier from an external source, then download metadata about the series of files that make up the time series for the cycle specified by the variable ‘cycle’, and merging to table.\n\nSearch for files/granules\nPick any cycle after cycle 25, which was around the time of the first release of data from S6A. (This cell calls three functions defined in the cell above.)\n\ncycle = 25\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nconcept_id = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ngranules = get_granules(name, cycle=cycle) \n\ngranules[['GranuleUR', 'Start', 'End']].set_index(\"GranuleUR\")\n\n\n\n\n\n\n\n\nStart\nEnd\n\n\nGranuleUR\n\n\n\n\n\n\nS6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02\n2021-07-13T16:26:44.514Z\n2021-07-13T18:22:34.471Z\n\n\nS6A_P4_2__LR_RED__NR_025_003_20210713T182234_20210713T201839_F02\n2021-07-13T18:22:34.522Z\n2021-07-13T20:18:39.482Z\n\n\nS6A_P4_2__LR_RED__NR_025_006_20210713T201839_20210713T215450_F02\n2021-07-13T20:18:39.532Z\n2021-07-13T21:54:50.473Z\n\n\nS6A_P4_2__LR_RED__NR_025_007_20210713T215450_20210713T234732_F02\n2021-07-13T21:54:50.523Z\n2021-07-13T23:47:32.482Z\n\n\nS6A_P4_2__LR_RED__NR_025_009_20210713T234732_20210714T014224_F02\n2021-07-13T23:47:32.533Z\n2021-07-14T01:42:24.454Z\n\n\n...\n...\n...\n\n\nS6A_P4_2__LR_RED__NR_025_245_20210723T050533_20210723T064603_F02\n2021-07-23T05:05:33.543Z\n2021-07-23T06:46:03.471Z\n\n\nS6A_P4_2__LR_RED__NR_025_247_20210723T064603_20210723T083817_F02\n2021-07-23T06:46:03.521Z\n2021-07-23T08:38:17.483Z\n\n\nS6A_P4_2__LR_RED__NR_025_249_20210723T083817_20210723T103256_F02\n2021-07-23T08:38:17.533Z\n2021-07-23T10:32:56.490Z\n\n\nS6A_P4_2__LR_RED__NR_025_251_20210723T103256_20210723T122904_F02\n2021-07-23T10:32:56.540Z\n2021-07-23T12:29:04.459Z\n\n\nS6A_P4_2__LR_RED__NR_025_253_20210723T122904_20210723T142514_F02\n2021-07-23T12:29:04.509Z\n2021-07-23T14:25:14.452Z\n\n\n\n\n125 rows × 2 columns", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", - "Cloud" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#requirements", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#requirements", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can only be run in the following environment: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via and s3fs session; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport Packages\n\nimport os\nimport requests \nimport json\nimport boto3\nimport s3fs\nfrom osgeo import gdal\nimport rasterio as rio\nfrom rasterio.plot import show\nfrom rasterio.merge import merge\nfrom rasterio.io import MemoryFile\nimport matplotlib.pyplot as plt\nfrom matplotlib.patches import Patch\nfrom mpl_toolkits.axes_grid1.inset_locator import inset_axes\nfrom mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes \nfrom mpl_toolkits.axes_grid1.inset_locator import mark_inset\nimport numpy as np\nfrom pathlib import Path\nfrom urllib.request import urlretrieve\nfrom json import dumps\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#access", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#access", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Access", + "text": "Access\nThese functions have nothing to do with Earthdata or PO.DAAC services, all Python 3 standard library except for tqdm and wget:\n\ndef download(source: str):\n target = os.path.basename(source.split(\"?\")[0])\n if not os.path.isfile(target):\n !wget --quiet --continue --output-document $target $source\n return target\n\ndef download_all(urls: list, max_workers: int=12):\n with ThreadPoolExecutor(max_workers=max_workers) as pool:\n workers = pool.map(download, urls)\n return list(tqdm.tqdm(workers, total=len(urls)))\n\n\nExplore dataset variables\nThe S6A level 2 altimetry datasets include variables for sea surface height anomaly (SSHA), significant wave height (SWH), wind speed, others.\n\nopendap_url = f\"https://opendap.earthdata.nasa.gov/collections/{concept_id}\"\n\nurls = granules.GranuleUR.apply(lambda f: f\"{opendap_url}/granules/{f}.nc4\")\n \nurls.iloc[0].replace(\".nc4\", \".html\")\n\n'https://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.html'\n\n\n\n\nGet subsets from OPeNDAP\nPrepare the full request urls by adding a comma-delimited list of variables, after the question mark ?.\n\nvariables = ['data_01_time',\n 'data_01_longitude',\n 'data_01_latitude',\n 'data_01_ku_ssha']\n\nquery = \",\".join(variables)\n\nreqs = urls.apply(lambda x: f\"{x}?{query}\")\n\nprint(reqs.iloc[0])\n\nhttps://opendap.earthdata.nasa.gov/collections/C1968980576-POCLOUD/granules/S6A_P4_2__LR_RED__NR_025_001_20210713T162644_20210713T182234_F02.nc4?data_01_time,data_01_longitude,data_01_latitude,data_01_ku_ssha\n\n\nThe function(s) below download granules from a remote source to a local target file, and reliably manage simultaneous streaming downloads divided between multiple threads.\n\nfiles = download_all(urls=reqs, max_workers=12)\n\n100%|██████████| 125/125 [00:53<00:00, 2.32it/s]\n\n\n\n!du -sh .\n\n16M .\n\n\nWhy this way?\nTo be explained…\nWill it scale?\nThe source netcdf files range from 2500KB to 3000KB per file. The OPeNDAP subsets that we just downloaded are around 100KB a pop. It took less than 10 minutes to download the same subsets for ~1700 files, that covers a period of roughly You can extrapolate to a reasonable estimate for time series of any length (even the whole mission).\nTotal size of the source data is ~4.25GB, based on:\n2500KB x 1700 = 4250000KB (4250 megabytes)\nversus, total size of the subset time series:\n100KB x 1700 = 17000KB (170 megabytes)\nPlot it to put this in context, because our goal is to produce one global grid for the entire cycle of data that we just downloaded.\n\n\nOpen, plot ssh time series\nSort the list of subset files to ensure they concatenate in proper order. Call open_mfdataset on the list to open all the subsets in memory as one dataset in xarray.\n\nds = xr.open_mfdataset(sorted(files), engine=\"netcdf4\")\n\nprint(ds)\n\n<xarray.Dataset>\nDimensions: (data_01_time: 827001)\nCoordinates:\n * data_01_time (data_01_time) datetime64[ns] 2021-07-13T16:26:45 ... ...\nData variables:\n data_01_longitude (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\n data_01_latitude (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\n data_01_ku_ssha (data_01_time) float64 dask.array<chunksize=(6950,), meta=np.ndarray>\nAttributes: (12/63)\n Convention: CF-1.7\n institution: EUMETSAT\n references: Sentinel-6_Jason-CS ALT Generic P...\n contact: ops@eumetsat.int\n radiometer_sensor_name: AMR-C\n doris_sensor_name: DORIS\n ... ...\n xref_solid_earth_tide: S6__P4_2__SETD_AX_20151008T000000...\n xref_surface_classification: S6__P4____SURF_AX_20151008T000000...\n xref_wind_speed_alt: S6A_P4_2__WNDL_AX_20151008T000000...\n product_name: S6A_P4_2__LR______20210713T162644...\n history: 2021-07-13 18:38:07 : Creation\\n2...\n history_json: [{\"$schema\":\"https:\\/\\/harmony.ea...\n\n\nTwo prerequisites to plot based on personal preference:\n\nrename all the variables to drop the group names (because I just think they’re too long as is)\nget a tuple with two timestamps for the start and end of the time series coverage for the cycle\n\nPlot the cycle as a series on a geographic plot, which should look just like the one at the top of this notebook:\n\nnew_variable_names = list(map(lambda x: x.split(\"_\")[-1], variables))\nmap_variable_names = dict(zip(variables, new_variable_names))\nds = ds.rename(map_variable_names).set_coords(['time','longitude','latitude']) # rename variables\n\ntimeframe = (str(ds.time.data[0]).split('T')[0],\n str(ds.time.data[-1]).split('T')[0]) # get timestamps tuple\n\nds.plot.scatter(y=\"latitude\", x=\"longitude\", hue=\"ssha\", \n vmin=-0.4, vmax=0.4, cmap=\"jet\", levels=9, \n aspect=2.5, size=6, s=1, )\nplt.ylim(-67., 67.)\nplt.xlim(0., 360.)\nplt.tight_layout()\nplt.title(f\"ssha for cycle {cycle} ({timeframe})\")\n\nText(0.5, 1.0, \"ssha for cycle 25 (('2021-07-13', '2021-07-23'))\")", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", - "Cloud" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#authentication-with-earthaccess", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#authentication-with-earthaccess", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#process", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#process", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Process", + "text": "Process\n\n0.5-degree grid from ECCO V4r4 (int)\n\nAcknowledgement: pyresample approach shared by Ian Fenty, NASA JPL/ECCO.\n\nECCO V4r4 products are distributed in two spatial formats. One set of collections provides the ocean state estimates on the native model grid (LLC0090) and the other provides them after interpolating to a regular grid defined in geographic coordinates with horizontal cell size of 0.5-degrees. The latitude/longitude grid is distributed as its own collection in one netcdf file: https://search.earthdata.nasa.gov/search/granules?p=C2013583732-POCLOUD\nDownload the ECCO grid geometry netcdf from its https download endpoint in NASA Earthdata Cloud. Open the file and print the header content for the maskC variable, which contains a boolean mask representing the wet/dry state of the area contained in each cell of a 3d grid with dimensions mapped to Z, latitude, and longitude.\n\necco_file = download(\"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/\"\n \"ECCO_L4_GEOMETRY_05DEG_V4R4/GRID_GEOMETRY_ECCO_V4r4_latlon_0p50deg.nc\")\n\necco_grid = xr.open_dataset(ecco_file).isel(Z=0) # select 0 on z-axis\n\necco_mask = ecco_grid.maskC\n\nprint(ecco_grid)\n\n<xarray.Dataset>\nDimensions: (latitude: 360, longitude: 720, nv: 2)\nCoordinates:\n Z float32 -5.0\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8\n latitude_bnds (latitude, nv) float32 ...\n longitude_bnds (longitude, nv) float32 ...\n Z_bnds (nv) float32 ...\nDimensions without coordinates: nv\nData variables:\n hFacC (latitude, longitude) float64 ...\n Depth (latitude, longitude) float64 ...\n area (latitude, longitude) float64 ...\n drF float32 ...\n maskC (latitude, longitude) bool ...\nAttributes: (12/57)\n acknowledgement: This research was carried out by the Jet...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon gri...\n Conventions: CF-1.8, ACDD-1.3\n coordinates_comment: Note: the global 'coordinates' attribute...\n ... ...\n references: ECCO Consortium, Fukumori, I., Wang, O.,...\n source: The ECCO V4r4 state estimate was produce...\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadat...\n summary: This dataset provides geometric paramete...\n title: ECCO Geometry Parameters for the 0.5 deg...\n uuid: b4795c62-86e5-11eb-9c5f-f8f21e2ee3e0\n\n\n\n\nGet ssha variable on 0.5-degree grid\nResample ssha data using kd-tree gaussian weighting neighbour approach. Define a function that implements the following steps:\n\nGenerate two 2d arrays of lats/lons using the permuted 1d coordinates from an input gridded dataset.\nDefine the target grid geometry using the 2d arrays of lats/lons.\nDefine the source grid geometry using the 1d arrays of lats/lons from an input dataset.\n\n\nimport warnings\n\ndef l2alt2grid(source: xr.DataArray, target: xr.DataArray, **options):\n nans = ~np.isnan(source.values)\n data = source.values[nans]\n\n lats = source.latitude.values[nans]\n lons = (source.longitude.values[nans] + 180) % 360 - 180\n src = pr.SwathDefinition(lons, lats)\n\n lons1d = target.longitude.values\n lats1d = target.latitude.values\n lons2d, lats2d = np.meshgrid(lons1d, lats1d)\n tgt = pr.SwathDefinition(lons2d, lats2d)\n\n with warnings.catch_warnings():\n warnings.filterwarnings(\"ignore\", category=UserWarning)\n res, std, cnt = resample_gauss(src, data, tgt, **options)\n \n coords = {'latitude': lats1d, 'longitude': lons1d}\n return (xr.DataArray(res, coords=coords),\n xr.DataArray(std, coords=coords),\n xr.DataArray(cnt, coords=coords), )\n\nSet the gridding parameters in the python dictionary below; then pass it to the function as the last of three required positional arguments (the first two are the source dataset and the dataset that provides the target grid geometry).\n\ngridding_options = dict(\n radius_of_influence = 175000, \n sigmas = 25000,\n neighbours = 100,\n fill_value = np.nan,\n with_uncert = True\n)\n\nresult, stddev, counts = l2alt2grid(ds.ssha, ecco_mask, **gridding_options)\n\nresult.shape == (ecco_grid.latitude.size, \n ecco_grid.longitude.size)\n\nTrue\n\n\n\n\nPlot gridded ssha, gridding statistics\nPlot each array for the output ‘grid’ and the grid statistics ‘stddev’ and ‘counts’.\n\nresult.sel(latitude=slice(-66.,66.)).plot(cmap=\"jet\", vmin=-0.4, vmax=0.4, figsize=(15,6))\n\n\n\n\n\n\n\n\nLook at this plot and adjust gridding parameters as needed to refine ssha grid.\n\nstddev.sel(latitude=slice(-67.,67.)).plot(cmap=\"jet\", robust=True, figsize=(15,6))\n\n\n\n\n\n\n\n\na guess: the yellow areas with lower counts correspond to pass positions at the start/end of the cycle.\n\ncounts.sel(latitude=slice(-67.,67.)).plot(cmap=\"jet\", robust=True, figsize=(15,6))\n\n\n\n\n\n\n\n\n\nresult.sel(latitude=slice(-66.,66.)).to_pandas().T.describe().T\n\n\n\n\n\n\n\n\ncount\nmean\nstd\nmin\n25%\n50%\n75%\nmax\n\n\nlatitude\n\n\n\n\n\n\n\n\n\n\n\n\n-65.75\n304.0\n0.209026\n0.830608\n-1.471174\n-0.069080\n0.039957\n0.259600\n6.104942\n\n\n-65.25\n316.0\n0.216497\n0.479879\n-0.793696\n0.002569\n0.080189\n0.301957\n3.173239\n\n\n-64.75\n326.0\n0.218253\n0.465126\n-0.593413\n0.008729\n0.085963\n0.296550\n2.885002\n\n\n-64.25\n332.0\n0.090540\n0.453919\n-0.909328\n-0.030323\n0.040090\n0.097437\n2.914544\n\n\n-63.75\n371.0\n0.029598\n0.379806\n-0.884937\n-0.064511\n0.001728\n0.062316\n2.879200\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n63.75\n310.0\n0.034539\n0.133022\n-0.580132\n-0.010876\n0.038027\n0.081060\n0.806144\n\n\n64.25\n314.0\n0.018076\n0.118825\n-0.690086\n-0.016610\n0.036694\n0.077421\n0.286705\n\n\n64.75\n311.0\n-0.085785\n1.264886\n-19.397700\n-0.022718\n0.041526\n0.080252\n1.397690\n\n\n65.25\n307.0\n4.177751\n42.431829\n-23.955439\n-0.043362\n0.043002\n0.090967\n505.812000\n\n\n65.75\n290.0\n3.392658\n34.873463\n-10.643720\n-0.075147\n0.058857\n0.105139\n430.164759\n\n\n\n\n264 rows × 8 columns", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", - "Cloud" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#set-up-an-s3fs-session-for-direct-access", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#set-up-an-s3fs-session-for-direct-access", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Set up an s3fs session for Direct Access", - "text": "Set up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data provider.\n\nfs_s3 = Store(auth).get_s3fs_session(daac=\"PODAAC\", provider=\"POCLOUD\")", + "objectID": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#appendix", + "href": "notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html#appendix", + "title": "Sentinel-6 MF L2 Altimetry: OPeNDAP Access and Gridding", + "section": "Appendix", + "text": "Appendix\n\nSentinel-6A MF\nThe Sentinel-6A Michael Freilich radar altimeter mission, or Sentinel-6, produces high-precision measurements of global sea-level. You can learn about the mission and ocean altimetry applications and datasets through the following links:\n\nhttps://www.nasa.gov/sentinel-6\nhttps://sealevel.jpl.nasa.gov/missions/jasoncs/\nhttps://sentinel-6.cnes.fr/en/JASON-CS/index.htm\nhttps://podaac.jpl.nasa.gov/Sentinel-6\n\n\n\nOcean Surface Topography\nThe primary contribution of satellite altimetry to satellite oceanography has been to:\n\nImprove the knowledge of ocean tides and develop global tide models.\nMonitor the variation of global mean sea level and its relationship to changes in ocean mass and heat content.\nMap the general circulation variability of the ocean, including the ocean mesoscale, over decades and in near real-time using multi-satellite altimetric sampling.\n\n\n\n\naltimetry\n\n\nThe Surface Water Ocean Topography (SWOT) mission represents the next-generation of sea surface height observation. It will bring together oceanography and hydrology to focus on gaining a better understanding of the world’s oceans and its terrestrial surface waters. U.S. and French oceanographers and hydrologists have joined forces to develop this new space mission to make the first global survey of Earth’s surface water, observe the fine details of the ocean’s surface topography and measure how water bodies change over time. The payload on SWOT will include a Jason-class radar altimeter that will serve to extend the time series of sea surface height data into the future, beyond the lifespan of Sentinel-6 MF, which is introduced immediately below. Read more about SWOT at: https://podaac.jpl.nasa.gov/SWOT/\n\n\nEarthdata Cloud Services Overview\nThis workflow example downloads subsets of the netcdf datasets via OPeNDAP for massive efficiency gains (network/compute).\nAccess for direct download:\n\nBrowse and download granules through Earthdata Search – https://search.earthdata.nasa.gov/search/granules?p=C1968980576-POCLOUD\nBrowse and download granules from HTTPS endpoints – https://cmr.earthdata.nasa.gov/virtual-directory/collections/C1968980576-POCLOUD\nBrowse and download granules from S3 endpoints (example forthcoming, assuming s3 direct access has been enabled for the collection)\n\nAccess through data services:\nData and metadata are also accessible in reduced forms through higher-level cloud data services, for example:\n\nhttps://harmony.earthdata.nasa.gov/ – Data reduction via on-demand subsetting and other high-level reformatting\n\nInterface to backend services such as data file format conversion, subsetting at L2+, regridding and reprojection at L3+, and more.\nCompatibility depends on the data processing level and data/file format, and so their expected behavior vary also.\nServices available through Harmony API reduce the technical burden on users by covering certain low-level data transformations that a user would normally have to apply themselves, even to simply subset a dataset from OPeNDAP.\n\nhttps://opendap.earthdata.nasa.gov/ – Data reduction via basic subsetting along coordinate dimensions and by variable\n\nRequires more familiarity with the contents of the target dataset, as well knowledge of how to select for data along the dimensions which correspond to space/time coordinates fitting the geographic and temporal coverage of interest.\nUser Guide: https://opendap.github.io/documentation/UserGuideComprehensive.html\n\n\n\n\nPython API References\n\nBash\n\nhttps://www.gnu.org/software/coreutils/manual/html_node/du-invocation.html\n\nPython\n\nhttps://docs.python.org/3/library/functions.html#map\n\nhttps://docs.python.org/3/library/functions.html#zip\nhttps://docs.python.org/3/library/concurrent.futures.html#threadpoolexecutor\n\nnumpy (https://numpy.org/doc/stable/reference)\n\nnumpy.ndarray.data\n\nnumpy.where\n\nnumpy.isnan\n\ndatetimes\n\nnumpy.sum\n\nnumpy.nansum\n\n\nxarray (https://xarray.pydata.org/en/stable)\n\nxarray.DataArray\n\nxarray.DataArray.values\n\nxarray.DataArray.mean\n\nxarray.DataArray.isel\nxarray.open_dataset\nxarray.DataArray.plot\nxarray.Dataset.rename\n\npyresample\n\npyresample.geometry.SwathDefinition\npyresample.kd_tree.resample_gauss", "crumbs": [ "Tutorials", "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", - "Cloud" + "Sentinel-6 Michael Freilich", + "OPeNDAP Access" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#search-using-earthaccess-for-opera-dswx", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#search-using-earthaccess-for-opera-dswx", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Search Using earthaccess for OPERA DSWx", - "text": "Search Using earthaccess for OPERA DSWx\nEach dataset has it’s own unique collection ID. For the OPERA_L3_DSWX-HLS_V1 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Powell Reservoir.\nWe used bbox finder to get the exact coordinates for our area of interest.\nWe want to look at two different times for comparison: 04/11/2023 and 08/30/2023. To find these dates, let’s search for all the data granules between the two.\nFinding 08/30/23 you must search a couple days after at 09/01/23 for when the product was generated for 08/30/23.\n\n#search for the granules using the short name\nopera_results = earthaccess.search_data(short_name=\"OPERA_L3_DSWX-HLS_V1\", temporal= (\"2023-04-11\",\"2023-09-01\"), bounding_box = ('-111.144811','36.980121','-110.250799','37.915625'))\n\nGranules found: 310\n\n\n\nGet S3 Bucket links from search results\nBecause we are working within the AWS cloud, let’s get the S3 bucket links for the 8 desired files. We want to query the dataset based on a specific classified layer ‘B01’ or sensor (‘L8_30_v1.0_B01_WTR’).\nOPERA has 10 different available layers. We will look at ‘B01_WTR’ which is the Water Classification (WTR) layer of the OPERA DSWx dataset. Details on each available layer and the data product can be found here.\n\n#add the S3 bucket links to lists, here we are looking for B01_WTR layer and two dates specified earlier\napril = []\naugust = []\nfor g in opera_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if 'B01_WTR' in l: \n if '20230411' in l:\n april.append(l)\n if '20230830' in l:\n august.append(l)\n\nprint(len(april))\nprint(len(august))\n\n4\n4", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#initiate-data-search", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#initiate-data-search", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Initiate Data Search", + "text": "Initiate Data Search\n\nSTAC_URL = 'https://cmr.earthdata.nasa.gov/stac'\nprovider_cat = Client.open(STAC_URL)\ncatalog = Client.open(f'{STAC_URL}/LPCLOUD/')\n#collections = ['HLSL30.v2.0', 'HLSS30.v2.0']\ncollections = ['HLSL30.v2.0']", "crumbs": [ "Tutorials", - "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "Cloud vs. Local Workflows", + "Reservoir Example", "Cloud" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-dataset", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-dataset", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Visualizing the Dataset", - "text": "Visualizing the Dataset\nLet’s now visualize an individual layer for a single file that was downloaded using Rasterio to read the GeoTIFF image.\n\ns3_url = april[2]\n\n\ns3_file_obj1 = fs_s3.open(s3_url, mode='rb')\n\n\ndsw = rio.open(s3_file_obj1)\ndsw\n\n<open DatasetReader name='/vsipythonfilelike/5f942afb-36e7-448e-8456-360c9ae94618/5f942afb-36e7-448e-8456-360c9ae94618' mode='r'>\n\n\nOPERA is a single band image with specific classified rgb values.\nThis requires to read the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\nimage = dsw.read(1)\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw2 = color_array[image]\n\n\nfig, ax = plt.subplots(figsize=(15,10))\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nax.legend(handles=patches,\n bbox_to_anchor=(1.28, 1),\n facecolor=\"gainsboro\")\n\nplt.imshow(dsw2)\nplt.show()", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#define-date-range-and-region-of-interest", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#define-date-range-and-region-of-interest", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Define Date Range and Region of Interest", + "text": "Define Date Range and Region of Interest\n\ndate_range = \"2021-01/2022-01\"\nroi = {\n \"type\": \"Feature\",\n \"properties\": {},\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -121.60835266113281,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.49874248613119\n ]\n ]\n ]\n }\n }['geometry']\nbase = gv.tile_sources.EsriImagery.opts(width=650, height=500)\nReservoir = gv.Polygons(roi['coordinates']).opts(line_color='yellow', line_width=10, color=None)\nReservoir * base", "crumbs": [ "Tutorials", - "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "Cloud vs. Local Workflows", + "Reservoir Example", "Cloud" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#mosaic-multiple-opera-layers", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#mosaic-multiple-opera-layers", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Mosaic Multiple OPERA Layers", - "text": "Mosaic Multiple OPERA Layers\nWhen creating a mosaic, make sure the temporal range is correct/matching.\nThe mosaic is being created because we have 4 results from the bounding box area provided. If you receive more than 1 result and would like to see a single raster image of all the results, mosaicking is the solution. We define the function below to merge the tiff files for each date and return the composite raster into memory.\n\ndef raster2mosaic(date):\n datasets = []\n for file in date:\n file_path = f\"{file}\"\n file_obj = fs_s3.open(file_path)\n dataset = rio.open(file_obj)\n datasets.append(dataset)\n mosaic, output = merge(datasets) #the merge function will mosaic the raster images\n \n #Saving the output of the mosaicked raster image to memory\n memfile = MemoryFile()\n with memfile.open(driver='GTiff', count = 1, width= mosaic.shape[1], height=mosaic.shape[2] , dtype=np.uint8, transform=output) as dst:\n dst.write(mosaic)\n mosaic_bytes = memfile.read()\n with MemoryFile(mosaic_bytes) as memfile:\n dataset1 = memfile.open()\n raster = dataset1.read(1)\n return raster\n\n\naprilmos = raster2mosaic(april)\naugustmos = raster2mosaic(august)", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#search-for-hls-imagery-matching-search-criteria", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#search-for-hls-imagery-matching-search-criteria", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Search for HLS imagery matching search criteria", + "text": "Search for HLS imagery matching search criteria\n\nsearch = catalog.search(\n collections=collections,\n intersects=roi,\n datetime=date_range,\n limit=100\n)\n\nitem_collection = search.get_all_items()\nsearch.matched()", "crumbs": [ "Tutorials", - "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "Cloud vs. Local Workflows", + "Reservoir Example", "Cloud" ] }, { - "objectID": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-mosaic", - "href": "notebooks/datasets/OPERA_GIS_Cloud.html#visualizing-the-mosaic", - "title": "Working with OPERA Dynamic Surface Water Extent (DSWx) Data:", - "section": "Visualizing the Mosaic", - "text": "Visualizing the Mosaic\nTo visualize the mosaic, you must utilize the single layer colormap.\nThis will be the ‘dsw’ variable used earlier to visualize a single layer. Similarly reading the single band, then creating a numpy array of the specified rgb values. e.g. ‘variable’.colormap\n\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw3 = color_array[aprilmos]\n\n\ncolor_array = np.asarray(\n [dsw.colormap(1)[i] for i in range(256)], dtype=np.uint8)\ndsw4 = color_array[augustmos]\n\n\nfig = plt.figure(figsize=(20, 15))\n\nrows = 1\ncolumns = 2\n\n# Lake Powell 04/11/2023\nfig.add_subplot(rows, columns, 1)\nplt.title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\nplt.imshow(dsw3)\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\n# Lake Powell 08/30/2023\nfig.add_subplot(rows, columns, 2)\nplt.title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\nplt.imshow(dsw4)\n\n#Legend based on specifed classified layer.\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nplt.show()\n\n\n\n\n\n\n\n\n\nTo take a closer look at a specific area of the image, we can create an inset map of a specified area.\n\nfig, ax = plt.subplots(1, 2, figsize=(20, 15))\n\nax[0].imshow(dsw3)\nax[0].set_title(\"OPERA DSWx - Lake Powell: 04/11/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.47,0.35),\n facecolor=\"gainsboro\")\n\nax_ins1 = ax[0].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins1.imshow(dsw3)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins1.set_xlim(x1, x2)\nax_ins1.set_ylim(y1, y2)\nax_ins1.set_xticklabels('')\nax_ins1.set_yticklabels('')\n\nax[0].indicate_inset_zoom(ax_ins1, edgecolor='black')\n\nax[1].imshow(dsw4)\nax[1].set_title(\"OPERA DSWx - Lake Powell: 08/30/2023\")\n\nlegend_labels = {\"white\":\"Not Water\", \"blue\":\"Open Water\", \"lightskyblue\":\"Partial Surface Water\", \"cyan\":\"Snow/Ice\", \"grey\":\"Cloud/Cloud Shadow\"}\npatches = [Patch(color=color, label=label)\n for color, label in legend_labels.items()]\nfig.legend(handles=patches,\n bbox_to_anchor=(0.9, 0.35),\n facecolor=\"gainsboro\")\n\nax_ins2 = ax[1].inset_axes([0.5, 0.5, 0.45, 0.45])\nax_ins2.imshow(dsw4)\n\nx1, x2, y1, y2 = 2200, 2700, 3500, 3000 #Extent set for aoi of inset map.\nax_ins2.set_xlim(x1, x2)\nax_ins2.set_ylim(y1, y2)\nax_ins2.set_xticklabels('')\nax_ins2.set_yticklabels('')\n\nax[1].indicate_inset_zoom(ax_ins2, edgecolor='black')\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nChange Detection\nFurther analysis can involve change detection between the two images, if any gains or losses occurred.\nLooking at the difference by subtracting the latest date to the oldest date.\n\ndifference = np.abs(augustmos - aprilmos)\n\nUtilizing numpy where; by setting the given condition and returning the satisfied conditions. e.g. numpy.where(condition, [x, y, ])\nIn this case, any non-zero values indicate the areas of change between the two images.\nValues closest to 1 shows the greatest gains in change and values closest to zero show the least amount of change.\n\nchange_map = np.where(difference > 0, 1, 0)\n\n\nfig, ax = plt.subplots(figsize=(15,10))\n\n# Defining and zooming into an ROI\nx1, y1, x2, y2 = 1000, 1000, 4500, 4500\nroi = change_map[y1:y2, x1:x2]\n\n# Inversing the colormap\noriginal_cmap = plt.get_cmap('magma')\nreversed_cmap = original_cmap.reversed()\n\nplt.imshow(roi, cmap=reversed_cmap)\nplt.colorbar()\nplt.title('Change Detection between 4/11/23 and 8/30/23')\n\nplt.show()", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Filter imagery for low cloud images and identify image bands needed for water classification", + "text": "Filter imagery for low cloud images and identify image bands needed for water classification\n\ns30_bands = ['B8A', 'B03'] # S30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \nl30_bands = ['B05', 'B03'] # L30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \ncloudcover = 10\n\n\nndwi_band_links = []\n\nfor i in item_collection:\n if i.properties['eo:cloud_cover'] <= cloudcover:\n if i.collection_id == 'HLSS30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = s30_bands\n elif i.collection_id == 'HLSL30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = l30_bands\n\n for a in i.assets:\n if any(b==a for b in ndwi_bands):\n ndwi_band_links.append(i.assets[a].href)\n\n\nndwi_band_links[:10]\n\n\ntile_dicts = defaultdict(list) \n\n\nfor l in ndwi_band_links:\n tile = l.split('.')[-6]\n tile_dicts[tile].append(l)\n\n\ntile_dicts.keys()\n\n\ntile_links = tile_dicts['T10SFJ']\n\n\nbands_dicts = defaultdict(list)\nfor b in tile_links:\n band = b.split('.')[-2]\n bands_dicts[band].append(b)\nfor i in bands_dicts:\n print(i)", "crumbs": [ "Tutorials", - "Dataset Specific", - "OPERA", - "Visualization and Mosaicking", + "Cloud vs. Local Workflows", + "Reservoir Example", "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html#how-to-manually-fix-a-phase-unwrapping-error-in-pixc-data", - "href": "notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html#how-to-manually-fix-a-phase-unwrapping-error-in-pixc-data", - "title": "SWOT PIXC Dataset Phase Unwrapping on a local machine", - "section": "How to manually fix a phase unwrapping error in PIXC data", - "text": "How to manually fix a phase unwrapping error in PIXC data\n\nRequirement:\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\nLearning Objectives:\n\nLearn how to identify phase unwrapping errors\nLearn how to correct a phase unwrapping error by adding multiples of 2pi to the phase\nAccess SWOT PIXC data products (archived in NASA Earthdata Cloud) by downloading to local machine\nVisualize accessed data, identify phase unwrapping error, break phase unwrapping regions, find best ambiguity, correct the height and locations\n\n\nSWOT Level 2 KaRIn High Rate Version 2.0 Datasets:\n\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_L2_HR_PIXCVec_2.0\n\n\n\n\nBackground\nThis notebook targets expert users, and assumes the reader is already familiarized with terms like “layover”, “phase unwrapping”, and “backscatter”/“phase”. For detailed background on SWOT definitions and conventions, see the SWOT User Handbook .\nNotebook Author: Brent Williams (NASA JPL, July 2024)\nLast updated: 18 July 2024\n\n\nLibraries Needed\n\nimport glob\nimport h5netcdf\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport earthaccess\nimport scipy.ndimage\nimport contextily as cx\nimport dask # I was getting errors not having this\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n1. Water Mask Pixel Cloud NetCDF\n\n\nSearch for data collection and time of interest\n\npixc_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_PIXC_2.0', \n granule_name = '*525_020_171R_*') # Santana do Sobrado, cycle 525 pass 020 tile 171R\n\nGranules found: 1\n\n\nLet’s download one data file! Since earthaccess.download requires the input to be in list format, we need to enclose the single file in brackets.\n\nearthaccess.download([pixc_results[0]], \"./data_downloads\")\n\n Getting 1 granules, approx download size: 0.4 GB\n\n\n\n\n\n\n\n\n\n\n\n['data_downloads\\\\SWOT_L2_HR_PIXC_525_020_171R_20230519T064311_20230519T064322_PGC0_01.nc']\n\n\n\n\nOpen data using xarray\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). We will focus on the “pixel cloud” group. In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(\"data_downloads/SWOT_L2_HR_PIXC_*525_020_171R*.nc\", group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (points: 4584708, complex_depth: 2,\n num_pixc_lines: 3253)\nCoordinates:\n latitude (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n longitude (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\nDimensions without coordinates: points, complex_depth, num_pixc_lines\nData variables: (12/61)\n azimuth_index (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n range_index (points) float64 dask.array<chunksize=(4584708,), meta=np.ndarray>\n interferogram (points, complex_depth) float32 dask.array<chunksize=(4584708, 2), meta=np.ndarray>\n power_plus_y (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n power_minus_y (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n coherent_power (points) float32 dask.array<chunksize=(4584708,), meta=np.ndarray>\n ... ...\n pixc_line_qual (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n pixc_line_to_tvp (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_first_valid (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_last_valid (num_pixc_lines) float64 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_first_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\n data_window_last_cross_track (num_pixc_lines) float32 dask.array<chunksize=(3253,), meta=np.ndarray>\nAttributes:\n description: cloud of geolocated interferogram pixels\n interferogram_size_azimuth: 3253\n interferogram_size_range: 4598\n looks_to_efflooks: 1.5394042762332962\n num_azimuth_looks: 7.0\n azimuth_offset: 9xarray.DatasetDimensions:points: 4584708complex_depth: 2num_pixc_lines: 3253Coordinates: (2)latitude(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudeunits :degrees_northquality_flag :geolocation_qualvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nlongitude(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudeunits :degrees_eastquality_flag :geolocation_qualvalid_min :-180.0valid_max :180.0comment :Longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nData variables: (61)azimuth_index(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :rare interferogram azimuth indexunits :1valid_min :0valid_max :999999comment :Rare interferogram azimuth index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nrange_index(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :rare interferogram range indexunits :1valid_min :0valid_max :999999comment :Rare interferogram range index (indexed from 0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninterferogram(points, complex_depth)float32dask.array<chunksize=(4584708, 2), meta=np.ndarray>long_name :rare interferogramunits :1quality_flag :interferogram_qualvalid_min :-1e+20valid_max :1e+20comment :Complex unflattened rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708, 2)\n(4584708, 2)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 2 4584708\n\n\n\n\npower_plus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :power for plus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the plus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npower_minus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :power for minus_y channelunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power for the minus_y channel (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ncoherent_power(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :coherent power combination of minus_y and plus_y channelsunits :1quality_flag :interferogram_qualvalid_min :0.0valid_max :1e+20comment :Power computed by combining the plus_y and minus_y channels coherently by co-aligning the phases (arbitrary units that give sigma0 when noise subtracted and normalized by the X factor).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nx_factor_plus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :X factor for plus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the plus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nx_factor_minus_y(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :X factor for minus_y channel powerunits :1valid_min :0.0valid_max :1e+20comment :X factor for the minus_y channel power in linear units (arbitrary units to normalize noise-subtracted power to sigma0).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nwater_frac(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :water fractionunits :1quality_flag :classification_qualvalid_min :-1000.0valid_max :10000.0comment :Noisy estimate of the fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nwater_frac_uncert(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :water fraction uncertaintyunits :1valid_min :0.0valid_max :999999.0comment :Uncertainty estimate of the water fraction estimate (width of noisy water frac estimate distribution).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nclassification(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :classificationquality_flag :classification_qualflag_meanings :land land_near_water water_near_land open_water dark_water low_coh_water_near_land open_low_coh_waterflag_values :[1 2 3 4 5 6 7]valid_min :1valid_max :7comment :Flags indicating water detection results.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nfalse_detection_rate(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :false detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting water when there is none.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmissed_detection_rate(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :missed detection rateunits :1quality_flag :classification_qualvalid_min :0.0valid_max :1.0comment :Probability of falsely detecting no water when there is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nprior_water_prob(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :prior water probabilityunits :1valid_min :0.0valid_max :1.0comment :Prior probability of water occurring.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nbright_land_flag(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :bright land flagstandard_name :status_flagflag_meanings :not_bright_land bright_land bright_land_or_waterflag_values :[0 1 2]valid_min :0valid_max :2comment :Flag indicating areas that are not typically water but are expected to be bright (e.g., urban areas, ice). Flag value 2 indicates cases where prior data indicate land, but where prior_water_prob indicates possible water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nlayover_impact(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :layover impactunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the height error caused by layover, which may not be reliable on a pixel by pixel basis, but may be useful to augment aggregated height uncertainties.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\neff_num_rare_looks(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :effective number of rare looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken to form the rare interferogram.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nheight(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :height above reference ellipsoidunits :mquality_flag :geolocation_qualvalid_min :-1500.0valid_max :15000.0comment :Height of the pixel above the reference ellipsoid.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ncross_track(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :approximate cross-track locationunits :mquality_flag :geolocation_qualvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npixel_area(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :pixel areaunits :m^2quality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Pixel area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninc(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :incidence angleunits :degreesquality_flag :geolocation_qualvalid_min :0.0valid_max :999999.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nphase_noise_std(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase noise standard deviationunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Estimate of the phase noise standard deviation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndlatitude_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of latitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the latitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndlongitude_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of longitude estimate to interferogram phaseunits :degrees/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the longitude estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_dphase(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to interferogram phaseunits :m/radianquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferogram phase.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_droll(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to spacecraft rollunits :m/degreesquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the spacecraft roll.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_dbaseline(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to interferometric baselineunits :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the interferometric baseline.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndheight_drange(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of height estimate to range (delay)units :m/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the height estimate to the range (delay).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ndarea_dheight(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sensitivity of pixel area to reference heightunits :m^2/mquality_flag :geolocation_qualvalid_min :-999999.0valid_max :999999.0comment :Sensitivity of the pixel area to the reference height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nillumination_time(points)datetime64[ns]dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nillumination_time_tai(points)datetime64[ns]dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\neff_num_medium_looks(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :effective number of medium looksunits :1valid_min :0.0valid_max :999999.0comment :Effective number of independent looks taken in forming the medium interferogram (after adaptive averaging).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sigma0units :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_uncert(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :sigma0 uncertaintyunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in the sig0 measurement. The value is given as an additive (not multiplicative) linear term (not a term in decibels).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nphase_unwrapping_region(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase unwrapping region indexunits :1valid_min :-1valid_max :99999999comment :Phase unwrapping region index.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nambiguity_cost1(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase ambiguity minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nambiguity_cost2(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :phase ambiguity 2nd minimum costunits :1valid_min :-999999.0valid_max :999999.0comment :Phase ambiguity 2nd minimum cost.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_range_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument range correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to range before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_phase_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument phase correctionunits :radiansvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to phase before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninstrument_baseline_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :instrument baseline correctionunits :mvalid_min :-999999.0valid_max :999999.0comment :Term that incorporates all calibration corrections applied to baseline before geolocation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_cor_atmos_model(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0 and x_factor_plus_y and x_factor_minus_y.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nheight_cor_xover(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :height correction from KaRIn crossoversunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmodel_dry_tropo_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nmodel_wet_tropo_cor(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\niono_cor_gim_ka(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported pixel height, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported pixel height results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ngeoid(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)units :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsolid_earth_tide(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)units :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nload_tide_fes(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nload_tide_got(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth's crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npole_tide(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)units :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth's crust). This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nancillary_surface_classification_flag(points)float32dask.array<chunksize=(4584708,), meta=np.ndarray>long_name :surface classificationstandard_name :status_flagsource :MODIS/GlobCoverinstitution :European Space Agencyflag_meanings :open_ocean land continental_water aquatic_vegetation continental_ice_snow floating_ice salted_basinflag_values :[0 1 2 3 4 5 6]valid_min :0valid_max :6comment :7-state surface type classification computed from a mask built with MODIS and GlobCover data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n18.34 MB\n18.34 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ninterferogram_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :rare_power_suspect rare_phase_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded rare_power_bad rare_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 2048 4096 8192 16384 32768 262144\n 524288 134217728 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4161599488comment :Quality flag for the interferogram quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nclassification_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :no_coherent_gain power_close_to_noise_floor detected_water_but_no_prior_water detected_water_but_bright_land water_false_detection_rate_suspect coherent_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded coherent_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 2048\n 8192 16384 32768 262144 524288 134217728\n 536870912 1073741824 2147483648]valid_min :0valid_max :3893159967comment :Quality flag for the classification quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\ngeolocation_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :layover_significant phase_noise_suspect phase_unwrapping_suspect model_dry_tropo_cor_suspect model_wet_tropo_cor_suspect iono_cor_gim_ka_suspect xovercal_suspect medium_phase_suspect tvp_suspect sc_event_suspect small_karin_gap specular_ringing_degraded model_dry_tropo_cor_missing model_wet_tropo_cor_missing iono_cor_gim_ka_missing xovercal_missing geolocation_is_from_refloc no_geolocation_bad medium_phase_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 16 32\n 64 4096 8192 16384 32768 524288\n 1048576 2097152 4194304 8388608 16777216 134217728\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4193841279comment :Quality flag for the geolocation quantities in the pixel cloud data\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\nsig0_qual(points)float64dask.array<chunksize=(4584708,), meta=np.ndarray>standard_name :status_flagflag_meanings :sig0_uncert_suspect sig0_cor_atmos_suspect noise_power_suspect xfactor_suspect rare_power_suspect tvp_suspect sc_event_suspect small_karin_gap in_air_pixel_degraded specular_ringing_degraded sig0_cor_atmos_missing noise_power_bad xfactor_bad rare_power_bad tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 2 4 8 2048 8192\n 16384 32768 262144 524288 1048576 33554432\n 67108864 134217728 536870912 1073741824 2147483648]valid_min :0valid_max :3994871823comment :Quality flag for sig0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n36.68 MB\n36.68 MB\n\n\nShape\n(4584708,)\n(4584708,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 4584708 1\n\n\n\n\npixc_line_qual(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>standard_name :status_flagflag_meanings :not_in_tile tvp_suspect sc_event_suspect small_karin_gap tvp_bad sc_event_bad large_karin_gapflag_masks :[ 1 8192 16384 32768 536870912 1073741824\n 2147483649]valid_min :0valid_max :3758153729comment :Quality flag for pixel cloud data per rare-posted interferogram line (similar to slc_qual in the L1B_HR_SLC product)\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\npixc_line_to_tvp(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud rare line to tvp indexunits :1valid_min :0.0valid_max :999999.0comment :Pixel cloud rare radar grid line index to tvp index mapping\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_first_valid(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window starting indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window starting index of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_last_valid(num_pixc_lines)float64dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window ending indexunits :1valid_min :0valid_max :999999comment :Pixel cloud data window ending index of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n26.02 kB\n26.02 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_first_cross_track(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window starting cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window starting cross-track distance in meters of first valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\ndata_window_last_cross_track(num_pixc_lines)float32dask.array<chunksize=(3253,), meta=np.ndarray>long_name :pixel cloud data window ending cross-track distanceunits :mvalid_min :-75000.0valid_max :75000.0comment :Pixel cloud data window ending cross-track distance in meters of last valid pixel in the range direction\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n13.01 kB\n13.01 kB\n\n\nShape\n(3253,)\n(3253,)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 3253 1\n\n\n\n\nIndexes: (0)Attributes: (6)description :cloud of geolocated interferogram pixelsinterferogram_size_azimuth :3253interferogram_size_range :4598looks_to_efflooks :1.5394042762332962num_azimuth_looks :7.0azimuth_offset :9\n\n\n\n\nPlot the PIXC data only for good/detected water\n\n# set Coordinate Reference System (CRS) as WGS84 for contextily basemap\ncrs='EPSG:4326'\n\n\n# Create a mask to filter out good water pixels based on classification and geolocation quality\n# - ds_PIXC.classification > 2: selects pixels classified as water\n# - ds_PIXC.geolocation_qual < 4: selects pixels with good geolocation quality\nmask = np.where(np.logical_and(ds_PIXC.classification > 2, ds_PIXC.geolocation_qual <4))\nfig, ax = plt.subplots(figsize=(15,5))\nscat = ax.scatter(x=ds_PIXC.longitude[mask], y=ds_PIXC.latitude[mask], c=ds_PIXC.height[mask],\n s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\nfig.colorbar(scat).set_label('height (m)')\n\n\n\n\n\n\n\n\nConverting a wrapped, ambiguous InSAR phase (known only within a 2π interval) to an absolute phase is known as phase unwrapping. Phase unwrapping errors happen when incorrect multiples of 2π are added to the wrapped phase, leading to errors in both height and geolocation. Note in the above image how the river at the outlet of the reservoir is unrealistically higher than the reservoir. The large height offset, along with a large cross-track slope and a shifted geolocation (e.g., relative to the water in the basemap image) are characteristic signatures of a phase unwrapping error. This can happen especially near dams where the water on both sides ends up in the same spatial phase unwrapping region. In such a case as this, a single absolute ambiguity is assigned to the entire region that includes both the reservoir and the river, while the phase/height discontinuity at the dam is not well captured within one phase ambiguity.\nThe way to correct this is by splitting the region into two (i.e., one for the reservoir and one for the river) and assigning a separate phase ambiguity to each region (i.e., a different multiple of 2π). We will do this processing in the slant-plane image (e.g., in radar coordinates) because the spatial connectedness/topology is preserved among adjacent pixels without the additional geolocation noise that exists in the phase-geolocated lat/lon projection.\n\n\nMake function to map a PIXC variable to slant-plane/radar coordiantes\n\ndef toslant(pixc, key='height'):\n az = pixc.azimuth_index.astype(int)\n rng = pixc.range_index.astype(int)\n out = np.zeros((pixc.interferogram_size_azimuth + 1, pixc.interferogram_size_range + 1)) + np.nan\n # handle complex interferogram\n if key=='interferogram':\n out = out.astype('complex64')\n var = pixc[key][:,0] + 1j * pixc[key][:,1]\n else:\n var = pixc[key]\n out[az, rng] = var\n return out\n\n\n\nGet the desired data variables in slant plane\n\nheight = toslant(ds_PIXC, key='height')\nlat = toslant(ds_PIXC, key='latitude')\nlon = toslant(ds_PIXC, key='longitude')\nklass = toslant(ds_PIXC, key='classification')\nregion = toslant(ds_PIXC, key='phase_unwrapping_region')\ndheight_dphase = toslant(ds_PIXC, key='dheight_dphase')\ndlat_dphase = toslant(ds_PIXC, key='dlatitude_dphase')\ndlon_dphase = toslant(ds_PIXC, key='dlongitude_dphase')\nifgram = toslant(ds_PIXC, key='interferogram')\npower_plus_y = toslant(ds_PIXC, key='power_plus_y')\npower_minus_y = toslant(ds_PIXC, key='power_minus_y')\ncross_track = toslant(ds_PIXC, key='cross_track')\n\n\n\nPlot the height image in slant-plane (for all pixels)\n\nplt.imshow(height, interpolation='none', cmap='jet', aspect='auto')\nplt.clim((300,400))\nplt.colorbar().set_label('height (m)')\n\n\n\n\n\n\n\n\n\n\nPlot the phase unwrapping regions\nA key step in SWOT’s phase unwrapping algorithm is to separate the image into regions where a single phase ambiguity is expected to be shared. These are referred to as “phase unwrapping regions” and are accessible in the PIXC product. Note that both the reservoir and the river both have the same phase unwrapping region id (e.g., region==2).\n\nplt.imshow(region, interpolation='none', cmap='tab10', aspect='auto')\nplt.clim((-1,8))\nplt.colorbar().set_label('phase unwrapping region')\n\n\n\n\n\n\n\n\n\n\nGet a mask for only the pixels in region 2\n\nmask = np.where(region == 2)\nregion_mask = np.zeros_like(region)\nregion_mask[mask] = 1\nplt.imshow(region_mask, interpolation='none', cmap='tab10', aspect='auto')\nplt.colorbar().set_label('phase unwrapping 2')\n\n\n\n\n\n\n\n\n\n\n\nPlot the classification image\nWater-water layover describes the phenomenon where multiple waterbodies are in layover. This is in contrast to land-water layover, where land overlies water. Note that when water-water layover occurs, the backscattering (i.e. sig0) is bright, but the coherence tends to be low (because the phase from the two laid-over water-bodies with different heights/phases mix together). Water-water-layover tends to happen near dams/reservoir outlets, although it depends on the relative orientation in the swath. When water-water-layover happens near a dam, the coherence tends to drop right near the transition between reservoir and river. Thus, we can use the low-coherence water classes in the classification image to help split the regions in two.\n\n# plot the classification image\nplt.imshow(klass, interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('classification')\n\n\n\n\n\n\n\n\n\n# zoom in around the dam\nplt.imshow(klass[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('classification')\n\n\n\n\n\n\n\n\n\n\nUse the low-coherence zone to break the image into multiple segments\nAs mentioned above, we expect water-water-layover near a dam to have a low-coherence zone the coherence right by the transition between reservoir and river. These low-coherence zones are assigned their own classification value in the PIXC product. Here, we use the low-coherence water classes in the classification image to help split the regions in two. This will address the problem where the river channel and reservoir share a phase unwrapping region.\n\n# plot the zoomed-in interferometric coherence for reference\ncoh = abs(ifgram) / np.sqrt(power_plus_y * power_minus_y)\nplt.imshow(coh[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('interferometric coherence')\n\n\n\n\n\n\n\n\n\n# plot the zoomed-in region mask for reference\nplt.imshow(region_mask[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('region mask before')\n\n\n\n\n\n\n\n\n\n\nBreak the region at low-coherence/bright areas by zeroing out low-coherence areas from the mask\n\nlow_coh = np.zeros_like(region_mask)\n#low_coh[coh<0.5] = 1\n## do some dilations to make sure the water-water-layover area is chopped out\n#low_coh = scipy.ndimage.binary_dilation(low_coh)\n## dont do this close to swath edges since the coherence is lower there and we get a bunch of pixels detected as low-coherence\n#low_coh [cross_track<20000] = 0\n#low_coh [cross_track>80000] = 0\nlow_coh[klass>=6] = 1\nregion_mask[low_coh>0] = 0\nplt.imshow(region_mask[1000:1500,2000:3000], interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('region mask after')\n\n\n\n\n\n\n\n\n\nNow segment the mask into multiple disconnected regions\n\n# segment the mask\nlab, nlabs = scipy.ndimage.label(region_mask)\nplt.imshow(lab, interpolation='none', cmap='jet', aspect='auto')\nplt.clim((0,2))\nplt.colorbar().set_label('segmented mask')\n\n\n\n\n\n\n\n\n\n\nSplit out the biggest segment (the reservoir) from the rest (river)\n\nnew_regions = np.zeros_like(region)\nnew_regions[lab==1] = 1 # the biggest one (i.e., the reservoir)\nnew_regions[lab>1] = 2 # the rest\nplt.imshow(new_regions, interpolation='none', cmap='jet', aspect='auto')\nplt.colorbar().set_label('new_regions')\n\n\n\n\n\n\n\n\n\n\nAdjust the height and locations corresponding to 2π phase offsets\nNote that this approach of moving along the geolocation sensitivities to phase (e.g., dheight_dphase, dlat_dphase, dlon_dphase) is an approximation. The more robust thing to do would be to add/subtract 2π increments to the absolute phase and regeolocate each pixel. The approximation is generally good if we are only moving a few ambiguities away, but gets worse if we need to move many multiples of 2π.\n\n# set up some more masks\nriver_mask = np.zeros_like(new_regions) + np.nan\nriver_mask[new_regions==2] = 1\nriver_msk = river_mask==1\nlake_msk = new_regions==1\n\n\n\nTry adjusting the river region by +1 ambiguity\n\nn = 1 # first, we try a +1 phase ambiguity\nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nNope! By the bad geolocation and unrealistic river slope, we can see that made things worse.\n\n\nTry adjusting river by -1 ambiguity (in the other direction)\n\nn = -1 # now, let's try a -1 phase ambiguity\nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nThat looks right. The river lines up better with the basemap, the height and slope of the river seem more realistic. But we should check the -2 ambiguity to be sure there is not an even better solution.\n\n\nTry adjusting river by -2 ambiguities\n\nn = -2. # now, let's try a -2 phase ambiguity \nnew_height = height + dheight_dphase * 2*n*np.pi\nnew_lat = lat + dlat_dphase * 2*n*np.pi\nnew_lon = lon + dlon_dphase * 2*n*np.pi\n\n\nfig, ax = plt.subplots(figsize=(15,5))\nscat_lake = ax.scatter(lon[lake_msk], lat[lake_msk], c=height[lake_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\nscat_river = ax.scatter(new_lon[river_msk], new_lat[river_msk], c=new_height[river_msk], s=0.1, edgecolor='none', cmap='jet', clim=(300,400))\ncx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\nax.set_xlabel('lon')\nax.set_ylabel('lat')\ncbar = fig.colorbar(scat_lake, ax=ax)\ncbar.set_label('height (m)')\n\n\n\n\n\n\n\n\nNope. That’s not it either. Now the river is shifted too much in the other direction and has a large slope flowing the wrong way (into the reservoir). This means that the best ambiguity for the river is -1!\n\n\nAlternative Plots\n\n# alternative plots with wrapped heights\n# original ambiguity\n#fig, ax = plt.subplots(figsize=(15,5))\n#ax.scatter(lon[lake_msk], lat[lake_msk], c=np.mod(height[lake_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#ax.scatter(lon[river_msk], lat[river_msk], c=np.mod(height[river_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#cx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap, aspect='auto')\n#ax.set_xlabel('lon')\n#ax.set_ylabel('lat')\n#fig.colorbar(scat).set_label('height (m), 1m wrap')\n\n\n# adjusted ambiguity\n#fig, ax = plt.subplots(figsize=(15,5))\n#ax.scatter(lon[lake_msk], lat[lake_msk], c=np.mod(height[lake_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#ax.scatter(new_lon[river_msk], new_lat[river_msk], c=np.mod(new_height[river_msk],1), s=0.1, edgecolor='none', cmap='hsv', clim=(0,1))\n#cx.add_basemap(ax, crs=crs, source=cx.providers.OpenTopoMap)\n#ax.set_xlabel('lon')\n#ax.set_ylabel('lat')\n#fig.colorbar(scat).set_label('height (m), 1m wrap')", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#locate-images-in-amazon-s3-storage", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#locate-images-in-amazon-s3-storage", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Locate Images in Amazon S3 Storage", + "text": "Locate Images in Amazon S3 Storage\n\npath_dicts = defaultdict(list)\nfor l in bands_dicts['B05']:\n s3l = l.replace('https://data.lpdaac.earthdatacloud.nasa.gov/', 's3://')\n path_dicts['B05'].append(s3l)\n \ns3paths_LB3 = []\nfor l in bands_dicts['B03']:\n s3l = l.replace('https://data.lpdaac.earthdatacloud.nasa.gov/', 's3://')\n if s3l[38:39] == 'L':\n path_dicts['B03'].append(s3l)\n\n\ns3_cred_endpoint = 'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials'\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\ntemp_creds_req = get_temp_creds()\nsession = boto3.Session(aws_access_key_id=temp_creds_req['accessKeyId'], \n aws_secret_access_key=temp_creds_req['secretAccessKey'],\n aws_session_token=temp_creds_req['sessionToken'],\n region_name='us-west-2')\n\n\nrio_env = rio.Env(AWSSession(session),\n GDAL_DISABLE_READDIR_ON_OPEN='EMPTY_DIR',\n GDAL_HTTP_COOKIEFILE=os.path.expanduser('~/cookies.txt'),\n GDAL_HTTP_COOKIEJAR=os.path.expanduser('~/cookies.txt'))\nrio_env.__enter__()", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "PIXC Phase Unwrap" + "Cloud vs. Local Workflows", + "Reservoir Example", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#local-machine-download-version", - "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#local-machine-download-version", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Local Machine Download Version", - "text": "Local Machine Download Version\n\nAuthor: Nicholas Tarpinian, PO.DAAC", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#load-images-and-visualize", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#load-images-and-visualize", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Load images and visualize", + "text": "Load images and visualize\n\ndef time_index_from_filenames(file_links):\n return [datetime.strptime(f.split('.')[-5], '%Y%jT%H%M%S') for f in file_links]\n\n\ntime = xr.Variable('time', time_index_from_filenames(path_dicts['B03']))\nchunks=dict(band=1, x=512, y=512)\nhls_ts_da_LB3 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B03']], dim=time)\nhls_ts_da_LB5 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B05']], dim=time)\nhls_ts_da_LB3 = hls_ts_da_LB3.rio.reproject(\"epsg:4326\")\nhls_ts_da_LB5 = hls_ts_da_LB5.rio.reproject(\"epsg:4326\")\n\n\nhls_ts_da_data_LB3 = hls_ts_da_LB3.load()\nhls_ts_da_data_LB5 = hls_ts_da_LB5.load()\nhls_ts_da_data_LB3 = hls_ts_da_data_LB3.rio.clip([roi])\nhls_ts_da_data_LB5 = hls_ts_da_data_LB5.rio.clip([roi])\n\n\nhls_ts_da_data_LB5.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='gray').opts(clim=(0,2000))", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Raster Multifile", - "Local" + "Cloud vs. Local Workflows", + "Reservoir Example", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#summary-learning-objectives", - "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#summary-learning-objectives", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Summary & Learning Objectives", - "text": "Summary & Learning Objectives\n\nNotebook showcasing how to work with multiple files from the SWOT Raster Image data product version 2.0 on a local machine\n\nUtilizing the earthaccess Python package. For more information visit: https://nsidc.github.io/earthaccess/\nOption to query the new dataset based on user’s choice; choosing between two resolutions either by ‘100m’ or ‘250m’.\nVisualizing multiple raster images on a single map.\nStacking multiple raster images and creating a time dimension to analyze over time.\nAdjusting images based on quality flag", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas", + "text": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas\n\nLB3 = hls_ts_da_data_LB3 \nLB5 = hls_ts_da_data_LB5\nNDWI = (LB3-LB5)/(LB3+LB5)\nNDWI.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='coolwarm').opts(clim=(-0.5,0.5))\n\n\nwater = NDWI>0\nwater.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='PuOr').opts(clim=(0,1))", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Raster Multifile", - "Local" + "Cloud vs. Local Workflows", + "Reservoir Example", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#requirements", - "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#requirements", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial is written to run in the following environment: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport os\nfrom os.path import isfile, basename, abspath\nimport xarray as xr\nimport numpy as np\nfrom datetime import datetime\nfrom pathlib import Path\nimport hvplot\nimport hvplot.xarray \nimport earthaccess", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-surface-area-of-reservoir-and-plot-time-series", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html#caclulate-surface-area-of-reservoir-and-plot-time-series", + "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Cloud Version", + "section": "Caclulate surface area of reservoir and plot time series", + "text": "Caclulate surface area of reservoir and plot time series\n\nif water.variable.max() == True:\n water_real = water*30*30\nwater_area = water_real.sum(axis=(1,2))\n\n%matplotlib inline\n\nfig, ax = plt.subplots()\n(water_area[:]/1000000).plot(ax=ax, linewidth=2, linestyle = '-', marker='o')\nax.set_title(\"Surface area of waterbody in km2\")\nax.set_ylabel('Area [km^2]')", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Raster Multifile", - "Local" + "Cloud vs. Local Workflows", + "Reservoir Example", + "Cloud" ] }, { - "objectID": "notebooks/datasets/SWOT_Raster_Notebook_local.html#authentication-with-earthaccess", - "href": "notebooks/datasets/SWOT_Raster_Notebook_local.html#authentication-with-earthaccess", - "title": "Working with SWOT Level 2 Water Mask Raster Image Data Product:", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch for SWOT Raster products using earthaccess\nEach dataset has it’s own unique collection concept ID. For the SWOT_L2_HR_Raster_2.0 dataset, we can find the collection ID here.\nFor this tutorial, we are looking at the Lake Mead Reservoir in the United States.\nWe used bbox finder to get the exact coordinates for our area of interest.\n\nresults = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-115.112686,35.740939,-114.224167,36.937819),\n temporal =('2024-02-01 12:00:00', '2024-02-01 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 2\n\n\n\nearthaccess.download(results, \"data_downloads/SWOT_Raster_LakeMead/\")\n\n Getting 2 granules, approx download size: 0.07 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_045F_20240201T183814_20240201T183835_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_046F_20240201T183834_20240201T183855_PIC0_01.nc\n\n\n['data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_045F_20240201T183814_20240201T183835_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_218_046F_20240201T183834_20240201T183855_PIC0_01.nc']\n\n\n\n\nVisualizing Multiple Tiles\nLet’s now visualize multiple raster tiles in a folder and explore the data.\nUtilizing xarray.open_mfdataset which supports the opening of multiple files.\n\nfolder_path = \"data_downloads/SWOT_Raster_LakeMead/\"\n\nfile_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith('.nc')]\n\n\nds = xr.open_mfdataset(file_paths, combine='nested', concat_dim='x')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (y: 2784, x: 3074)\nCoordinates:\n * y (y) float64 3.899e+06 3.899e+06 ... 4.177e+06\n * x (x) float64 5.682e+05 5.683e+05 ... 6.928e+05\nData variables: (12/39)\n crs (x) object b'1' b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(512, 512), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(512, 512), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(2784, 1536), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(768, 768), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(768, 768), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T08:50:33Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 568200.0\n x_max: 721700.0\n y_min: 3898600.0\n y_max: 4052100.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:y: 2784x: 3074Coordinates: (2)y(y)float643.899e+06 3.899e+06 ... 4.177e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3898600., 3898700., 3898800., ..., 4176700., 4176800., 4176900.])x(x)float645.682e+05 5.683e+05 ... 6.928e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([568200., 568300., 568400., ..., 692600., 692700., 692800.])Data variables: (39)crs(x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1', ..., b'1', b'1', b'1'], dtype=object)longitude(y, x)float64dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(512, 512), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n2.87 MiB\n\n\nShape\n(2784, 3074)\n(734, 513)\n\n\nDask graph\n30 chunks in 23 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n65.29 MiB\n7.32 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(2784, 1536), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n16.33 MiB\n\n\nShape\n(2784, 3074)\n(2784, 1538)\n\n\nDask graph\n2 chunks in 21 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(768, 768), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.65 MiB\n3.66 MiB\n\n\nShape\n(2784, 3074)\n(1247, 769)\n\n\nDask graph\n12 chunks in 23 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 3074 2784\n\n\n\n\nIndexes: (2)yPandasIndexPandasIndex(Float64Index([3898600.0, 3898700.0, 3898800.0, 3898900.0, 3899000.0, 3899100.0,\n 3899200.0, 3899300.0, 3899400.0, 3899500.0,\n ...\n 4176000.0, 4176100.0, 4176200.0, 4176300.0, 4176400.0, 4176500.0,\n 4176600.0, 4176700.0, 4176800.0, 4176900.0],\n dtype='float64', name='y', length=2784))xPandasIndexPandasIndex(Float64Index([568200.0, 568300.0, 568400.0, 568500.0, 568600.0, 568700.0,\n 568800.0, 568900.0, 569000.0, 569100.0,\n ...\n 691900.0, 692000.0, 692100.0, 692200.0, 692300.0, 692400.0,\n 692500.0, 692600.0, 692700.0, 692800.0],\n dtype='float64', name='x', length=3074))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T08:50:33Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :218scene_number :46tile_numbers :[90 91 92 93 90 91 92 93]tile_names :218_090L, 218_091L, 218_092L, 218_093L, 218_090R, 218_091R, 218_092R, 218_093Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T18:38:34.265833Ztime_granule_end :2024-02-01T18:38:55.360807Ztime_coverage_start :2024-02-01T18:38:34.807712Ztime_coverage_end :2024-02-01T18:38:54.816495Zgeospatial_lon_min :-116.24045666354958geospatial_lon_max :-114.55674281329392geospatial_lat_min :35.225727504637376geospatial_lat_max :36.5951883116925left_first_longitude :-114.84459394683485left_first_latitude :36.5951883116925left_last_longitude :-114.55674281329392left_last_latitude :35.46460890403489right_first_longitude :-116.24045666354958right_first_latitude :36.350992807631336right_last_longitude :-115.93433361296329right_last_latitude :35.225727504637376xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_092L_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_093L_20240201T183854_20240201T183905_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_091R_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_092R_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXC_010_218_093R_20240201T183854_20240201T183905_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_218_090L_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091L_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_092L_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_093L_20240201T183854_20240201T183905_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_090R_20240201T183824_20240201T183835_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_091R_20240201T183834_20240201T183845_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_092R_20240201T183844_20240201T183855_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_218_093R_20240201T183854_20240201T183905_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :568200.0x_max :721700.0y_min :3898600.0y_max :4052100.0institution :CNESproduct_version :01\n\n\n\nraster_plot = ds.wse.hvplot.quadmesh(x='x', y='y', rasterize=True, title=f'SWOT Raster 100m: Lake Mead Reservoir')\nraster_plot.opts(width=700, height=600, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nCreating a Time Series\nSWOT Raster product does not include a time dimension, each file is a snapshot in time, but it can be inserted by extracting from the file name.\n\nExpand the time range of your earthaccess search to get an adequate range.\nExtract the datetime from the s3 file name then concatenate based on the new time dimension.\nSave the output as a new NetCDF file.\n\n\ntime_results = earthaccess.search_data(\n short_name = 'SWOT_L2_HR_RASTER_2.0',\n bounding_box=(-114.502048,36.060175,-114.390983,36.210182),\n temporal =('2024-01-25 00:00:00', '2024-03-04 23:59:59'),\n granule_name = '*_100m_*',\n count =200\n)\n\nGranules found: 3\n\n\n\nearthaccess.download(time_results, \"data_downloads/SWOT_Raster_LakeMead_Time/\")\n\n Getting 3 granules, approx download size: 0.12 GB\nAccessing cloud dataset using dataset endpoint credentials: https://archive.swot.podaac.earthdata.nasa.gov/s3credentials\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc\nDownloaded: data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc\n\n\n['data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_205_109F_20240201T075048_20240201T075109_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_010_496_046F_20240211T170050_20240211T170111_PIC0_01.nc',\n 'data_downloads/SWOT_Raster_LakeMead_Time/SWOT_L2_HR_Raster_100m_UTM11S_N_x_x_x_011_205_109F_20240222T043554_20240222T043615_PIC0_01.nc']\n\n\n\nfolder_path = \"data_downloads/SWOT_Raster_LakeMead_Time/\"\nfile_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.endswith('.nc')]\n\n\ndef add_time_dimension(ds):\n # Extract date/time string from filename\n file_date = os.path.basename(ds.encoding['source']).split(\"_\")[-4][:15]\n # Convert the date string to a datetime object\n time_value = datetime.strptime(file_date, \"%Y%m%dT%H%M%S\")\n # Assign the time coordinate to the dataset\n ds.coords['time'] = time_value\n return ds\n\n\ndatasets = []\nfile_names = []\n\nfor file_path in file_paths:\n dataset = xr.open_dataset(file_path)\n datasets.append(add_time_dimension(dataset))\n file_names.append(os.path.basename(file_path))\n dataset.close()\n\n\n# sorting the time dimension in correct order\ndatasets.sort(key=lambda ds: ds.time.values)\n\n\nds2 = xr.concat(datasets, dim='time')\nds2\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1549, y: 1549, time: 3)\nCoordinates:\n * x (x) float64 6.788e+05 6.789e+05 ... 8.336e+05\n * y (y) float64 3.9e+06 3.901e+06 ... 4.055e+06\n * time (time) datetime64[ns] 2024-02-01T07:50:48 ... 20...\nData variables: (12/39)\n crs (time) object b'1' b'1' b'1'\n longitude (time, y, x) float64 nan nan nan ... nan nan nan\n latitude (time, y, x) float64 nan nan nan ... nan nan nan\n wse (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual (time, y, x) float32 nan nan nan ... nan nan nan\n wse_qual_bitwise (time, y, x) float64 nan nan nan ... nan nan nan\n ... ...\n load_tide_fes (time, y, x) float32 nan nan nan ... nan nan nan\n load_tide_got (time, y, x) float32 nan nan nan ... nan nan nan\n pole_tide (time, y, x) float32 nan nan nan ... nan nan nan\n model_dry_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n model_wet_tropo_cor (time, y, x) float32 nan nan nan ... nan nan nan\n iono_cor_gim_ka (time, y, x) float32 nan nan nan ... nan nan nan\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2024-02-05T12:55:01Z : Creation\n platform: SWOT\n references: V1.2.1\n ... ...\n x_min: 680100.0\n x_max: 829300.0\n y_min: 3903300.0\n y_max: 4052400.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 1549y: 1549time: 3Coordinates: (3)x(x)float646.788e+05 6.789e+05 ... 8.336e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([678800., 678900., 679000., ..., 833400., 833500., 833600.])y(y)float643.9e+06 3.901e+06 ... 4.055e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([3900500., 3900600., 3900700., ..., 4055100., 4055200., 4055300.])time(time)datetime64[ns]2024-02-01T07:50:48 ... 2024-02-...array(['2024-02-01T07:50:48.000000000', '2024-02-11T17:00:50.000000000',\n '2024-02-22T04:35:54.000000000'], dtype='datetime64[ns]')Data variables: (39)crs(time)objectb'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 11Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-117.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 11N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-117],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32611\"]]comment :UTM zone coordinate reference system.array([b'1', b'1', b'1'], dtype=object)longitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])latitude(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])wse(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)wse_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded dark_water_degraded low_coherence_water_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 1048576 2097152 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4114378918comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])wse_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_area_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111233454comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])water_area_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)water_frac_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-999999.0valid_max :999999.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n ...,\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.],\n [ 3., 3., 3., ..., 3., 3., 3.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_qual_bitwise(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad outside_data_window no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 67108864 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4111364519comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.array([[[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]],\n\n [[8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n...\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08],\n [8.05310464e+08, 8.05310464e+08, 8.05310464e+08, ...,\n 8.05310464e+08, 8.05310464e+08, 8.05310464e+08]],\n\n [[ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n ...,\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan],\n [ nan, nan, nan, ...,\n nan, nan, nan]]])sig0_uncert(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :-999999.0valid_max :999999.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)inc(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)cross_track(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)illumination_time(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')illumination_time_tai(time, y, x)datetime64[ns]NaT NaT NaT NaT ... NaT NaT NaT NaTlong_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].array([[['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']],\n\n [['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ...,\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT'],\n ['NaT', 'NaT', 'NaT', ..., 'NaT', 'NaT', 'NaT']]],\n dtype='datetime64[ns]')n_wse_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_water_area_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_sig0_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])n_other_pix(time, y, x)float64nan nan nan nan ... nan nan nan nanlong_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]])dark_frac(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_clim_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)ice_dyn_flag(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)layover_impact(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)sig0_cor_atmos_model(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)height_cor_xover(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)geoid(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)solid_earth_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_fes(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)load_tide_got(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)pole_tide(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_dry_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)model_wet_tropo_cor(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)iono_cor_gim_ka(time, y, x)float32nan nan nan nan ... nan nan nan nanlong_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]],\n\n [[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)Indexes: (3)xPandasIndexPandasIndex(Float64Index([678800.0, 678900.0, 679000.0, 679100.0, 679200.0, 679300.0,\n 679400.0, 679500.0, 679600.0, 679700.0,\n ...\n 832700.0, 832800.0, 832900.0, 833000.0, 833100.0, 833200.0,\n 833300.0, 833400.0, 833500.0, 833600.0],\n dtype='float64', name='x', length=1549))yPandasIndexPandasIndex(Float64Index([3900500.0, 3900600.0, 3900700.0, 3900800.0, 3900900.0, 3901000.0,\n 3901100.0, 3901200.0, 3901300.0, 3901400.0,\n ...\n 4054400.0, 4054500.0, 4054600.0, 4054700.0, 4054800.0, 4054900.0,\n 4055000.0, 4055100.0, 4055200.0, 4055300.0],\n dtype='float64', name='y', length=1549))timePandasIndexPandasIndex(DatetimeIndex(['2024-02-01 07:50:48', '2024-02-11 17:00:50',\n '2024-02-22 04:35:54'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2024-02-05T12:55:01Z : Creationplatform :SWOTreferences :V1.2.1reference_document :JPL D-56416 - Revision C - December 8, 2023contact :podaac@podaac.jpl.nasa.govcycle_number :10pass_number :205scene_number :109tile_numbers :[216 217 218 219 216 217 218 219]tile_names :205_216L, 205_217L, 205_218L, 205_219L, 205_216R, 205_217R, 205_218R, 205_219Rtile_polarizations :H, H, H, H, V, V, V, Vcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM11S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.1.1time_granule_start :2024-02-01T07:50:48.872250Ztime_granule_end :2024-02-01T07:51:09.965949Ztime_coverage_start :2024-02-01T07:50:49.410994Ztime_coverage_end :2024-02-01T07:51:09.428854Zgeospatial_lon_min :-115.01465895670609geospatial_lon_max :-113.33094509647773geospatial_lat_min :35.225727504637376geospatial_lat_max :36.595188311791034left_first_longitude :-115.01465895670609left_first_latitude :35.46460890403489left_last_longitude :-114.72680781313967left_last_latitude :36.595188311791034right_first_longitude :-113.63706815703668right_first_latitude :35.225727504637376right_last_longitude :-113.33094509647773right_last_latitude :36.350992807533125xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXC_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_010_205_216L_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217L_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218L_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219L_20240201T075108_20240201T075119_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_216R_20240201T075038_20240201T075049_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_217R_20240201T075048_20240201T075059_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_218R_20240201T075058_20240201T075109_PIC0_01.nc, SWOT_L2_HR_PIXCVec_010_205_219R_20240201T075108_20240201T075119_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :11mgrs_latitude_band :Sx_min :680100.0x_max :829300.0y_min :3903300.0y_max :4052400.0institution :CNESproduct_version :01\n\n\n\ntimeplot = ds2.wse.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nLet’s plot the wse quality flag, wse_qual which ranges 0-3 where 0=good, 1=suspect, 2=degraded, 3=bad (as described when printing variable with xarray).\n\ntimeplot = ds2.wse_qual.hvplot.image(y='y', x='x')\ntimeplot.opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\n\n\nMasking a variable with its quaility flag\n\nvariable_to_mask = ds2['wse']\nmask_variable = ds2['wse_qual']\n\n\n# Define the condition for masking based on the range of the quaility flag\nmask_condition = mask_variable < 2\n\nmasked_variable = variable_to_mask.where(mask_condition)\n\n\n# Update the masked variable in the dataset\nds2['wse'] = masked_variable\n\nds2['wse'].hvplot.image(y='y', x='x').opts(width=700, height=500, colorbar=True)\n\n\n\n\n\n \n\n\n\n\nOur end product is a time series of the data showing only the values where the quality flag is either good (0) or suspect (1).\n\n\nWe can also save the time series with quality flags implemented to a new netcdf file.\n\noutput_folder = 'data_downloads/SWOT_Raster_Time/'\nos.makedirs(output_folder, exist_ok=True)\n\n\noutput_netcdf_path = os.path.join(output_folder, \"Output_Time.nc\")\nds2.to_netcdf(output_netcdf_path)\n\nprint(f\"Output complete: {output_netcdf_path}\")\n\nOutput complete: data_downloads/SWOT_Raster_Time/Output_Time.nc\n\n\n\n\nAppendix: Alternate Plot\n\n# # Alternate plotting with matplotlib\n# %matplotlib inline\n\n# import matplotlib.pyplot as plt\n# from matplotlib import animation\n# from matplotlib.animation import FuncAnimation, PillowWriter\n# from IPython.display import display, Image, HTML\n\n# variable_name = 'wse'\n# data = ds2[variable_name]\n\n# fig, ax = plt.subplots(figsize=(10, 8))\n# fig.set_tight_layout({'rect': [0.01, 0.01, 1.0, 1.0]})\n\n# contour = ax.contourf(data.isel(time=0), cmap='viridis')\n# cbar = plt.colorbar(contour)\n# cbar.set_label('Water Surface Elevation (meters)', fontsize=14) \n# times = ds2.time.values\n\n# # Function to update the plot for each time step\n# def update(frame):\n# ax.clear()\n# contour = ax.contourf(data.isel(time=frame), cmap='viridis',)\n# formatted_time = str(times[frame])[:-7]\n# ax.set_title(f'Date: {formatted_time}')\n# ax.set_xlabel('Longitude', fontsize=14)\n# ax.set_ylabel('Latitude', fontsize=14)\n# ax.text(0.5, 1.05, 'SWOT Raster 100M Lake Mead Reservoir', transform=ax.transAxes, ha='center', fontsize=14)\n# return contour,\n\n# # Creating a gif animation\n# ani = animation.FuncAnimation(fig, update, repeat=True, frames=len(data['time']), blit=True, interval=3000)\n\n# output = ('./time_series.gif')\n# ani.save(output, writer='pillow', fps=.5)\n\n# with open(output,'rb') as f:\n# display(Image(data=f.read(), format='gif'))\n\n# plt.close(fig)\n# ds2.close()", + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#working-with-in-situ-measurements-and-satellite-hydrology-data-in-the-cloud", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#working-with-in-situ-measurements-and-satellite-hydrology-data-in-the-cloud", + "title": "Mississippi River Heights Exploration:", + "section": "Working with In Situ Measurements and Satellite Hydrology Data in the Cloud", + "text": "Working with In Situ Measurements and Satellite Hydrology Data in the Cloud\n\nLearning Objectives\n\nAccess data from the cloud (Pre-SWOT MEaSUREs river heights) and utilize in tandem with locally hosted dataset (USGS gauges)\nSearch for products using Earthdata Search GUI\nAccess datasets using xarray and visualize\n\nThis tutorial explores the relationships between satellite and in situ river heights in the Mississippi River using the data sets listed below. The notebook is designed to be executed in Amazon Web Services (AWS) (in us-west-2 region where the cloud data is located).", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "Access & Visualization", - "Raster Multifile", - "Local" + "Science Data Stories", + "Mississippi River Heights" ] }, { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "", - "text": "This tutorial only works in a jupyterhub hosted at AWS US-WEST-2." - }, - { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#content", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#content", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "Content", - "text": "Content\n\nSpecify parameters\nThe following parameters are used for this particular dataset.\n\n#Short_name is used to identify a specific dataset in NASA Earthdata. \nshort_name='OISSS_L4_multimission_monthly_v1'" - }, - { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#direct-s3-access", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#direct-s3-access", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "Direct S3 access", - "text": "Direct S3 access\nUse EarthData Login (EDL) to get a direct S3 access. Direct S3 access is only available to users running in AWS, us-west-2 region. All other access must come from HTTP requests for PO.DAAC data.\nCreate an EDL following this link.\nCreate a .netrc file in the home folder following these instructions.\n.netrc is essential to enable the following blocks.\n\ndef init_S3FileSystem():\n import requests,s3fs\n s3_cred_endpoint = {\n 'podaac':'https://archive.podaac.earthdata.nasa.gov/s3credentials',\n 'lpdaac':'https://data.lpdaac.earthdatacloud.nasa.gov/s3credentials'}\n\n temp_creds_url = s3_cred_endpoint['podaac']\n creds = requests.get(temp_creds_url).json()\n s3 = s3fs.S3FileSystem(anon=False,\n key=creds['accessKeyId'],\n secret=creds['secretAccessKey'], \n token=creds['sessionToken'])\n return s3\ns3sys=init_S3FileSystem()" - }, - { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#explore-the-file-system.", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#explore-the-file-system.", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "Explore the file system.", - "text": "Explore the file system.\n\nimport pprint\n\n#s3://podaac-ops-cumulus-protected is the PODAAC S3 bucket. \n#s3://podaac-ops-cumulus-protected/{short_name} is the path to this dataset. \n\n#This dataset is organized by year.\n\nyears=s3sys.glob(\"s3://podaac-ops-cumulus-protected/%s/*\"%short_name)\npprint.pprint(years)\n\nfor year in years:\n fns= s3sys.glob(year+\"/*nc\")\n print(\"Year %s: total files (granules) %i.\"%(year.split('/')[-1], len(fns)))\n\n['podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2011',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2012',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2013',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2014',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2015',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2016',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2017',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2018',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2019',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2020',\n 'podaac-ops-cumulus-protected/OISSS_L4_multimission_monthly_v1/2021']\nYear 2011: total files (granules) 4.\nYear 2012: total files (granules) 12.\nYear 2013: total files (granules) 12.\nYear 2014: total files (granules) 12.\nYear 2015: total files (granules) 12.\nYear 2016: total files (granules) 12.\nYear 2017: total files (granules) 12.\nYear 2018: total files (granules) 12.\nYear 2019: total files (granules) 12.\nYear 2020: total files (granules) 12.\nYear 2021: total files (granules) 8.\n\n\n\nfns= s3sys.glob(\"s3://podaac-ops-cumulus-protected/%s/*/*nc\"%short_name)\nprint(\"Open all %i files.\"%len(fns))\n#pprint.pprint(fns)\n\nimport xarray as xr\n\nd=xr.open_dataset(s3sys.open(fns[0]))\nd\n\nOpen all 120 files.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 1)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 -179.4 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 -89.38 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-09-16\nData variables:\n sss (latitude, longitude, time) float32 ...\n sss_uncertainty (latitude, longitude, time) float32 ...\n sss_climatology (latitude, longitude, time) float32 ...\n sss_anomaly (latitude, longitude, time) float32 ...\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_v1_monthly\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: [0.25]\n geospatial_lat_units: degrees_north\n geospatial_lon_min: [-180.]\n geospatial_lon_max: [180.]\n geospatial_lon_resolution: [0.25]\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 1Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :[-180.]valid_max :[180.]coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :[-90.]valid_max :[90.]coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-09-16long_name :reference time of analyzed variable field corresponding to the center of the product time intervalstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-09-16T00:00:00.000000000'], dtype='datetime64[ns]')Data variables: (4)sss(latitude, longitude, time)float32...long_name :multi-mission OISSS monthly averagestandard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :physicalMeasurement[1036800 values with dtype=float32]sss_uncertainty(latitude, longitude, time)float32...long_name :estimated empirical uncertainty of multi-mission OISSS monthly averageunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]sss_climatology(latitude, longitude, time)float32...long_name :monthly climatological sea surface salinity based on multi-mission OISSS dataset from 09/2011 to 08/2021standard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]sss_anomaly(latitude, longitude, time)float32...long_name :sea surface salinity anomaly relative to the product-based monthly climatologyunits :1e-3valid_min :[-10.]valid_max :[10.]add_factor :[0.]coverage_content_type :qualityInformation[1036800 values with dtype=float32]Attributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity Global Dataset V1.0 MonthlyShort_Name :OISSS_L4_multimission_v1_monthlyVersion :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2022-02-15T02:49:51ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.eduPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2011month_of_observation :9center_day_of_observation :16time_coverage_start :2011-09-01T12:00:00Ztime_coverage_end :2011-09-30T12:00:00Ztime_coverage_resolution :P1Mcdm_data_type :gridgeospatial_lat_min :[-90.]geospatial_lat_max :[90.]geospatial_lat_resolution :[0.25]geospatial_lat_units :degrees_northgeospatial_lon_min :[-180.]geospatial_lon_max :[180.]geospatial_lon_resolution :[0.25]geospatial_lon_units :degrees_east" - }, - { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-an-example", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-an-example", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "Plot an example", - "text": "Plot an example\n\nplt.figure(figsize=(15,5))\nd['sss'][:,:,0].plot(cmap=plt.cm.jet,vmin=30,vmax=37)\n\n\n\n\n\n\n\n\n\nimport pylab as plt\n\nfig,ax=plt.subplots(2,2,figsize=(20,10))\n\nvars=d.keys()\n\naxx=ax.flatten()\n\n#set the colorbar limit\nclim=[[30,37],[0,0.1],[30,37],[-1,1]]\n\nfor i,var in enumerate(vars):\n d[var][:,:,0].plot(ax=axx[i],cmap='jet',vmin=clim[i][0],vmax=clim[i][1])\n axx[i].set_title(var)\nplt.tight_layout()\n\n\n\n\n\n\n\n\n\nLoad all files to plot a time series\n\n%timeit\nfileset = [s3sys.open(file) for file in fns]\ndata = xr.open_mfdataset(fileset ,concat_dim='time',combine='nested',engine='h5netcdf')\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 120)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 -179.4 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 -89.38 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-09-16 2011-10-16 ... 2021-08-16\nData variables:\n sss (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_climatology (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_anomaly (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_v1_monthly\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: [0.25]\n geospatial_lat_units: degrees_north\n geospatial_lon_min: [-180.]\n geospatial_lon_max: [180.]\n geospatial_lon_resolution: [0.25]\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 120Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :[-180.]valid_max :[180.]coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :[-90.]valid_max :[90.]coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-09-16 ... 2021-08-16long_name :reference time of analyzed variable field corresponding to the center of the product time intervalstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-09-16T00:00:00.000000000', '2011-10-16T00:00:00.000000000',\n '2011-11-16T00:00:00.000000000', '2011-12-16T00:00:00.000000000',\n '2012-01-16T00:00:00.000000000', '2012-02-15T00:00:00.000000000',\n '2012-03-16T00:00:00.000000000', '2012-04-16T00:00:00.000000000',\n '2012-05-16T00:00:00.000000000', '2012-06-16T00:00:00.000000000',\n '2012-07-16T00:00:00.000000000', '2012-08-16T00:00:00.000000000',\n '2012-09-16T00:00:00.000000000', '2012-10-16T00:00:00.000000000',\n '2012-11-16T00:00:00.000000000', '2012-12-16T00:00:00.000000000',\n '2013-01-16T00:00:00.000000000', '2013-02-15T00:00:00.000000000',\n '2013-03-16T00:00:00.000000000', '2013-04-16T00:00:00.000000000',\n '2013-05-16T00:00:00.000000000', '2013-06-16T00:00:00.000000000',\n '2013-07-16T00:00:00.000000000', '2013-08-16T00:00:00.000000000',\n '2013-09-16T00:00:00.000000000', '2013-10-16T00:00:00.000000000',\n '2013-11-16T00:00:00.000000000', '2013-12-16T00:00:00.000000000',\n '2014-01-16T00:00:00.000000000', '2014-02-15T00:00:00.000000000',\n '2014-03-16T00:00:00.000000000', '2014-04-16T00:00:00.000000000',\n '2014-05-16T00:00:00.000000000', '2014-06-16T00:00:00.000000000',\n '2014-07-16T00:00:00.000000000', '2014-08-16T00:00:00.000000000',\n '2014-09-16T00:00:00.000000000', '2014-10-16T00:00:00.000000000',\n '2014-11-16T00:00:00.000000000', '2014-12-16T00:00:00.000000000',\n '2015-01-16T00:00:00.000000000', '2015-02-15T00:00:00.000000000',\n '2015-03-16T00:00:00.000000000', '2015-04-16T00:00:00.000000000',\n '2015-05-16T00:00:00.000000000', '2015-06-16T00:00:00.000000000',\n '2015-07-16T00:00:00.000000000', '2015-08-16T00:00:00.000000000',\n '2015-09-16T00:00:00.000000000', '2015-10-16T00:00:00.000000000',\n '2015-11-16T00:00:00.000000000', '2015-12-16T00:00:00.000000000',\n '2016-01-16T00:00:00.000000000', '2016-02-15T00:00:00.000000000',\n '2016-03-15T00:00:00.000000000', '2016-04-15T00:00:00.000000000',\n '2016-05-15T00:00:00.000000000', '2016-06-15T00:00:00.000000000',\n '2016-07-15T00:00:00.000000000', '2016-08-15T00:00:00.000000000',\n '2016-09-15T00:00:00.000000000', '2016-10-15T00:00:00.000000000',\n '2016-11-15T00:00:00.000000000', '2016-12-16T00:00:00.000000000',\n '2017-01-16T00:00:00.000000000', '2017-02-15T00:00:00.000000000',\n '2017-03-16T00:00:00.000000000', '2017-04-16T00:00:00.000000000',\n '2017-05-16T00:00:00.000000000', '2017-06-16T00:00:00.000000000',\n '2017-07-16T00:00:00.000000000', '2017-08-16T00:00:00.000000000',\n '2017-09-16T00:00:00.000000000', '2017-10-16T00:00:00.000000000',\n '2017-11-16T00:00:00.000000000', '2017-12-16T00:00:00.000000000',\n '2018-01-16T00:00:00.000000000', '2018-02-15T00:00:00.000000000',\n '2018-03-16T00:00:00.000000000', '2018-04-16T00:00:00.000000000',\n '2018-05-16T00:00:00.000000000', '2018-06-16T00:00:00.000000000',\n '2018-07-16T00:00:00.000000000', '2018-08-16T00:00:00.000000000',\n '2018-09-16T00:00:00.000000000', '2018-10-16T00:00:00.000000000',\n '2018-11-16T00:00:00.000000000', '2018-12-16T00:00:00.000000000',\n '2019-01-16T00:00:00.000000000', '2019-02-15T00:00:00.000000000',\n '2019-03-16T00:00:00.000000000', '2019-04-16T00:00:00.000000000',\n '2019-05-16T00:00:00.000000000', '2019-06-16T00:00:00.000000000',\n '2019-07-16T00:00:00.000000000', '2019-08-16T00:00:00.000000000',\n '2019-09-16T00:00:00.000000000', '2019-10-16T00:00:00.000000000',\n '2019-11-16T00:00:00.000000000', '2019-12-16T00:00:00.000000000',\n '2020-01-16T00:00:00.000000000', '2020-02-15T00:00:00.000000000',\n '2020-03-15T00:00:00.000000000', '2020-04-15T00:00:00.000000000',\n '2020-05-15T00:00:00.000000000', '2020-06-15T00:00:00.000000000',\n '2020-07-15T00:00:00.000000000', '2020-08-15T00:00:00.000000000',\n '2020-09-15T00:00:00.000000000', '2020-10-15T00:00:00.000000000',\n '2020-11-15T00:00:00.000000000', '2020-12-16T00:00:00.000000000',\n '2021-01-16T00:00:00.000000000', '2021-02-15T00:00:00.000000000',\n '2021-03-16T00:00:00.000000000', '2021-04-16T00:00:00.000000000',\n '2021-05-16T00:00:00.000000000', '2021-06-16T00:00:00.000000000',\n '2021-07-16T00:00:00.000000000', '2021-08-16T00:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (4)sss(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :multi-mission OISSS monthly averagestandard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSS monthly averageunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_climatology(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :monthly climatological sea surface salinity based on multi-mission OISSS dataset from 09/2011 to 08/2021standard_name :sea_surface_salinityunits :1e-3valid_min :[0.]valid_max :[45.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nsss_anomaly(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :sea surface salinity anomaly relative to the product-based monthly climatologyunits :1e-3valid_min :[-10.]valid_max :[10.]add_factor :[0.]coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n474.61 MiB\n3.96 MiB\n\n\nShape\n(720, 1440, 120)\n(720, 1440, 1)\n\n\nCount\n360 Tasks\n120 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 120 1440 720\n\n\n\n\nAttributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity Global Dataset V1.0 MonthlyShort_Name :OISSS_L4_multimission_v1_monthlyVersion :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2022-02-15T02:49:51ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.eduPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2011month_of_observation :9center_day_of_observation :16time_coverage_start :2011-09-01T12:00:00Ztime_coverage_end :2011-09-30T12:00:00Ztime_coverage_resolution :P1Mcdm_data_type :gridgeospatial_lat_min :[-90.]geospatial_lat_max :[90.]geospatial_lat_resolution :[0.25]geospatial_lat_units :degrees_northgeospatial_lon_min :[-180.]geospatial_lon_max :[180.]geospatial_lon_resolution :[0.25]geospatial_lon_units :degrees_east" - }, - { - "objectID": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-a-time-series-at-a-point-in-the-california-current.", - "href": "notebooks/datasets/OISSS_L4_multimission_monthly_v1.html#plot-a-time-series-at-a-point-in-the-california-current.", - "title": "Direct S3 Data Access tutorial (Multi-Mission Optimally Interpolated Sea Surface Salinity Global Monthly Dataset V1)", - "section": "Plot a time series at a point in the california current.", - "text": "Plot a time series at a point in the california current.\nPlot the time series of the SSS at (124W, 35N).\n\nplt.figure(figsize=(16,4))\ndata['sss'].interp(latitude=35,longitude=-124).plot()" - }, - { - "objectID": "notebooks/SWORD_River_Demo.html#summary", - "href": "notebooks/SWORD_River_Demo.html#summary", - "title": "SWORD River Demo", - "section": "Summary", - "text": "Summary\nThis notebook will query the SWOT River Database (SWORD) for river reaches (segments) or nodes (points) and visualize results using PO.DAAC’s Feature Translation Service. We use geospatial coordinates of the queried features (here river reaches along the Kasai River, a tributary of the Congo River in Africa) to then query and download or access via the cloud Pre-SWOT Hydrology data along the specified regions. This is a programmatic approach to using the ‘Advanced Search -> River Reach’ query in the Earthdata Search GUI." - }, - { - "objectID": "notebooks/SWORD_River_Demo.html#requirements", - "href": "notebooks/SWORD_River_Demo.html#requirements", - "title": "SWORD River Demo", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can be run in the following environments: - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\nImport libraries\n\nimport requests\nimport json\nimport pprint\nimport xarray as xr\nimport geojson\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport plotly.graph_objects as go\nfrom IPython.display import JSON, Image\nimport earthaccess\n\n\n\nAuthenticate Earthdata Login via earthaccess\n\nauth = earthaccess.login()\n\n\n\nDefine a Function to Query Easier\nFirst, we define a function to query a single reach, multiple reaches, or river nodes. This function returns the properties of river reaches including name, length, coordinates as well as individual node properties.\n\ndef response_to_FeatureCollection(response):\n \"\"\"\n This function will return a geojson.FeatureCollection representation of the features found in the provided response.\n Parameters\n ----------\n response : requests.Response - a Response object returned from a GET request on the rivers or nodes endpoint.\n Returns\n -------\n geojson.FeatureCollection - FeatureCollection containing all features extracted from the response.\n \"\"\"\n featureList = []\n for reach_id, reach_json in response.json()['results'].items():\n reach_feature = geojson.loads(json.dumps(reach_json['geojson']))\n reach_feature['properties']={k:v for k,v in reach_json.items() if k not in ['geojson', 'geometry']}\n featureList.append(reach_feature)\n featureCollection = geojson.FeatureCollection(featureList)\n return featureCollection" - }, - { - "objectID": "notebooks/SWORD_River_Demo.html#single-river-reach-from-the-sword-database", - "href": "notebooks/SWORD_River_Demo.html#single-river-reach-from-the-sword-database", - "title": "SWORD River Demo", - "section": "Single River Reach from the SWORD Database", - "text": "Single River Reach from the SWORD Database\nIn this section, we query the Feature Translation Service (FTS) SWORD service using a single Reach ID (from SWORD) to give us all of the metadata regarding the particular reach. In this example, we use the river Reach ID 13227000061. This ID represents a specific reach along the Kasai River, a tributary of the Congo River in Africa.\n\n#change the reach ID in the link below for a different location.\nresponse_reach = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/reach/13227000061\")\nfeatureCollection_reach = response_to_FeatureCollection(response_reach)\n\npprint.pprint(response_reach.json(), compact=True, width=60, depth=2)\n\n{'hits': 1,\n 'results': {'13227000061': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'reach'},\n 'status': '200 OK',\n 'time': '6.2 ms.'}\n\n\nNote that we haven’t looked at any data from a collection yet, we’ve simply found the geospatial coordinates of our river reach of interest within the metadata." - }, - { - "objectID": "notebooks/SWORD_River_Demo.html#query-data-by-coordinates", - "href": "notebooks/SWORD_River_Demo.html#query-data-by-coordinates", - "title": "SWORD River Demo", - "section": "Query Data by Coordinates", - "text": "Query Data by Coordinates\nWe can use results obtained from the FTS query to then directly and automatically query data using the earthaccess python library. We will use the coordinate information of a single reach to search for granules (files) available through the SWOT L2 raster files, whose data has the short-name SWOT_L2_HR_Raster_2.0.\n\n#obtain the associated lat/lons for the feature\nlats = [xy[1] for feature in featureCollection_reach['features'] for xy in feature['coordinates']]\nlons = [xy[0] for feature in featureCollection_reach['features'] for xy in feature['coordinates']]\n\n# find max and min of lat and lon derived when visualizing the reach for the bounding box input to earthaccess\nmaxlat, maxlon, minlat, minlon = max(lats), max(lons), min(lats), min(lons)\n\n\n#earthaccess data search\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_Raster_2.0', bounding_box=(minlon,minlat,maxlon,maxlat))\n\nGranules found: 30\n\n\nResults contains a link to the data file (granule) from the SWOT_L2_HR_RiverSP_2.0 data collection that overlaps the geospatial search from FTS-SWORD for the river reaches of interest, which we can then download or use within the cloud. Earthaccess will return the link required for the environment (https if local and s3 if in the cloud)." - }, - { - "objectID": "notebooks/SWORD_River_Demo.html#accessing-data-in-the-cloud-skip-this-chunk-if-local", - "href": "notebooks/SWORD_River_Demo.html#accessing-data-in-the-cloud-skip-this-chunk-if-local", - "title": "SWORD River Demo", - "section": "Accessing Data in the Cloud (skip this chunk if local)", - "text": "Accessing Data in the Cloud (skip this chunk if local)\nThis code chunk will only work if you are running this script in the cloud, AWS us-west-2 region.\n\n#access data within the cloud and open into an xarray dataset\nds_SWOT_raster = xr.open_mfdataset(earthaccess.open([results[0]]), engine=\"h5netcdf\")\nds_SWOT_raster\n\nOpening 1 granules, approx size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 581, y: 582)\nCoordinates:\n * x (x) float64 3.585e+05 3.588e+05 ... 5.035e+05\n * y (y) float64 9.358e+06 9.358e+06 ... 9.503e+06\nData variables: (12/39)\n crs object ...\n longitude (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(582, 581), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(582, 581), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-11-30T07:08:40Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 358500.0\n x_max: 503500.0\n y_min: 9357750.0\n y_max: 9503000.0\n institution: CNES\n product_version: 01xarray.DatasetDimensions:x: 581y: 582Coordinates: (2)x(x)float643.585e+05 3.588e+05 ... 5.035e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([358500., 358750., 359000., ..., 503000., 503250., 503500.])y(y)float649.358e+06 9.358e+06 ... 9.503e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([9357750., 9358000., 9358250., ..., 9502500., 9502750., 9503000.])Data variables: (39)crs()object...long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 34Sgeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :10000000.0longitude_of_central_meridian :21.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 34S\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",21],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",10000000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32734\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 34S\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",21],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",10000000],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32734\"]]comment :UTM zone coordinate reference system.[1 values with dtype=object]longitude(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.71 MB\n2.71 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(582, 581), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.35 MB\n1.35 MB\n\n\nShape\n(582, 581)\n(582, 581)\n\n\nCount\n2 Tasks\n1 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 581 582\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([358500.0, 358750.0, 359000.0, 359250.0, 359500.0, 359750.0,\n 360000.0, 360250.0, 360500.0, 360750.0,\n ...\n 501250.0, 501500.0, 501750.0, 502000.0, 502250.0, 502500.0,\n 502750.0, 503000.0, 503250.0, 503500.0],\n dtype='float64', name='x', length=581))yPandasIndexPandasIndex(Float64Index([9357750.0, 9358000.0, 9358250.0, 9358500.0, 9358750.0, 9359000.0,\n 9359250.0, 9359500.0, 9359750.0, 9360000.0,\n ...\n 9500750.0, 9501000.0, 9501250.0, 9501500.0, 9501750.0, 9502000.0,\n 9502250.0, 9502500.0, 9502750.0, 9503000.0],\n dtype='float64', name='y', length=582))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-11-30T07:08:40Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :55scene_number :73tile_numbers :[144 145 146 147 144 145 146 147]tile_names :055_144L, 055_145L, 055_146L, 055_147L, 055_144R, 055_145R, 055_146R, 055_147Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :250.0short_name :L2_HR_Rasterdescriptor_string :250m_UTM34M_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-25T08:46:30.064537Ztime_granule_end :2023-11-25T08:46:51.150152Ztime_coverage_start :2023-11-25T08:46:30.594559Ztime_coverage_end :2023-11-25T08:46:50.620738Zgeospatial_lon_min :19.72141518983517geospatial_lon_max :21.03225044891599geospatial_lat_min :-5.810602992908104geospatial_lat_max :-4.4965880080449185left_first_longitude :19.72141518983517left_first_latitude :-5.641311173698941left_last_longitude :19.891062484099912left_last_latitude :-4.496588008044919right_first_longitude :20.86456012740915right_first_latitude :-5.810602992908102right_last_longitude :21.032250448915992right_last_latitude :-4.665287517098692xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_055_144L_20231125T084620_20231125T084631_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_145L_20231125T084630_20231125T084641_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_146L_20231125T084640_20231125T084651_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_147L_20231125T084650_20231125T084701_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_144R_20231125T084620_20231125T084631_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_145R_20231125T084630_20231125T084641_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_146R_20231125T084640_20231125T084651_PIC0_02.nc, SWOT_L2_HR_PIXC_007_055_147R_20231125T084650_20231125T084701_PIC0_02.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_055_144L_20231125T084620_20231125T084631_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_145L_20231125T084630_20231125T084641_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_146L_20231125T084640_20231125T084651_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_147L_20231125T084650_20231125T084701_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_144R_20231125T084620_20231125T084631_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_145R_20231125T084630_20231125T084641_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_146R_20231125T084640_20231125T084651_PIC0_01.nc, SWOT_L2_HR_PIXCVec_007_055_147R_20231125T084650_20231125T084701_PIC0_01.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :34mgrs_latitude_band :Mx_min :358500.0x_max :503500.0y_min :9357750.0y_max :9503000.0institution :CNESproduct_version :01" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#datasets", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#datasets", + "title": "Mississippi River Heights Exploration:", + "section": "Datasets", + "text": "Datasets\nThe tutorial itself will use two different datasets:\n1. PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\n\nDOI: https://doi.org/10.5067/PSGRA-DA2V2\n\nThe NASA Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program virtual river height gauges from various altimeter satellites. \n2. USGS Water Data for the Nations River Gauges\n\nURL: https://dashboard.waterdata.usgs.gov/app/nwd/?region=lower48&aoi=default\n\nRiver heights are obtained from the United States Geologic Survey (USGS) National Water Dashboard.", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/SWORD_River_Demo.html#downloading-data-on-a-local-machine", - "href": "notebooks/SWORD_River_Demo.html#downloading-data-on-a-local-machine", - "title": "SWORD River Demo", - "section": "Downloading Data on a Local Machine", - "text": "Downloading Data on a Local Machine\n\n#download data into folder on local machine\nearthaccess.download([results[0]], \"datasets/data_downloads\")\n\n Getting 1 granules, approx download size: 0.01 GB\n\n\n\n\n\n\n\n\n\n\n\n['datasets\\\\data_downloads\\\\SWOT_L2_HR_Raster_250m_UTM34M_N_x_x_x_007_055_073F_20231125T084630_20231125T084651_PIC0_01.nc']\n\n\n\n#open dataset for visualization\nds_SWOT_raster = xr.open_mfdataset(f'datasets/data_downloads/SWOT_L2_HR_Raster*', engine='h5netcdf')\nds_SWOT_raster\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (x: 1920, y: 2101)\nCoordinates:\n * x (x) float64 2.969e+05 2.97e+05 ... 5.035e+05\n * y (y) float64 4.274e+06 4.274e+06 ... 9.503e+06\nData variables: (12/39)\n crs (y, x) object b'1' b'1' b'1' ... b'1' b'1' b'1'\n longitude (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n latitude (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse_qual (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n wse_qual_bitwise (y, x) float64 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n ... ...\n load_tide_fes (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n load_tide_got (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n pole_tide (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n model_dry_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n model_wet_tropo_cor (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\n iono_cor_gim_ka (y, x) float32 dask.array<chunksize=(1519, 1920), meta=np.ndarray>\nAttributes: (12/49)\n Conventions: CF-1.7\n title: Level 2 KaRIn High Rate Raster Data Product\n source: Ka-band radar interferometer\n history: 2023-12-03T08:26:57Z : Creation\n platform: SWOT\n references: V1.1.1\n ... ...\n x_min: 296900.0\n x_max: 448800.0\n y_min: 4274000.0\n y_max: 4425800.0\n institution: CNES\n product_version: 04xarray.DatasetDimensions:x: 1920y: 2101Coordinates: (2)x(x)float642.969e+05 2.97e+05 ... 5.035e+05long_name :x coordinate of projectionstandard_name :projection_x_coordinateunits :mvalid_min :-10000000.0valid_max :10000000.0comment :UTM easting coordinate of the pixel.array([296900., 297000., 297100., ..., 503000., 503250., 503500.])y(y)float644.274e+06 4.274e+06 ... 9.503e+06long_name :y coordinate of projectionstandard_name :projection_y_coordinateunits :mvalid_min :-20000000.0valid_max :20000000.0comment :UTM northing coordinate of the pixel.array([4274000., 4274100., 4274200., ..., 9502500., 9502750., 9503000.])Data variables: (39)crs(y, x)objectb'1' b'1' b'1' ... b'1' b'1' b'1'long_name :CRS Definitiongrid_mapping_name :transverse_mercatorprojected_crs_name :WGS 84 / UTM zone 13Ngeographic_crs_name :WGS 84reference_ellipsoid_name :WGS 84horizontal_datum_name :WGS_1984prime_meridian_name :Greenwichfalse_easting :500000.0false_northing :0.0longitude_of_central_meridian :-105.0longitude_of_prime_meridian :0.0latitude_of_projection_origin :0.0scale_factor_at_central_meridian :0.9996semi_major_axis :6378137.0inverse_flattening :298.257223563crs_wkt :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]spatial_ref :PROJCS[\"WGS 84 / UTM zone 13N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-105],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"32613\"]]comment :UTM zone coordinate reference system.array([[b'1', b'1', b'1', ..., nan, nan, nan],\n [b'1', b'1', b'1', ..., nan, nan, nan],\n [b'1', b'1', b'1', ..., nan, nan, nan],\n ...,\n [nan, nan, nan, ..., b'1', b'1', b'1'],\n [nan, nan, nan, ..., b'1', b'1', b'1'],\n [nan, nan, nan, ..., b'1', b'1', b'1']], dtype=object)longitude(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :longitude (degrees East)standard_name :longitudegrid_mapping :crsunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :Geodetic longitude [-180,180) (east of the Greenwich meridian) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nlatitude(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :latitude (positive N, negative S)standard_name :latitudegrid_mapping :crsunits :degrees_northvalid_min :-80.0valid_max :80.0comment :Geodetic latitude [-80,80] (degrees north of equator) of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water surface elevation above geoidgrid_mapping :crsunits :mquality_flag :wse_qualvalid_min :-1500.0valid_max :15000.0comment :Water surface elevation of the pixel above the geoid and after using models to subtract the effects of tides (solid_earth_tide, load_tide_fes, pole_tide).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface elevation quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the water surface elevationstandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded low_coherence_water_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 32 128 4096 8192\n 16384 262144 524288 2097152 16777216 268435456\n 536870912 1073741824 2147483648]valid_min :0valid_max :4046221478comment :Bitwise quality indicator for the water surface elevation quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwse_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water surface elevationgrid_mapping :crsunits :mvalid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water surface elevation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water surface areagrid_mapping :crsunits :m^2quality_flag :water_area_qualvalid_min :-2000000.0valid_max :2000000000.0comment :Surface area of the water pixels.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the water surface area and water fraction quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the water surface areastandard_name :status_flaggrid_mapping :crsflag_meanings :classification_qual_suspect geolocation_qual_suspect water_fraction_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 2 4 8 32 128 256\n 4096 8192 16384 262144 524288 16777216\n 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044124590comment :Bitwise quality indicator for the water surface area and water fraction quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_area_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water surface areagrid_mapping :crsunits :m^2valid_min :0.0valid_max :2000000000.0comment :1-sigma uncertainty in the water surface area.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_frac(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :water fractiongrid_mapping :crsunits :1quality_flag :water_area_qualvalid_min :-1000.0valid_max :10000.0comment :Fraction of the pixel that is water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nwater_frac_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in the water fractiongrid_mapping :crsunits :1valid_min :0.0valid_max :999999.0comment :1-sigma uncertainty in the water fraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :sigma0grid_mapping :crsunits :1quality_flag :sig0_qualvalid_min :-1000.0valid_max :10000000.0comment :Normalized radar cross section (sigma0) in real, linear units (not decibels). The value may be negative due to noise subtraction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_qual(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :summary quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :good suspect degraded badflag_values :[0 1 2 3]valid_min :0valid_max :3comment :Summary quality indicator for the sigma0 quantities. A value of 0 indicates a nominal measurement, 1 indicates a suspect measurement, 2 indicates a degraded measurement, and 3 indicates a bad measurement.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_qual_bitwise(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :bitwise quality indicator for the sigma0standard_name :status_flaggrid_mapping :crsflag_meanings :sig0_qual_suspect classification_qual_suspect geolocation_qual_suspect large_uncert_suspect bright_land low_coherence_water_suspect few_pixels far_range_suspect near_range_suspect sig0_qual_degraded classification_qual_degraded geolocation_qual_degraded value_bad no_pixels outside_scene_bounds inner_swath missing_karin_dataflag_masks :[ 1 2 4 32 128 256\n 4096 8192 16384 131072 262144 524288\n 16777216 268435456 536870912 1073741824 2147483648]valid_min :0valid_max :4044255655comment :Bitwise quality indicator for the sigma0 quantities. If this word is interpreted as an unsigned integer, a value of 0 indicates good data, positive values less than 32768 represent suspect data, values greater than or equal to 32768 but less than 8388608 represent degraded data, and values greater than or equal to 8388608 represent bad data.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_uncert(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :uncertainty in sigma0grid_mapping :crsunits :1valid_min :0.0valid_max :1000.0comment :1-sigma uncertainty in sigma0. The value is provided in linear units. This value is a one-sigma additive (not multiplicative) uncertainty term, which can be added to or subtracted from sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ninc(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :incidence anglegrid_mapping :crsunits :degreesvalid_min :0.0valid_max :90.0comment :Incidence angle.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ncross_track(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :approximate cross-track locationgrid_mapping :crsunits :mvalid_min :-75000.0valid_max :75000.0comment :Approximate cross-track location of the pixel.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nillumination_time(y, x)datetime64[ns]dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :time of illumination of each pixel (UTC)standard_name :timetai_utc_difference :37.0leap_second :0000-00-00T00:00:00Zcomment :Time of measurement in seconds in the UTC time scale since 1 Jan 2000 00:00:00 UTC. [tai_utc_difference] is the difference between TAI and UTC reference time (seconds) for the first measurement of the data set. If a leap second occurs within the data set, the attribute leap_second is set to the UTC time at which the leap second occurs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nillumination_time_tai(y, x)datetime64[ns]dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :time of illumination of each pixel (TAI)standard_name :timecomment :Time of measurement in seconds in the TAI time scale since 1 Jan 2000 00:00:00 TAI. This time scale contains no leap seconds. The difference (in seconds) with time in UTC is given by the attribute [illumination_time:tai_utc_difference].\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_wse_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of water surface elevation pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface elevation aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_water_area_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of water surface area pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in water surface area and water fraction aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_sig0_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of sigma0 pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in sigma0 aggregation.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nn_other_pix(y, x)float64dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :number of other pixelsgrid_mapping :crsunits :lvalid_min :0valid_max :999999comment :Number of pixel cloud samples used in aggregation of quantities not related to water surface elevation, water surface area, water fraction or sigma0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n32.27 MB\n23.33 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat64\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ndark_frac(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :fractional area of dark watergrid_mapping :crsunits :lvalid_min :-1000.0valid_max :10000.0comment :Fraction of pixel water surface area covered by dark water.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nice_clim_flag(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :climatological ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover uncertain_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Climatological ice cover flag indicating whether the pixel is ice-covered on the day of the observation based on external climatological information (not the SWOT measurement). Values of 0, 1, and 2 indicate that the pixel is likely not ice covered, may or may not be partially or fully ice covered, and likely fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nice_dyn_flag(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :dynamic ice cover flagstandard_name :status_flagsource :UNCgrid_mapping :crsflag_meanings :no_ice_cover partial_ice_cover full_ice_coverflag_values :[0 1 2]valid_min :0valid_max :2comment :Dynamic ice cover flag indicating whether the surface is ice-covered on the day of the observation based on analysis of external satellite optical data. Values of 0, 1, and 2 indicate that the pixel is not ice covered, partially ice covered, and fully ice covered, respectively.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nlayover_impact(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :layover impactgrid_mapping :crsunits :mvalid_min :-999999.0valid_max :999999.0comment :Estimate of the water surface elevation error caused by layover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsig0_cor_atmos_model(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :two-way atmospheric correction to sigma0 from modelsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :1valid_min :1.0valid_max :10.0comment :Atmospheric correction to sigma0 from weather model data as a linear power multiplier (not decibels). sig0_cor_atmos_model is already applied in computing sig0.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nheight_cor_xover(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :height correction from KaRIn crossoversgrid_mapping :crsunits :mvalid_min :-10.0valid_max :10.0comment :Height correction from KaRIn crossover calibration. The correction is applied before geolocation but reported as an equivalent height correction.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\ngeoid(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geoid heightstandard_name :geoid_height_above_reference_ellipsoidsource :EGM2008 (Pavlis et al., 2012)grid_mapping :crsunits :mvalid_min :-150.0valid_max :150.0comment :Geoid height above the reference ellipsoid with a correction to refer the value to the mean tide system, i.e. includes the permanent tide (zero frequency).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nsolid_earth_tide(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :solid Earth tide heightsource :Cartwright and Taylor (1971) and Cartwright and Edden (1973)grid_mapping :crsunits :mvalid_min :-1.0valid_max :1.0comment :Solid-Earth (body) tide height. The zero-frequency permanent tide component is not included.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nload_tide_fes(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric load tide height (FES)source :FES2014b (Carrere et al., 2016)institution :LEGOS/CNESgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nload_tide_got(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric load tide height (GOT)source :GOT4.10c (Ray, 2013)institution :GSFCgrid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric load tide height. The effect of the ocean tide loading of the Earth’s crust. This value is reported for reference but is not applied to the reported height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\npole_tide(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :geocentric pole tide heightsource :Wahr (1985) and Desai et al. (2015)grid_mapping :crsunits :mvalid_min :-0.2valid_max :0.2comment :Geocentric pole tide height. The total of the contribution from the solid-Earth (body) pole tide height and the load pole tide height (i.e., the effect of the ocean pole tide loading of the Earth’s crust).\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nmodel_dry_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :dry troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-3.0valid_max :-1.5comment :Equivalent vertical correction due to dry troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nmodel_wet_tropo_cor(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :wet troposphere vertical correctionsource :European Centre for Medium-Range Weather Forecastsinstitution :ECMWFgrid_mapping :crsunits :mvalid_min :-1.0valid_max :0.0comment :Equivalent vertical correction due to wet troposphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\niono_cor_gim_ka(y, x)float32dask.array<chunksize=(1519, 1920), meta=np.ndarray>long_name :ionosphere vertical correctionsource :Global Ionosphere Mapsinstitution :JPLgrid_mapping :crsunits :mvalid_min :-0.5valid_max :0.0comment :Equivalent vertical correction due to ionosphere delay. The reported water surface elevation, latitude and longitude are computed after adding negative media corrections to uncorrected range along slant-range paths, accounting for the differential delay between the two KaRIn antennas. The equivalent vertical correction is computed by applying obliquity factors to the slant-path correction. Adding the reported correction to the reported water surface elevation results in the uncorrected pixel height.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n16.14 MB\n11.67 MB\n\n\nShape\n(2101, 1920)\n(1519, 1920)\n\n\nCount\n22 Tasks\n2 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 1920 2101\n\n\n\n\nIndexes: (2)xPandasIndexPandasIndex(Float64Index([296900.0, 297000.0, 297100.0, 297200.0, 297300.0, 297400.0,\n 297500.0, 297600.0, 297700.0, 297800.0,\n ...\n 501250.0, 501500.0, 501750.0, 502000.0, 502250.0, 502500.0,\n 502750.0, 503000.0, 503250.0, 503500.0],\n dtype='float64', name='x', length=1920))yPandasIndexPandasIndex(Float64Index([4274000.0, 4274100.0, 4274200.0, 4274300.0, 4274400.0, 4274500.0,\n 4274600.0, 4274700.0, 4274800.0, 4274900.0,\n ...\n 9500750.0, 9501000.0, 9501250.0, 9501500.0, 9501750.0, 9502000.0,\n 9502250.0, 9502500.0, 9502750.0, 9503000.0],\n dtype='float64', name='y', length=2101))Attributes: (49)Conventions :CF-1.7title :Level 2 KaRIn High Rate Raster Data Productsource :Ka-band radar interferometerhistory :2023-12-03T08:26:57Z : Creationplatform :SWOTreferences :V1.1.1reference_document :JPL D-56416 - Revision B - August 17, 2023contact :alexander.t.corben[at]jpl.nasa.govcycle_number :7pass_number :106scene_number :43tile_numbers :[84 85 86 87 84 85 86 87]tile_names :106_084L, 106_085L, 106_086L, 106_087L, 106_084R, 106_085R, 106_086R, 106_087Rtile_polarizations :V, V, V, V, H, H, H, Hcoordinate_reference_system :Universal Transverse Mercatorresolution :100.0short_name :L2_HR_Rasterdescriptor_string :100m_UTM13S_N_x_x_xcrid :PIC0pge_name :PGE_L2_HR_RASTERpge_version :5.0.4time_granule_start :2023-11-27T04:20:14.437610Ztime_granule_end :2023-11-27T04:20:35.534188Ztime_coverage_start :2023-11-27T04:20:14.980558Ztime_coverage_end :2023-11-27T04:20:34.994509Zgeospatial_lon_min :-107.36911163124995geospatial_lon_max :-105.59017452334454geospatial_lat_min :38.59680331004279geospatial_lat_max :39.97894754823607left_first_longitude :-105.91254270086569left_first_latitude :39.97894754823607left_last_longitude :-105.59017452334454left_last_latitude :38.852446680067644right_first_longitude :-107.36911163124995right_first_latitude :39.71714302692733right_last_longitude :-107.02548126593867right_last_latitude :38.59680331004279xref_l2_hr_pixc_files :SWOT_L2_HR_PIXC_007_106_084L_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085L_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086L_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087L_20231127T042034_20231127T042045_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_084R_20231127T042004_20231127T042015_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_085R_20231127T042014_20231127T042025_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_086R_20231127T042024_20231127T042035_PIC0_03.nc, SWOT_L2_HR_PIXC_007_106_087R_20231127T042034_20231127T042045_PIC0_03.ncxref_l2_hr_pixcvec_files :SWOT_L2_HR_PIXCVec_007_106_084L_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085L_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_084R_20231127T042004_20231127T042015_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_085R_20231127T042014_20231127T042025_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_086R_20231127T042024_20231127T042035_PIC0_04.nc, SWOT_L2_HR_PIXCVec_007_106_087R_20231127T042034_20231127T042045_PIC0_04.ncxref_param_l2_hr_raster_file :SWOT_Param_L2_HR_Raster_20000101T000000_21000101T000000_20230817T100000_v302.rdfxref_reforbittrack_files :SWOT_RefOrbitTrackTileBoundary_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass1_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txt, SWOT_RefOrbitTrack125mPass2_Nom_20000101T000000_21000101T000000_20200617T193054_v101.txtutm_zone_num :13mgrs_latitude_band :Sx_min :296900.0x_max :448800.0y_min :4274000.0y_max :4425800.0institution :CNESproduct_version :04\n\n\n… Continue to Science!" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#needed-packages", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#needed-packages", + "title": "Mississippi River Heights Exploration:", + "section": "Needed Packages", + "text": "Needed Packages\n\nimport os\nimport glob\nimport s3fs\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy\nimport csv\nfrom datetime import datetime\nfrom os.path import isfile, basename, abspath", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/SWORD_River_Demo.html#other-options-to-query-the-sword-database", - "href": "notebooks/SWORD_River_Demo.html#other-options-to-query-the-sword-database", - "title": "SWORD River Demo", - "section": "Other Options to query the SWORD Database:", - "text": "Other Options to query the SWORD Database:\n\nMultiple River Reaches\nWe can query the FTS SWORD service over multiple river reaches too. In this example, we use ID 132270000. This ID represents multiple reaches along the Kasai River, a tributary of the Congo River in Africa. Note that this reach includes the reach ID of 13227000061 we plotted earlier. The response includes 9 individual reaches.\n\nresponse_multi = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/reach/132270000\")\nfeatureCollection_multi = response_to_FeatureCollection(response_multi)\n\npprint.pprint(response_multi.json(), compact=True, width=60, depth=2)\n\n{'hits': 9,\n 'results': {'13227000011': {...},\n '13227000021': {...},\n '13227000031': {...},\n '13227000041': {...},\n '13227000051': {...},\n '13227000061': {...},\n '13227000071': {...},\n '13227000081': {...},\n '13227000091': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'reach'},\n 'status': '200 OK',\n 'time': '58.247 ms.'}\n\n\n\n\nRiver Nodes within a Reach\nWe can also query the FTS SWORD service for river nodes, points along the river reaches. In this example, we use the ID of 13227000060. Note that this ID corresponds to the same reach ID 13227000061 we used earlier. The only difference is that the last digit of 0 corresponds to all the individual nodes along the reach. If the last digit is 1 in the reach ID, it corresponds to the overall properties of the reach itself. The response returns 52 nodes along the reach.\n\nresponse = requests.get(\"https://fts.podaac.earthdata.nasa.gov/rivers/node/13227000060\")\n\nfeatureCollection = response_to_FeatureCollection(response)\n\npprint.pprint(response.json(), compact=True, width=60, depth=2)\n\n{'hits': 52,\n 'results': {'13227000060011': {...},\n '13227000060021': {...},\n '13227000060031': {...},\n '13227000060041': {...},\n '13227000060051': {...},\n '13227000060061': {...},\n '13227000060071': {...},\n '13227000060081': {...},\n '13227000060091': {...},\n '13227000060101': {...},\n '13227000060111': {...},\n '13227000060121': {...},\n '13227000060131': {...},\n '13227000060141': {...},\n '13227000060151': {...},\n '13227000060161': {...},\n '13227000060171': {...},\n '13227000060181': {...},\n '13227000060191': {...},\n '13227000060201': {...},\n '13227000060211': {...},\n '13227000060221': {...},\n '13227000060231': {...},\n '13227000060241': {...},\n '13227000060251': {...},\n '13227000060261': {...},\n '13227000060271': {...},\n '13227000060281': {...},\n '13227000060291': {...},\n '13227000060301': {...},\n '13227000060311': {...},\n '13227000060321': {...},\n '13227000060331': {...},\n '13227000060341': {...},\n '13227000060351': {...},\n '13227000060361': {...},\n '13227000060371': {...},\n '13227000060381': {...},\n '13227000060391': {...},\n '13227000060401': {...},\n '13227000060411': {...},\n '13227000060421': {...},\n '13227000060431': {...},\n '13227000060441': {...},\n '13227000060451': {...},\n '13227000060461': {...},\n '13227000060471': {...},\n '13227000060481': {...},\n '13227000060491': {...},\n '13227000060501': {...},\n '13227000060511': {...},\n '13227000060521': {...}},\n 'search on': {'exact': False,\n 'page_number': 1,\n 'page_size': 100,\n 'parameter': 'node'},\n 'status': '200 OK',\n 'time': '119.271 ms.'}" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#get-temporary-aws-credentials-for-access", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#get-temporary-aws-credentials-for-access", + "title": "Mississippi River Heights Exploration:", + "section": "Get Temporary AWS Credentials for Access", + "text": "Get Temporary AWS Credentials for Access\nS3 is an ‘object store’ hosted in AWS for cloud processing. Direct S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. Note, these temporary credentials are valid for only 1 hour. A netrc file is required to aquire these credentials. Use the NASA Earthdata Authentication to create a netrc file in your home directory. (Note: A NASA Earthdata Login is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.)\nThe following crediential is for PODAAC, but other credentials are needed to access data from other NASA DAACs.\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\nCreate a function to make a request to an endpoint for temporary credentials.\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nSet up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint.\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/PODAAC_Data_Subscriber.html#prerequisites", - "href": "notebooks/PODAAC_Data_Subscriber.html#prerequisites", - "title": "PO.DAAC Data Subscriber", - "section": "Prerequisites", - "text": "Prerequisites\n\nPython3 installed\nEarthdata Login account created" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#pre-swot-measures-river-heights", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#pre-swot-measures-river-heights", + "title": "Mississippi River Heights Exploration:", + "section": "Pre-SWOT MEaSUREs River Heights", + "text": "Pre-SWOT MEaSUREs River Heights\nThe shortname for MEaSUREs is ‘PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2’ with the concept ID: C2036882359-POCLOUD. The guidebook explains the details of the Pre-SWOT MEaSUREs data.\nOur desired MEaSUREs variable is river height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Mississippi River. Time is between April 8, 1993 and April 20, 2019.\nFor this dataset, we found the cloud-enabled data directly using the Earthdata Search (see the Earthdata Search for downloading data tutorial) by searching directly for the concept ID, and locating the granule needed, G2105959746-POCLOUD, that will show us the Mississippi river.\n\n\n\nimage.png\n\n\nThe s3 link for this granule can be found in it’s meta data by viewing the details of the granule from the button with three vertical dots in the corner. The s3 link is under ‘relatedURLs’, or it can be found by going through the download process and instead of downloading, clicking the tab entitled “AWS S3 Access.”\n\n\n\nimage.png\n\n\nLet’s access the netCDF file from an s3 bucket and look at the data structure.\n\ns3_MEaSUREs_url = 's3://podaac-ops-cumulus-protected/PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2/North_America_Mississippi1kmdaily.nc'\n\n\ns3_file_obj = fs_s3.open(s3_MEaSUREs_url, mode='rb')\n\n\nds_MEaSUREs = xr.open_dataset(s3_file_obj, engine='h5netcdf')\nds_MEaSUREs\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (X: 2766, Y: 2766, distance: 2766, time: 9440,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-14T17:00:38.973026816 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 -89.35 -89.35 -89.36 ... -92.42 -92.43\n lat (Y) float64 29.27 29.28 29.29 ... 44.56 44.56 44.57\n FD (distance) float64 10.01 1.01e+03 ... 2.765e+06\n height (distance, time) float64 ...\n sat (charlength, time) |S1 ...\n storage (distance, time) float64 ...\n IceFlag (time) float64 nan nan nan nan nan ... nan nan nan nan\n LakeFlag (distance) float64 0.0 0.0 0.0 0.0 ... 1.0 1.0 1.0 1.0\n Storage_uncertainty (distance, time) float64 ...\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: 44.56663081735837\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 201.5947042200621\n geospatial_vertical_min: -2.2912740783007286\n geospatial_vertical_units: m\n geospatial_vertical_positive: upxarray.DatasetDimensions:X: 2766Y: 2766distance: 2766time: 9440charlength: 26Coordinates: (1)time(time)datetime64[ns]1993-04-14T17:00:38.973026816 .....long_name :timestandard_name :timeaxis :Tarray(['1993-04-14T17:00:38.973026816', '1993-04-15T17:00:38.973026816',\n '1993-04-16T17:00:38.973026816', ..., '2019-04-16T15:38:57.639261696',\n '2019-04-17T15:38:57.639261696', '2019-04-18T15:38:57.639261696'],\n dtype='datetime64[ns]')Data variables: (9)lon(X)float64...units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :Xarray([-89.345393, -89.351435, -89.356849, ..., -92.404921, -92.416217,\n -92.42713 ])lat(Y)float64...units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Yarray([29.273779, 29.281522, 29.288734, ..., 44.558685, 44.562254, 44.566631])FD(distance)float64...long_name :distance_from_river_mouthunits :kmcomment :This is the distance along the river centerline from the river mouth to this VS.array([1.000915e+01, 1.010009e+03, 2.010009e+03, ..., 2.763010e+06,\n 2.764010e+06, 2.765010e+06])height(distance, time)float64...units :mpositive :uplong_name :interpolated_heightsstandard_name :heightvalid_min :-2.2912740783007286valid_max :201.5947042200621comment :A time flow distance grid of river water heights with respect to the EGM08 Geoid).-9999 fill values are for missing data, while -9995 fill values are for lakes and reservoirs.[26111040 values with dtype=float64]sat(charlength, time)|S1...long_name :satellitecomment :The satellite the measurement is derived from.[245440 values with dtype=|S1]storage(distance, time)float64...units :km3positive :uplong_name :river_channel_storagecomment :A time flow distance grid of river channel storage values.[26111040 values with dtype=float64]IceFlag(time)float64...long_name :Ice_Flagvalid_range :0, 1flag_masks :1flag_meaning :Time of ice covercomment : This is a flag for masking out times of Ice Cover.array([nan, nan, nan, ..., nan, nan, nan])LakeFlag(distance)float64...long_name :Lake_Flagvalid_range :0, 1flag_masks :1flag_meaning :River sections that are lakes or reservoirscomment : This is a flag for masking out setions that are lakes or reservoirs.array([0., 0., 0., ..., 1., 1., 1.])Storage_uncertainty(distance, time)float64...units :km3positive :uplong_name :river_channel_storage_uncertaintycomment :A time flow distance grid of river channel storage uncertainty values.[26111040 values with dtype=float64]Attributes: (40)title :GRRATS (Global River Radar Altimetry Time Series)1km daily interpolation for the Mississippi RiverConventions :CF-1.6, ACDD-1.3institution :Ohio State University, School of Earth Sciencessource :MEaSUREs OSU Storage toolbox 2018keywords :EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURFACE WATER,SURFACE WATER PROCESSES/MEASUREMENTS,STAGE HEIGHTkeywords_vocabulary :Global Change Master Directory (GCMD)cdm_data_type :stationcreator_name :Coss,Stevecreator_email :Coss.31@osu.eduproject :MEaSUREs OSUprogram :NASA Earth Science Data Systems (ESDS)publisher_name :PO.DAAC (Physical Oceanography Distributed Active Archive Center)publisher_email :podaac@podaac.jpl.nasa.govpublisher_url :podaac.jpl.nasa.govpublisher_type :Institutionpublisher_institution :PO.DAACprocessing_level :L2doi :10.5067/PSGRA-DA2V2history :This GRRATS product adds data river surface height data from ERS1, ERS2, TOPEX/Poseidon and Jason-3 to expand the temporal coverage of the product. GRRATS1kd includes interpolated daily 1km resolution height measurements as well as river channel storage measurements. platform :ERS-1(L2),ERS-2(L2),TOPEX/POSEIDON(L2), Jason-1(L2),OSTM/Jason-2(L2),Jason-3(L2),Envisat(L2)platform_vocabulary :NASA/GCMD Platform Keywords. Version 8.6instrument :RA(L2),RA-2(L2),ALT(TOPEX)(L2),POSEIDON-2(L2),POSEIDON-3(L2),POSEIDON-3b(L2)instrument_vocabulary :NASA/GCMD Platform Keywords. Version 8.6references :in review :doi.org/10.5194/essd-2019-84id :GRRATS(Global River Radar Altimeter Time Series) 1km/dailysummary :The Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolations are river heights from ERS1, ERS2, TOPEX/Poseidon OSTM/Jason-2 Envisat and Jason-3 that are interpolated and processed to create a continuous heights for the study over the temporal range of the altimeters used. The purpose of these heights are to provide satellite altimetric river height data in a form that is more recognizable to the observational community and as a way to get users use to using satellite data for river hydrology.time_coverage_resolution :1 daydate_created :2021-06-30T10:30:44time_coverage_start :1992-04-14T17:00:38time_coverage_end :2018-04-18T15:38:57geospatial_lon_min :-92.42712987654255geospatial_lon_max :-89.09954782976848geospatial_lon_units :degree_eastgeospatial_lat_min :29.27377910202398geospatial_lat_max :44.56663081735837geospatial_lat_units :degree_northgeospatial_vertical_max :201.5947042200621geospatial_vertical_min :-2.2912740783007286geospatial_vertical_units :mgeospatial_vertical_positive :up\n\n\n\nPlot a subset of the data\nPlotting the river distances and associated heights on the map at time t=9069 (March 16, 2018) using plt.\n\nfig = plt.figure(figsize=[11,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-100, -70, 25, 45])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/PODAAC_Data_Subscriber.html#install-podaac-data-subscriber", - "href": "notebooks/PODAAC_Data_Subscriber.html#install-podaac-data-subscriber", - "title": "PO.DAAC Data Subscriber", - "section": "1. Install podaac-data-subscriber", - "text": "1. Install podaac-data-subscriber\nInstall podaac-data-subscriber from PyPi. If the PO.DAAC subscriber is not installed, run the following command:\n\n! pip install podaac-data-subscriber\n\nIf the PO.DAAC subscriber is already installed, run the following command to install the latest version (1.14.0)\n\n! pip install podaac-data-subscriber==1.14.0\n\nConfirm installation is successful\n\n! podaac-data-subscriber --version" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#usgs-gauge-river-heights", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#usgs-gauge-river-heights", + "title": "Mississippi River Heights Exploration:", + "section": "USGS Gauge River Heights", + "text": "USGS Gauge River Heights\nIn situ measurements on the Mississippi River can be obtained from the United States Geologic Survey (USGS) National Water Dashboard.\nHere, we zoom into one of the streamgauges toward the outlet of the Mississippi River, Monitoring location 07374525: Mississippi River at Belle Chasse, LA highlighted in green. \nIf the point is selected, data can be obtained for the particular location. This gauge is located at lon, lat: (-89.977847, 29.85715084) and we can obtain gauge height for the time period October 2008 - 2021.\nOnce the text file is downloaded for the gauge heights, and the headers removed, it can be uploaded to the cloud as a dataframe to work alongside the MEaSUREs data. Click the upload files button in the top left corner to do so.\n\ndf_gauge_data = pd.read_csv('Mississippi_outlet_gauge.txt', delimiter = \"\\t\")\n#clean data and convert units to meters\ndf_gauge_data.columns = [\"agency\", \"site_no\", \"datetime\", \"river_height\", \"qual_code\"]\ndf_gauge_data['datetime'] = pd.to_datetime(df_gauge_data['datetime']) \ndf_gauge_data['river_height'] = df_gauge_data['river_height']*0.3048\ndf_gauge_data\n\n\n\n\n\n\n\n\nagency\nsite_no\ndatetime\nriver_height\nqual_code\n\n\n\n\n0\nUSGS\n7374525\n2008-10-29\n2.322576\nA\n\n\n1\nUSGS\n7374525\n2008-10-30\n2.337816\nA\n\n\n2\nUSGS\n7374525\n2008-10-31\n2.368296\nA\n\n\n3\nUSGS\n7374525\n2008-11-01\n2.356104\nA\n\n\n4\nUSGS\n7374525\n2008-11-02\n2.459736\nA\n\n\n...\n...\n...\n...\n...\n...\n\n\n4807\nUSGS\n7374525\n2021-12-27\n2.819400\nA\n\n\n4808\nUSGS\n7374525\n2021-12-28\n2.901696\nA\n\n\n4809\nUSGS\n7374525\n2021-12-29\n2.919984\nA\n\n\n4810\nUSGS\n7374525\n2021-12-30\n2.874264\nA\n\n\n4811\nUSGS\n7374525\n2021-12-31\n2.819400\nA\n\n\n\n\n4812 rows × 5 columns\n\n\n\n\nPlot the data\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(df_gauge_data.datetime, df_gauge_data.river_height, color = 'darkorange')\n\nplt.xlabel('Date')\nplt.ylabel('USGS River Height (m)')\n\nplt.title('Mississippi River Gauge 07374525, 2008-2021')\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\n\nFind the same location in the MEaSUREs Dataset using lat/lon\nThe closest location in the MEaSUREs dataset to the gauge (-89.977847, 29.85715084) is at index 106 where lon, lat is (-89.976628, 29.855369). We’ll use this for comparison.\n\nds_MEaSUREs.lat[106]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lat' ()>\narray(29.855369)\nAttributes:\n units: degrees_north\n long_name: latitude\n standard_name: latitude\n axis: Yxarray.DataArray'lat'29.86array(29.855369)Coordinates: (0)Attributes: (4)units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Y\n\n\n\nds_MEaSUREs.lon[106]\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lon' ()>\narray(-89.976628)\nAttributes:\n units: degrees_east\n long_name: longitude\n standard_name: longitude\n axis: Xxarray.DataArray'lon'-89.98array(-89.976628)Coordinates: (0)Attributes: (4)units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :X\n\n\n\nfig = plt.figure(figsize=[14,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-90.5, -89.5, 29.3, 30])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon[106], ds_MEaSUREs.lat[106], lw=1)\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()\n\n\n\n\n\n\n\n\n\n\nCombined timeseries plot of river heights from each source\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(df_gauge_data.datetime[0:3823], df_gauge_data.river_height[0:3823], color = 'darkorange')\nds_MEaSUREs.height[106,5657:9439].plot(color='darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\n\nLooks like the datums need fixing!\nThe USGS gauge datum is 6.58 feet below NAVD88 GEOID12B EPOCH 2010, while the MEaSUREs datum is height above the WGS84 Earth Gravitational Model (EGM 08) geoid, causing this discrepancy.", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/PODAAC_Data_Subscriber.html#setup-edl-credentials", - "href": "notebooks/PODAAC_Data_Subscriber.html#setup-edl-credentials", - "title": "PO.DAAC Data Subscriber", - "section": "2. Setup EDL credentials", - "text": "2. Setup EDL credentials\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\n \nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#use-case-validation", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#use-case-validation", + "title": "Mississippi River Heights Exploration:", + "section": "Use Case: Validation", + "text": "Use Case: Validation\nTo validate the MEaSUREs dataset, the authors of the dataset actually compare relative heights between gauges, as opposed to absolute heights, in order to avoid the influence of datum errors and the lack of correspondence between satellite ground tracks and gauge locations. They calculate relative heights by removing the long-term mean of difference between the sample pairs of virtual station heights and the stage measured by the stream gauges. We’ll repeat this method below for completeness and calculate the Nash-Sutcliffe Efficiency (NSE) value.\n\n#create dataframes of the two dataset river heights so values can be subtracted easier (the datasets have different numbers of observations)\ng_height_df = pd.DataFrame()\nm_height_df = pd.DataFrame()\ng_height_df['time'] = df_gauge_data.datetime[0:3823].dt.date\ng_height_df['gauge_height'] = df_gauge_data.river_height[0:3823]\nm_height_df['time'] = ds_MEaSUREs.time[5657:9439].dt.date\nm_height_df['MEaSUREs_height'] = ds_MEaSUREs.height[106,5657:9439]\n#merge into one by time\nheight_df = pd.merge(g_height_df, m_height_df, on='time', how='left')\nheight_df\n\n\n\n\n\n\n\n\ntime\ngauge_height\nMEaSUREs_height\n\n\n\n\n0\n2008-10-29\n2.322576\n-0.238960\n\n\n1\n2008-10-30\n2.337816\n-0.209417\n\n\n2\n2008-10-31\n2.368296\n-0.180987\n\n\n3\n2008-11-01\n2.356104\n-0.178015\n\n\n4\n2008-11-02\n2.459736\n-0.177945\n\n\n...\n...\n...\n...\n\n\n3819\n2019-04-13\n5.312664\n1.132784\n\n\n3820\n2019-04-14\n5.236464\n1.152391\n\n\n3821\n2019-04-15\n5.230368\n1.172064\n\n\n3822\n2019-04-16\n5.221224\n1.192314\n\n\n3823\n2019-04-17\n5.202936\n1.208963\n\n\n\n\n3824 rows × 3 columns\n\n\n\n\ndiff = height_df.gauge_height - height_df.MEaSUREs_height\nmean_diff = diff.mean()\nmean_diff\n\n3.451153237576882\n\n\n\nheight_df['relative_gauge_height'] = height_df.gauge_height - mean_diff\n\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(height_df.time, height_df.relative_gauge_height, color = 'darkorange')\nplt.plot(height_df.time, height_df.MEaSUREs_height, color = 'darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\nNash Sutcliffe Efficiency\n\nNSE = 1-(np.sum((height_df.MEaSUREs_height-height_df.relative_gauge_height)**2)/np.sum((height_df.relative_gauge_height-np.mean(height_df.relative_gauge_height))**2))\nNSE\n\n-0.2062487355865772\n\n\nNSE for Oct 2013 - Sept 2014 water year:\n\nfig = plt.figure(figsize=[14,7]) \nplt.plot(height_df.time[1799:2163], height_df.relative_gauge_height[1799:2163], color = 'darkorange')\nplt.plot(height_df.time[1799:2163], height_df.MEaSUREs_height[1799:2163], color = 'darkblue')\n\nplt.xlabel('Date')\nplt.ylabel('River Height (m)')\nplt.legend(['USGS', 'MEaSUREs'], loc='lower right')\n\nplt.grid()\nplt.show()\n\n\n\n\n\n\n\n\n\nNSE_2014 = 1-(np.sum((height_df.MEaSUREs_height[1799:2163]-height_df.relative_gauge_height[1799:2163])**2)/np.sum((height_df.relative_gauge_height[1799:2163]-np.mean(height_df.relative_gauge_height[1799:2163]))**2))\nNSE_2014\n\n0.18294061649986848\n\n\n\n\nPossible Explanations for discrepancies\n\nMultiple satellites, different return periods\nData interpolation\nSatellite tracks instead of swaths like SWOT will have, spatial interpolation\nRadar altimeter performance varies, was not designed to measure rivers\n\nMEaSUREs is comprised of the Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolation river heights from ERS1, ERS2, TOPEX/Poseidon, OSTM/Jason-2, Envisat, and Jason-3 that are interpolated and processed to create continuous heights for the study over the temporal range of the altimeters used. Each satellite has differing return periods (ie. Jason has a 10-day revist, Envisat 35 days) so to fill the data gaps, perhaps much needed to be interpolated and caused misalignment. In addition, the satellite tracks of these altimeter satellites do not capture entire river reaches with wide swath tracks like the Surface Water and Ocean Topography (SWOT) mission will do in the future. Thus locations observed among satellites may be different and data interpolated spatially, increasing errors. Also, radar altimeter performance varies dramatically across rivers and across Virtual Stations, as the creators of the dataset mention in the guidebook.\nIn addition, the authors note that the Mississippi NSE values ranged from -0.22 to 0.96 with an average of 0.43 when evaluating the dataset, so it looks like we unintentionally honed into one of the stations with the worst statistics on the Mississippi River.", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/PODAAC_Data_Subscriber.html#data-downloader", - "href": "notebooks/PODAAC_Data_Subscriber.html#data-downloader", - "title": "PO.DAAC Data Subscriber", - "section": "3. Data Downloader", - "text": "3. Data Downloader\nThe PO.DAAC Data downloader is a python-based tool for bulk and one-off (or non-often) downloading of data from the PO.DAAC archive\nTo see the run options for the downloader, use the --help flag:\n\n! podaac-data-downloader --help\n\nDownload SWOT data between dates. The --dry-run flag can be used to preview the files that will be downloaded.\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-08T00:00:00Z -d ./data/SWOT_L2_NALT_IGDR_1.0 --dry-run \n\nIf we exclude the –dry-run flag, the data will actually be downloaded to the local machine:\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-06T00:00:00Z -d ./data/SWOT_L2_NALT_IGDR_1.0\n\nDownload granules that match wildcard:\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -g \"SWOT_IPR_2PfP001_46*\" -d ./data/SWOT_L2_NALT_IGDR_1.0_wildcard\n\nDownload data in bbox:\n\n! podaac-data-downloader -c MODIS_A-JPL-L2P-v2019.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-06T00:00:00Z -b=\"-180,-90,0,0\" -d ./data/MODIS_A-JPL-L2P-v2019.0\n\nDownload OPERA .tif files:\n\n! podaac-data-downloader -c OPERA_L3_DSWX-HLS_PROVISIONAL_V1 -sd 2023-08-04T00:00:00Z -ed 2023-08-04T00:17:00Z -e .tif -d ./data/OPERA_L3_DSWX-HLS_PROVISIONAL_V1\n\nDownload S6 data by cycle:\n\n! podaac-data-downloader -c JASON_CS_S6A_L2_ALT_HR_RED_OST_NRT_F --cycle 100 --limit 10 -d ./data/JASON_CS_S6A_L2_ALT_HR_RED_OST_NRT_F" + "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#conclusions", + "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html#conclusions", + "title": "Mississippi River Heights Exploration:", + "section": "Conclusions", + "text": "Conclusions\n\nRegardless, the workflow works!\nData from the cloud (Pre-SWOT MEaSUREs river heights) is used in tandem with in situ measurements (USGS gauges)\nTime and download space saved", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Mississippi River Heights" + ] }, { - "objectID": "notebooks/PODAAC_Data_Subscriber.html#data-subscriber", - "href": "notebooks/PODAAC_Data_Subscriber.html#data-subscriber", - "title": "PO.DAAC Data Subscriber", - "section": "3. Data Subscriber", - "text": "3. Data Subscriber\nThe subscriber is useful for users who need to continuously pull the latest data from the PO.DAAC archive. If you repeatedly run the script, you will only download the latest data.\n\n! podaac-data-subscriber -c MODIS_A-JPL-L2P-v2019.0 -sd 2023-08-09T12:00:00Z -d ./data/MODIS_A-JPL-L2P-v2019.0" + "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#finding-ways-to-visualize-swot-hydrology-river-shapefile-dataset", + "href": "notebooks/GIS/SWOT_GISshapefiles.html#finding-ways-to-visualize-swot-hydrology-river-shapefile-dataset", + "title": "SWOT North American Continent Hydrology Dataset", + "section": "Finding ways to visualize SWOT Hydrology River Shapefile Dataset", + "text": "Finding ways to visualize SWOT Hydrology River Shapefile Dataset\nAuthored by Nicholas Tarpinian, PO.DAAC", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Shapefile Exploration" + ] }, { - "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#summary", - "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#summary", - "title": "GDAL NetCDF to Geotiff Conversion", + "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#summary", + "href": "notebooks/GIS/SWOT_GISshapefiles.html#summary", + "title": "SWOT North American Continent Hydrology Dataset", "section": "Summary", - "text": "Summary\nThe following workflow lets you transform SWOT_L2_HR_Raster_2.0 NetCDF raster image to a GeoTIFF image, while extracting the variable of interest of WSE (Water Surface Elevation).\nUtiliziing the PODAAC Data Subscriber tool to download SWOT files onto your system.", + "text": "Summary\nThe following tutorial is looking to explore geospatial libraries and visualizing vector datasets without the use of a GIS desktop software. Specifically looking at the latest Surface Water and Ocean Topography (SWOT) river reach hydrology dataset.", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Transform Data", - "NetCDF to Geotiff", - "Windows" + "GIS Workflows", + "Shapefile Exploration" ] }, { - "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#requirements", - "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#requirements", - "title": "GDAL NetCDF to Geotiff Conversion", + "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#requirements", + "href": "notebooks/GIS/SWOT_GISshapefiles.html#requirements", + "title": "SWOT North American Continent Hydrology Dataset", "section": "Requirements", - "text": "Requirements\n\nThis tutorial can be run in both a Windows & Mac environment. (Both subscriber tool and GDAL.)\nFirst install GDAL and the GDAL Command Line Interface (CLI) onto your system. The GDAL CLI is a tool that lets your perform a variety of geospatial transformations and analysis with geospatial raster and vector data.\nEarthdata Login - An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nnetrc File - You will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\nPODAAC Data Subscriber tool - To download the latest PO.DAAC datasets to your system proceed to the podaac-data-subscriber package to properly install onto your system.", + "text": "Requirements\n\n1. Compute environment\n\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\nUtilizing Anaconda Navigator to create your enviroments. Accessing the Conda-Forge channel to install geopsatial libraries, e.g. GDAL and GeoPandas.\n\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\nLearning Objectives:\n\nAccessing SWOT shapefile hydrology dataset through earthaccess and visualizing it locally.\nVisualizing the dataset through the use of geospatial libraries; including Geopandas & Matplotlib.\nVisualzing either a single river reach or merging multiple reaches to a single shapefile.\nQuerying specific variables of interest.\n\n\n\n\nImport libraries\n\nimport os\nimport glob \nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport zipfile\nimport earthaccess", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Transform Data", - "NetCDF to Geotiff", - "Windows" + "GIS Workflows", + "Shapefile Exploration" ] }, { - "objectID": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#learning-objectives", - "href": "notebooks/GIS/GDAL_NetCDF_GeoTIFF.html#learning-objectives", - "title": "GDAL NetCDF to Geotiff Conversion", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nDownloading SWOT data using the podaac-data-downloader.\nUtilizing GDAL (Geospatial Data Abstraction Library) to convert NetCDF files to GeoTIFF.\nSpecifiying which variable to convert to a single band image.\nAlso converting a folder of NetCDF files to GeoTIFF.\n\n\n\nCalling the Data Subscriber\nAfter installing the podaac-data-subscriber, the following command can be used in the Windows CLI Command Prompt interface to download the latest SWOT data.\nFor more info on the PODAAC Data Downloader.\n\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d Output Directory -sd 2024-02-15T15:15:00Z -ed 2024-02-15T15:16:00Z\n\n\n\nGDAL Transformation\nTransformation of the dataset is being done in the GDAL CLI.\nGDALMDIMTRANSLATE converts multidimenstional data between different formats.\nE.g. gdalmdimtranslate -of (output format) -co (creation option) -array (variable name) Input_FileName.nc Output_FileName.tif\nUsing gdalmdimtranslate to convert a single NetCDF file to GeoTIFF. We are choosing the water surface elevation (wse) variable to transform.\n\ngdalmdimtranslate -of GTiff -co COMPRESS=LZW -array wse 'input_SWOT_NetCDF_file/SWOT_Raster_NetCDF/SWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc' 'output_path/wse_swot.tif'\n\nTo convert multiple NetCDF files within a folder, you can run a batch process of gdalmdimtranslate with a For Loop within the GDAL CLI. ’*.nc’ searching for all files containing a NetCDF extension within the folder.\n\nfor %f in ('input_SWOT_Folder\\SWOT_Raster_NetCDF\\*.nc') do (\ngdalmdimtranslate -of GTiff -co COMPRESS=LZW -array wse NETCDF:\"%f\" \"path_to_output_folder\\SWOT_GeoTIFF\\%~nf.tif\"\n)", + "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#authentication-with-earthaccess", + "href": "notebooks/GIS/SWOT_GISshapefiles.html#authentication-with-earthaccess", + "title": "SWOT North American Continent Hydrology Dataset", + "section": "Authentication with earthaccess", + "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch using earthaccess for SWOT River Reaches\nEach dataset has it’s own unique collection concept ID. For this dataset it is SWOT_L2_HR_RiverSP_2.0. We don’t need 1000+ files, we just want the river reach files over North America. SWOT files come in “reach” and “node” versions in the same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’ via wildcard search.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_NA_*') # here we filter by Reach files (not node), continent code=NA\n\nGranules found: 192\n\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_River_Feb2024\")\n\n\n\nUnzip shapefiles to existing folder\n\nfolder = Path(\"../datasets/data_downloads/SWOT_River_Feb2024\")\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nOpening a Single Shapefile\nUsing Geopandas to open & read a single shapefile. (Select desired single pass from list with path to downloaded shapefile)\n\nRiver = gpd.read_file(folder / 'SWOT_L2_HR_RiverSP_Reach_010_380_NA_20240207T132630_20240207T132640_PIC0_01.shp')\nRiver\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n72302000011\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.945799\n-57.862132\nHumber River\n4.236410e+01\n8.633000e-01\n8.585900e-01\n...\n675.648\n10\n2135.645\n1984.456750\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.87428 48.95038, -57.87387 48.9...\n\n\n1\n72302000021\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.947712\n-57.846809\nHumber River\n-1.000000e+12\n-1.000000e+12\n-1.000000e+12\n...\n217.623\n4\n3008.992\n873.346819\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.85082 48.94446, -57.85058 48.9...\n\n\n2\n72302000043\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.973874\n-57.788332\nHumber River\n5.920900e+00\n1.440190e+00\n1.437370e+00\n...\n7900.098\n46\n12109.956\n9100.964613\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-57.83865 48.95172, -57.83824 48.9...\n\n\n3\n72302000051\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.995478\n-57.730291\nHumber River\n3.668880e+01\n9.367000e-02\n2.596000e-02\n...\n397.512\n7\n13444.660\n1334.703115\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.73845 48.99230, -57.73804 48.9...\n\n\n4\n72302000063\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.997805\n-57.715888\nHumber River\n2.784380e+01\n9.033000e-02\n7.670000e-03\n...\n1089.674\n6\n14714.137\n1269.477822\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.72209 48.99569, -57.72168 48.9...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n210\n72350800071\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.791094\n-58.985455\nno_data\n9.711690e+01\n3.278100e+00\n3.276860e+00\n...\n821.862\n82\n119786.053\n16448.306136\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.89330 51.77895, -58.89374 51.7...\n\n\n211\n72350800081\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:10Z\n51.886956\n-59.172704\nno_data\n1.168453e+02\n7.567680e+00\n7.567140e+00\n...\n2599.684\n99\n139644.759\n19858.706858\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.07129 51.82866, -59.07148 51.8...\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n9.837220e+01\n1.775170e+00\n1.772890e+00\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n213\n72350800101\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n52.045314\n-59.409170\nSaint-Augustin River\n1.425316e+02\n7.325890e+00\n7.325330e+00\n...\n590.479\n68\n166028.213\n13615.816320\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-59.37465 52.00988, -59.37449 52.0...\n\n\n214\n72350800111\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.696292\n-58.702223\nno_data\n1.045083e+02\n1.271013e+01\n1.270981e+01\n...\n1257.012\n97\n79887.666\n19340.975021\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.72011 51.63638, -58.72011 51.6...\n\n\n\n\n215 rows × 127 columns\n\n\n\n\n\nPlotting a Shapefile\nUsing Matplotlib to plot the shapefile, then adding a basemap for context using the library Contextily.\nContextily offers a list of basemap providers that can be easily visualized.\nhttps://contextily.readthedocs.io/en/latest/intro_guide.html\n\nfig, ax = plt.subplots(figsize=(25,15))\nRiver.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.OpenTopoMap)\n\n\n\n\n\n\n\n\n\n\nShapefile Attribute Visualization\nShapefiles have various attributes or variables with each column signifiying individual data values.\nPreviously, we plotted by showcasing the full path of the river reach on the map.\nYou can also plot a shapefile based on a specific variable.\nWithin Matplotlib you can specifiy the column parameter based on the column within the datasets attributes.\nFor the example below, we will look at the column ‘wse’ which stands for water surface elevation.\n\n#First, we set all -999999999999 values to nan so that the color variation shows in the values.\nRiver[\"wse\"] = River.wse.apply(lambda x: x if x > -10 else np.nan)\n\n\nfig, ax = plt.subplots(figsize=(15,15))\nRiver.plot(column='wse', ax=ax, legend=True, cmap='viridis')\n\n\n\n\n\n\n\n\n\n\nQuerying a Shapefile\nIf you want to search for a specific reach id or a specific length of river reach that is possible through a spatial query using Geopandas.\nUtilizing comparison operators (>, <, ==, >=, <=).\n\nQuery = River.query(\"reach_id == '72350800091'\")\nQuery\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n98.3722\n1.77517\n1.77289\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n\n\n1 rows × 127 columns\n\n\n\n\nfig, ax = plt.subplots(figsize=(25,15))\nQuery.plot(ax=ax, legend=True)\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.Esri.NatGeoWorldMap)\n\n\n\n\n\n\n\n\n\n\nYou can specify river reaches that have a water surface elevation greater than 35 meters.\n\nWSE = River.query('wse > 35')\nWSE\n\n\n\n\n\n\n\n\nreach_id\ntime\ntime_tai\ntime_str\np_lat\np_lon\nriver_name\nwse\nwse_u\nwse_r_u\n...\np_wid_var\np_n_nodes\np_dist_out\np_length\np_maf\np_dam_id\np_n_ch_max\np_n_ch_mod\np_low_slp\ngeometry\n\n\n\n\n0\n72302000011\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.945799\n-57.862132\nHumber River\n42.3641\n0.86330\n0.85859\n...\n675.648\n10\n2135.645\n1984.456750\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.87428 48.95038, -57.87387 48.9...\n\n\n3\n72302000051\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n48.995478\n-57.730291\nHumber River\n36.6888\n0.09367\n0.02596\n...\n397.512\n7\n13444.660\n1334.703115\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.73845 48.99230, -57.73804 48.9...\n\n\n9\n72302000111\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:00Z\n49.170904\n-57.404776\nno_data\n118.9760\n0.83515\n0.83029\n...\n105.642\n28\n50331.655\n5596.729779\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-57.43636 49.16979, -57.43570 49.1...\n\n\n10\n72302000123\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:00Z\n49.177845\n-57.348725\nno_data\n116.7355\n0.09589\n0.03309\n...\n35547.561\n20\n54269.288\n3937.633107\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-57.37279 49.17719, -57.37255 49.1...\n\n\n11\n72302000131\n7.606277e+08\n7.606278e+08\n2024-02-07T13:29:01Z\n49.171135\n-57.263679\nno_data\n92.1803\n1.43050\n1.42767\n...\n500301.988\n61\n66530.524\n12261.235771\n-1.000000e+12\n0\n4\n1\n0\nLINESTRING (-57.32502 49.17382, -57.32461 49.1...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n210\n72350800071\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.791094\n-58.985455\nno_data\n97.1169\n3.27810\n3.27686\n...\n821.862\n82\n119786.053\n16448.306136\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.89330 51.77895, -58.89374 51.7...\n\n\n211\n72350800081\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:10Z\n51.886956\n-59.172704\nno_data\n116.8453\n7.56768\n7.56714\n...\n2599.684\n99\n139644.759\n19858.706858\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.07129 51.82866, -59.07148 51.8...\n\n\n212\n72350800091\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n51.966072\n-59.344178\nno_data\n98.3722\n1.77517\n1.77289\n...\n2313.937\n64\n152412.397\n12767.637572\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-59.37449 52.01016, -59.37465 52.0...\n\n\n213\n72350800101\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:01Z\n52.045314\n-59.409170\nSaint-Augustin River\n142.5316\n7.32589\n7.32533\n...\n590.479\n68\n166028.213\n13615.816320\n-1.000000e+12\n0\n1\n1\n0\nLINESTRING (-59.37465 52.00988, -59.37449 52.0...\n\n\n214\n72350800111\n7.606277e+08\n7.606277e+08\n2024-02-07T13:28:11Z\n51.696292\n-58.702223\nno_data\n104.5083\n12.71013\n12.70981\n...\n1257.012\n97\n79887.666\n19340.975021\n-1.000000e+12\n0\n2\n1\n0\nLINESTRING (-58.72011 51.63638, -58.72011 51.6...\n\n\n\n\n116 rows × 127 columns\n\n\n\n\nfig, ax = plt.subplots(figsize=(25,15))\nWSE.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=River.crs, source=cx.providers.Esri.NatGeoWorldMap)", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", - "Transform Data", - "NetCDF to Geotiff", - "Windows" + "GIS Workflows", + "Shapefile Exploration" ] }, { - "objectID": "notebooks/GIS/SWOTshp_CSVconversion.html#before-you-start", - "href": "notebooks/GIS/SWOTshp_CSVconversion.html#before-you-start", - "title": "SWOT Shapefile Data Conversion to CSV", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\n\nauth = earthaccess.login() \n\n\nSearch for SWOT data\nLet’s start our search for Lake Vector Shapefiles in North America. SWOT files come in “Prior”, “Obs” or “Unassigned” versions in the same collection, here we want the Prior Lakes from the Prior Lake Database. We will also only get files for North America, or ‘NA’ and can call out a specific pass number that we want. Each dataset has it’s own shortname associate with it, for the SWOT Lake shapefiles, it is SWOT_L2_HR_LakeSP_2.0.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_2.0', \n temporal = ('2024-01-01 00:00:00', '2024-05-30 23:59:59'), # can also specify by time\n granule_name = '*Prior*_009_NA*') # here we filter by Prior files (not observed or Unassigned), pass=009, continent code=NA\n\nGranules found: 4\n\n\nDuring the science orbit, a pass will be repeated once every 21 days. A particular location may have different passes observe it within the 21 days, however.\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_files/\")\nfolder = Path(\"../datasets/data_downloads/SWOT_files\")\n\n Getting 4 granules, approx download size: 0.27 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\nUnzip shapefiles in existing folder\n\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nOpening multiple shapefiles from within a folder\nLets open all the shapefiles we’ve downloaded together into one database. This approach is ideal for a small number of granules, but if you’re looking to create large timeseries, consider using the PO.DAAC Hydrocron tool.\n\n# Initialize list of shapefiles containing all dates\nSWOT_HR_shps = []\n\n# Loop through queried granules to stack all acquisition dates\nfor j in range(len(results)):\n filename = earthaccess.results.DataGranule.data_links(results[j], access='external')\n filename = filename[0].split(\"/\")[-1]\n filename_shp = filename.replace('.zip','.shp')\n filename_shp_path = f\"{folder}\\{filename_shp}\"\n SWOT_HR_shps.append(gpd.read_file(filename_shp_path)) \n\n\n# Combine granules from all acquisition dates into one dataframe\nSWOT_HR_df = gpd.GeoDataFrame(pd.concat(SWOT_HR_shps, ignore_index=True))\n\n# Sort dataframe by lake_id and time\nSWOT_HR_df = SWOT_HR_df.sort_values(['lake_id', 'time'])\n\nSWOT_HR_df\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n42426\n7120818372\nno_data\n712239L000048\n100\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n4.374300e+02\n6.300000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41107 47.75727, -93.41081 47.757...\n\n\n97969\n7120818372\nno_data\n712239L000028\n100\n1\n7.612870e+08\n7.612870e+08\n2024-02-15T04:35:57Z\n4.373460e+02\n7.900000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41115 47.75730, -93.41090 47.757...\n\n\n156135\n7120818372\nno_data\n712239L000025\n100\n1\n7.648924e+08\n7.648924e+08\n2024-03-27T22:06:05Z\n4.377310e+02\n5.600000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41200 47.75739, -93.41174 47.757...\n\n\n215861\n7120818372\nno_data\n712239L000027\n92\n1\n7.666951e+08\n7.666951e+08\n2024-04-17T18:51:11Z\n4.376710e+02\n2.300000e-02\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41199 47.75734, -93.41174 47.757...\n\n\n42460\n7120818382\nno_data\n712239L000049\n99\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n4.257550e+02\n2.100000e-02\n...\nRAT LAKE\n-99999999\n-93.357210\n47.749259\n-1.000000e+12\n0.1989\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.35303 47.75061, -93.35273 47.750...\n\n\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n...\n\n\n206470\n7710076862\nno_data\n771190R000017\n86\n1\n7.666946e+08\n7.666946e+08\n2024-04-17T18:43:01Z\n2.810479e+03\n3.900000e-02\n...\nno_data\n-99999999\n-99.916944\n19.984955\n-1.000000e+12\n0.0459\nno_data\n-1.000000e+12\n-1.000000e+12\nMULTIPOLYGON (((-99.91661 19.98636, -99.91650 ...\n\n\n36628\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n73000\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n130255\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n188022\n7710076872\nno_data\nno_data\nno_data\nno_data\n-1.000000e+12\n-1.000000e+12\nno_data\n-1.000000e+12\n-1.000000e+12\n...\nno_data\n-99999999\n-100.263287\n20.393474\n-1.000000e+12\n0.0513\nno_data\n-1.000000e+12\n-1.000000e+12\nNone\n\n\n\n\n225984 rows × 51 columns\n\n\n\n\n\nQuerying a Shapefile\nLet’s get the attributes from a particular reach of the merged shapefile. If you want to search for a specific lake_id, Lake IDs can be identified in the Prior Lake Database (PLD) - Add in the PLD layer into Hydroweb.next to see the lakes SWOT products are based upon.\n\nreach = SWOT_HR_df.query(\"lake_id == '7120818372'\")\nreach\n\n\n\n\n\n\n\n\nlake_id\nreach_id\nobs_id\noverlap\nn_overlap\ntime\ntime_tai\ntime_str\nwse\nwse_u\n...\nlake_name\np_res_id\np_lon\np_lat\np_ref_wse\np_ref_area\np_date_t0\np_ds_t0\np_storage\ngeometry\n\n\n\n\n42426\n7120818372\nno_data\n712239L000048\n100\n1\n7.576815e+08\n7.576816e+08\n2024-01-04T11:05:46Z\n437.430\n0.063\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41107 47.75727, -93.41081 47.757...\n\n\n97969\n7120818372\nno_data\n712239L000028\n100\n1\n7.612870e+08\n7.612870e+08\n2024-02-15T04:35:57Z\n437.346\n0.079\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41115 47.75730, -93.41090 47.757...\n\n\n156135\n7120818372\nno_data\n712239L000025\n100\n1\n7.648924e+08\n7.648924e+08\n2024-03-27T22:06:05Z\n437.731\n0.056\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41200 47.75739, -93.41174 47.757...\n\n\n215861\n7120818372\nno_data\n712239L000027\n92\n1\n7.666951e+08\n7.666951e+08\n2024-04-17T18:51:11Z\n437.671\n0.023\n...\nno_data\n-99999999\n-93.412112\n47.756423\n-1.000000e+12\n0.0207\nno_data\n-1.000000e+12\n-1.000000e+12\nPOLYGON ((-93.41199 47.75734, -93.41174 47.757...\n\n\n\n\n4 rows × 51 columns\n\n\n\n\n\nConverting to CSV\nWe can convert the merged timeseries geodataframe for this reach into a csv file.\n\ngdf.to_csv(folder / 'csv_7120818372.csv')", + "objectID": "notebooks/GIS/SWOT_GISshapefiles.html#merging-multiple-reaches-to-a-single-shapefile", + "href": "notebooks/GIS/SWOT_GISshapefiles.html#merging-multiple-reaches-to-a-single-shapefile", + "title": "SWOT North American Continent Hydrology Dataset", + "section": "Merging multiple reaches to a single shapefile", + "text": "Merging multiple reaches to a single shapefile\n\nIf you have multiple River Reaches or Nodes in a folder, it is possible to visualize all on a single map.\nUtilizing both Glob and Pathlib libraries to read the folder, then using Pandas concat to merge the reaches to its own variable.\n\n\n# State filename extension to look for within folder, in this case .shp which is the shapefile\nshapefiles = folder.glob(\"*.shp\")\n\n# Merge/Combine multiple shapefiles in folder into one\ngdf = pd.concat([\n gpd.read_file(shp)\n for shp in shapefiles\n]).pipe(gpd.GeoDataFrame)\n\n# Export merged geodataframe into shapefile\ngdf.to_file(folder / 'SWOTReaches_Feb.shp')\n\n\nfig, ax = plt.subplots(figsize=(25,15))\ngdf.plot(ax=ax, color='black')\ncx.add_basemap(ax, crs=gdf.crs, source=cx.providers.OpenTopoMap)", + "crumbs": [ + "Tutorials", + "Dataset Specific", + "SWOT", + "GIS Workflows", + "Shapefile Exploration" + ] + }, + { + "objectID": "notebooks/GIS/Subscriber_nc_to_tif_SWOT.html", + "href": "notebooks/GIS/Subscriber_nc_to_tif_SWOT.html", + "title": "podaac-data-subscriber NetCDF to Geotiff Conversion", + "section": "", + "text": "Author: Jack McNelis, PO.DAAC\n\n\nSummary\nThe following workflow extracts a single variable of interest (water surface elevation (wse)) from the SWOT_L2_HR_Raster_2.0 and writes the original raster netCDF it to a geotiff via the podaac-data-subscriber tool.\n\n\nRequirements\n\nThis tutorial can be run in any Linux environment. (The subscriber tool can be run in any environment, not just Linux, but the bash script used as the process will only work in a Linux environment.)\nEarthdata Login - An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\nnetrc File - You will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\n\nLearning Objectives\n\nUse the “–process” option in the podaac-data-subscriber\nConvert netCDF files to geotiff files using gdalmdimtranslate in a bash script\n\n\n\nCreate a Bash Script\nInside a bash script entitled, test.sh, set up the following command which calls gdalmdimtranslate to write the wse variable in the downloaded netcdf file to a new geotiff in the same directory:\n#!/bin/bash\ngdalmdimtranslate \\\n -of \"GTiff\" \\\n -co \"COMPRESS=LZW\" \\\n -array \"wse\" \\\n ${1} $(basename $1 | sed 's/.nc/.wse.tif/g')\n\n\nCall the Data Subscriber\nThen, after installing the podaac-data-subscriber package, write the following command in your terminal that uses the podaac-data-subscriber to run the bash script:\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d ~/test_podaac/ -sd 2024-02-15T15:15:00Z -ed 2024-02-15T15:16:00Z --process \"${PWD}/test.sh\"\nIf you get a permission denied error for test.sh, Make sure the permissions on the .sh file are set to read, write & executable. If you are unsure what your permissions are, in the command prompt you can execute “chmod 0755 test.sh” and permissions should be updated.\nListed Results from the above command should be as follows:\n$ ls\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc\nSWOT_L2_HR_Raster_100m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_030F_20240215T151441_20240215T151502_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_031F_20240215T151501_20240215T151522_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_032F_20240215T151521_20240215T151542_PIC0_01.wse.tif\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.nc\nSWOT_L2_HR_Raster_250m_UTM13U_N_x_x_x_011_022_033F_20240215T151541_20240215T151602_PIC0_01.wse.tif\ntest.sh", "crumbs": [ "Tutorials", "Dataset Specific", "SWOT", "Transform Data", - "Lake Time Series" + "NetCDF to Geotiff", + "Mac/Linux" ] }, { - "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#summary", - "href": "notebooks/GIS/SWOT_datetime_GIS.html#summary", - "title": "SWOT Date/Time Transformation", + "objectID": "notebooks/GIS/MUR_SSTA_QGIS.html#summary", + "href": "notebooks/GIS/MUR_SSTA_QGIS.html#summary", + "title": "Mapping Sea Surface Temperature Anomalies in QGIS", "section": "Summary", - "text": "Summary\nThe following workflow lets you create time series plots with various Geographical Information System (GIS) Desktop softwares by transforming SWOT_L2_HR_RiverSP_2.0 Shapefile vector datasets.", + "text": "Summary\n\nThis tutorial uses QGIS to visualize the the sea surface temperature anomalies (SSTA) over the Pacific Ocean for April 24, 2023. The SST anomaly variable is derived from a MUR climatology dataset - MUR25-JPL-L4-GLOB-v04.2 (average between 2003 and 2014).\nBackground: SSTA is an important variable when studying El Niño-Southern Oscillation (ENSO), a climate pattern in the Pacific Ocean that has two phases: El Niño (warm/wet phase) and La Niña (cold/dry phase). ENSO has global impacts on wildfires, weather, and ecosystems. Here, we will change the projection of our data to better reveal the El Niño in 2023.", "crumbs": [ "Tutorials", "Dataset Specific", - "SWOT", - "GIS Workflows", - "Datetime Conversion" + "GHRSST", + "In QGIS" ] }, { - "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#requirements", - "href": "notebooks/GIS/SWOT_datetime_GIS.html#requirements", - "title": "SWOT Date/Time Transformation", + "objectID": "notebooks/batch_download_podaac_data.html#set-up-your-netrc-file", + "href": "notebooks/batch_download_podaac_data.html#set-up-your-netrc-file", + "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", + "section": "Set up your netrc file", + "text": "Set up your netrc file\nFollow these instructions on the Earthdata Wiki to authenticate and store your URS cookies in a local file. You can batch download really efficiently this way, effectively “pre-authenticated” through your previous session." + }, + { + "objectID": "notebooks/batch_download_podaac_data.html#prepare-a-list-of-files-to-download", + "href": "notebooks/batch_download_podaac_data.html#prepare-a-list-of-files-to-download", + "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", + "section": "Prepare a list of files to download", + "text": "Prepare a list of files to download\nNow the only step that remains is to get a list of URLs to pass to wget or curl for downloading. There’s a lot of ways to do this but here we will rely on Earthdata Search.\n1. Find the collection/dataset of interest in Earthdata Search.\nStart by searching for your collection of interest. Here we are providing an ECCO example from this complete list of ECCO collections in Earthdata Search (79 in total), and refine the results until we see the dataset of interest. In this example we want monthly sea surface height grids provided at 0.5-degree cell resolution on an interpolated latitude/longitude grid.\n2. Pick your collection, then click the green Download All button on the next page.\nClick the big green button identified by the red arrow/box in the screenshot below.\n\nThat will add all the granules in the collection to your “shopping cart” and then redirect you straight there and present you with the available options for customizing the data prior to download. We will ignore those because they’re mostly in active development and because we want to download all data in the collection.\n\n\n\nThe screenshot above shows the download customization interface (i.e. “shopping cart”)\n\n\n3. Click Download Data to get your list of download urls (bottom-left, another green button)\nThe Download Data button takes you to one final page that provides the list of urls from which to download the files matching your search parameters and any customization options that you selected in the steps that followed. This page will be retained in your User History in case you need to return to it later.\n\nThere are several ways that you could get the list of urls into a text file that’s accessible from Jupyter or your local shell. Click the Save button to download the list of files to a text file. This will by default save it with a name like 5237392644-download.txt (numbers will be different for each download job).\n\nNote: Earthdata Search also provides a shell script for downloading this list of files, accessible from the “Download Script” tab." + }, + { + "objectID": "notebooks/batch_download_podaac_data.html#download-files-in-a-batch-with-gnu-wget", + "href": "notebooks/batch_download_podaac_data.html#download-files-in-a-batch-with-gnu-wget", + "title": "Instructions for HTTPS download from the PO.DAAC and NASA Earthdata", + "section": "Download files in a batch with GNU Wget", + "text": "Download files in a batch with GNU Wget\nThe key wget option for this purpose is specified using the -i argument – it takes the path to the text file containing the download urls.\nAnother nice feature of wget is the capability to continue downloads started during a previous session if they were interrupted. Pass -c to enable.\nMake a data/ directory, then run wget and give its path to the -P argument to download the files into that directory:\nmkdir data\n\nwget --no-verbose \\\n --no-clobber \\\n --continue \\\n -i 5237392644-download.txt -P data/" + }, + { + "objectID": "notebooks/harmony subsetting/shapefile_subset.html", + "href": "notebooks/harmony subsetting/shapefile_subset.html", + "title": "L2SS-Py Shapefile Subsetting", + "section": "", + "text": "This notebook demonstates subsetting multiple data files by an existing shapefile.\nImport Harmony Python library\n\nfrom harmony import BBox, Client, Collection, Request\nfrom harmony.config import Environment\n\nImport libraries used to visualize l2ss-py result\n\nimport datetime as dt\nimport xarray as xr\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\n\nimport cartopy.io.img_tiles as cimgt\nimport cartopy.crs as ccrs\nfrom cartopy.io.shapereader import Reader\nfrom cartopy.feature import ShapelyFeature\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nCreate Harmony client. In this case, point the Harmony client at the LOCAL Harmony environment.\n\nharmony_client = Client()\n\nThe example utilized in this demo uses a shapefile of the Gulf of Mexico. That shapefile ZIP file is in the local directory this notebook is running in.\n\nshapefile_path = 'gulf_shapefile.zip' \ncollection_id = 'C2075141605-POCLOUD' # ASCATB-L2-Coastal\n\nrequest = Request(\n collection=Collection(id=collection_id),\n shape=shapefile_path,\n granule_id=[\n 'G2244750740-POCLOUD',\n 'G2244133671-POCLOUD',\n 'G2243066020-POCLOUD'\n ]\n)\n\nrequest.is_valid()\n\nTrue\n\n\nWait for processing and then view the output\n\njob_id = harmony_client.submit(request)\nprint(f'jobID = {job_id}')\n\nprint('\\n Waiting for the job to finish. . .\\n')\nharmony_client.wait_for_processing(job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\njobID = 3af6c0ce-bbed-45b0-86ae-265a00182a6f\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\ndef display_wind_speed(nc_file_name):\n ds = xr.load_dataset(nc_file_name, engine='netcdf4')\n lats = ds.lat.values\n lons = ds.lon.values\n wind_speed_data = ds.wind_speed.values\n\n ax = plt.axes(projection=ccrs.PlateCarree())\n ax.set_global()\n ax.coastlines()\n # Zoom in to ~ north america\n ax.set_extent([-170, -20, 0, 40])\n ax.contourf(lons, lats, wind_speed_data)\n plt.show()\n\n\nfor filename in [f.result() for f in harmony_client.download_all(job_id)]:\n display_wind_speed(filename)\n print(filename)\n \n\n\n\n\n\n\n\n\nascat_20220328_023300_metopb_49418_eps_o_coa_3202_ovw.l2_subsetted.nc4\n\n\n\n\n\n\n\n\n\nascat_20220329_140000_metopb_49439_eps_o_coa_3202_ovw.l2_subsetted.nc4\n\n\n\n\n\n\n\n\n\nascat_20220330_152100_metopb_49454_eps_o_coa_3202_ovw.l2_subsetted.nc4" + }, + { + "objectID": "notebooks/s3/S3-Access.html", + "href": "notebooks/s3/S3-Access.html", + "title": "Direct S3 Access tutorial", + "section": "", + "text": "This tutorial will show you how to authenticate with the PO.DAAC data archive, and gain access to the data in amazon S3 buckets. This allows you to natively list, copy, get data from the PO.DAAC archive using your preferred amazon methods (e.g. Python boto3, amazon SDK, aws cli).\nnote Direct S3 access is only available to users running in AWS, us-west-2 region. All other access must come from HTTP requests for PO.DAAC data\nimport boto3\nimport json\nimport requests\nimport xarray as xr\n%matplotlib inline" + }, + { + "objectID": "notebooks/s3/S3-Access.html#get-temporary-aws-credentials-for-access", + "href": "notebooks/s3/S3-Access.html#get-temporary-aws-credentials-for-access", + "title": "Direct S3 Access tutorial", + "section": "Get Temporary AWS Credentials for Access", + "text": "Get Temporary AWS Credentials for Access\nS3 is an ‘object store’ hosted in AWS for cloud processing. Direct S3 access is achieved by passing NASA supplied temporary credentials to AWS so we can interact with S3 objects from applicable Earthdata Cloud buckets. Note, these temporary credentials are valid for only 1 hour. A netrc file is required to aquire these credentials. Use the NASA Earthdata Authentication to create a netrc file in your home directory. (Note: A NASA Earthdata Login is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.)\nThe following crediential is for PODAAC, but other credentials are needed to access data from other NASA DAACs.\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\nCreate a function to make a request to an endpoint for temporary credentials.\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nList all datasets available using boto3\n\ns3_client = boto3.client(\n 's3',\n aws_access_key_id=temp_creds_req[\"accessKeyId\"],\n aws_secret_access_key=temp_creds_req[\"secretAccessKey\"],\n aws_session_token=temp_creds_req[\"sessionToken\"]\n)\n\n\ns3_client.list_objects(Bucket=\"podaac-ops-cumulus-protected\", Prefix=\"ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/\")\n\n\n\nDownload a specific file within the cloud, open and plot a variable from it\n\ns3_client.download_file(\"podaac-ops-cumulus-protected\", \"ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\",\"ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\")\n\n\nds = xr.open_dataset(\"ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-01_ECCO_V4r4_latlon_0p50deg.nc\")\nds\n\n\nds.EXFwspee.plot()\n\n\n\nSet up an s3fs session for Direct Access without downloading within the cloud\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the temporary credentials we recieved from our temporary credentials endpoint and then find the s3 paths to the data we want.\n\nimport s3fs\nimport os\n\nos.environ[\"AWS_ACCESS_KEY_ID\"] = temp_creds_req[\"accessKeyId\"]\nos.environ[\"AWS_SECRET_ACCESS_KEY\"] = temp_creds_req[\"secretAccessKey\"]\nos.environ[\"AWS_SESSION_TOKEN\"] = temp_creds_req[\"sessionToken\"]\n\ns3 = s3fs.S3FileSystem(anon=False)\n\ns3path = 's3://podaac-ops-cumulus-protected/MUR-JPL-L4-GLOB-v4.1/202101*.nc'\n#s3path = 's3://podaac-ops-cumulus-protected/ECCO_L4_ATM_STATE_05DEG_DAILY_V4R4/ATM_SURFACE_TEMP_HUM_WIND_PRES_day_mean_1992-01-*.nc'\nremote_files = s3.glob(s3path)\n\n\nremote_files\n\n\nfileset = [s3.open(file) for file in remote_files]\n\nOpen all files and combine into one xarray dataset\n\ndata = xr.open_mfdataset(fileset, combine='by_coords', engine='h5netcdf' )\ndata\n\n\ndata.analysed_sst.sel(lat=21.00, lon=-21.00).plot()" + }, + { + "objectID": "notebooks/DataStories/eof_example_ersst.html#summary", + "href": "notebooks/DataStories/eof_example_ersst.html#summary", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "Summary", + "text": "Summary\nThis demo replicates part of an empirical orthogonal function (EOF) analysis on century-long, global sea surface temperatures (SSTs) published in Journal of Climate (Messie and Chavez, 2011): https://doi.org/10.1175/2011JCLI3941.1, and can be run entirely in the cloud. In this analysis, the first 6 EOF modes of global SST are investigated once signals from long term warming and the seasonal cycle are removed.\nThe EOFs are computed on Smith and Reynolds Extended Reconstructed SST dataset in netCDF4 format (available on NASA’s PO.DAAC, https://doi.org/10.5067/ERSST-L4N50), which provides monthly mean SST data gridded over the globe between 65 degrees N/S at 2 degree x 2 degree resolution. A subset of the data are taken for the period 1910 to 2008. As in Messie and Chavez (2011), the first 6 EOF’s and principal components (PC’s) are plotted (their Figures 4 and 5 respectively). We also reproduce their global map of SST variance at each gridpoint (their Fig. 2a).\nData are accessed using the earthaccess package, then loaded and preprocessed (e.g. linear trend and seasonal cycle removed) using Xarray built in functions. The EOF decomposition uses the xeofs package (https://xeofs.readthedocs.io/en/latest/).", + "crumbs": [ + "Tutorials", + "Science Data Stories", + "Monthly SST EOF Decomposition" + ] + }, + { + "objectID": "notebooks/DataStories/eof_example_ersst.html#requirements", + "href": "notebooks/DataStories/eof_example_ersst.html#requirements", + "title": "EOF decomposition of global monthly SST data using the xeofs package", "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\n\nLocal compute environment e.g. laptop, server: this tutorial can be run on your local machine.\n\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n\nLearning Objectives:\n\nAccessing SWOT shapefile hydrology dataset through earthaccess and downloading it locally.\nUtilizing geoprocessing tools with GIS Desktop Softwares; ArcGIS Pro and QGIS.\nTransforming ‘time_str’ attribute/variable to a Date/Time data type.\n\nUtilizing the new data type variable to create a time series plot/chart.\n\n\n\n\nImport libraries\n\nimport os\nimport glob \nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport contextily as cx\nimport zipfile\nimport earthaccess", + "text": "Requirements\n\ni. Compute Environment\nThis tutorial can be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine. However, accessing and loading >1000 files into local memory will take a long time, in comparison to running this notebook from AWS.\n\n\nii. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\niii. Additional Requirements\n\nIt is recommended that you have some basic familiarity with the Xarray package in Python.", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Datetime Conversion" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#authentication-with-earthaccess", - "href": "notebooks/GIS/SWOT_datetime_GIS.html#authentication-with-earthaccess", - "title": "SWOT Date/Time Transformation", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login()\n\n\nSearch using earthaccess for SWOT River Reaches\nEach dataset has it’s own unique collection concept ID. For this dataset it is SWOT_L2_HR_RiverSP_2.0. SWOT files come in “reach” and “node” versions in this same collection, here we want the 10km reaches rather than the nodes. We will also only get files for North America, or ‘NA’.\n\nresults = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_2.0', \n temporal = ('2024-02-01 00:00:00', '2024-02-29 23:59:59'), # can also specify by time\n granule_name = '*Reach*_NA_*') # here we filter by Reach files (not node), continent code=NA\n\nGranules found: 192\n\n\n\n\nDownload the Data into a folder\n\nearthaccess.download(results, \"../datasets/data_downloads/SWOT_files\")\n\n\n\nUnzip shapefiles to existing folder\n\nfolder = Path(\"../datasets/data_downloads/SWOT_files\")\nfor item in os.listdir(folder): # loop through items in dir\n if item.endswith(\".zip\"): # check for \".zip\" extension\n zip_ref = zipfile.ZipFile(f\"{folder}/{item}\") # create zipfile object\n zip_ref.extractall(folder) # extract file to dir\n zip_ref.close() # close file\n\n\n\nMerging multiple reaches to a single shapefile\nSince a time series plot will be created, merging all the shapefiles to one will be the better option.\n\n# State filename extension to look for within folder, in this case .shp which is the shapefile\nshapefiles = folder.glob(\"*.shp\")\n\n# Merge/Combine multiple shapefiles in folder into one\ngdf = pd.concat([\n gpd.read_file(shp)\n for shp in shapefiles\n]).pipe(gpd.GeoDataFrame)\n\n# Export merged geodataframe into shapefile\ngdf.to_file(folder / 'SWOTReaches.shp')", + "objectID": "notebooks/DataStories/eof_example_ersst.html#learning-objectives", + "href": "notebooks/DataStories/eof_example_ersst.html#learning-objectives", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "Learning objectives", + "text": "Learning objectives\n\nReplicate results from published researched fully in the cloud.\nUse a data access workflow with the earthaccess package that can be used both locally and in the cloud.\nLoad and preprocess (e.g. linear trend and seasonal cycle removed) using Xarray built in functions.\nPerform an EOF decomposition using the xeofs package.", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Datetime Conversion" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#arcgis-pro", - "href": "notebooks/GIS/SWOT_datetime_GIS.html#arcgis-pro", - "title": "SWOT Date/Time Transformation", - "section": "ArcGIS Pro", - "text": "ArcGIS Pro\nEsri’s ArcGIS Pro offers a geoproccesing tool called ‘Convert Time Field’.\nThis allows the transformation of date and time values to be created from one field to another.\nIn this case the date/time field ‘time_str’ is in a text data type format. It needs to be converted to a date/time data type in order to create a time series plot.\nThe ‘no_data’ values do not get converted; it keeps it as ‘NULL’\n\n\n\n\nOnce the new field is created, this allows for the creation of a time series plot.\nThis is a great way to observe an area with multiple days of measurements.\nIn this case, we will configure a line plot in the chart properties of the median of water surface elevation ‘wse’.", + "objectID": "notebooks/DataStories/eof_example_ersst.html#additional-references", + "href": "notebooks/DataStories/eof_example_ersst.html#additional-references", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "Additional References", + "text": "Additional References\n\nThis reference was used as inspiration for implementing the analysis in Python: https://github.com/royalosyin/Python-Practical-Application-on-Climate-Variability-Studies/blob/master/ex18-EOF%20analysis%20global%20SST.ipynb\nGithub issue with information on scaling the output from the xeofs package in different ways (for example the scale of the initial EOF and PC output by xeofs do not match those of the publication, but could be recomputed to do so): https://github.com/nicrie/xeofs/issues/81", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Datetime Conversion" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/GIS/SWOT_datetime_GIS.html#qgis", - "href": "notebooks/GIS/SWOT_datetime_GIS.html#qgis", - "title": "SWOT Date/Time Transformation", - "section": "QGIS", - "text": "QGIS\nQGIS offers a geoproccesing tool called ‘Refactor Fields’.\nThis modifies the date/time values of the current field and creates a new layer.\nIn this case the date/time field ‘time_str’ can be changed to a date/time data type.\n\n\n\n\nIn the ‘type’ section, you can select the data type of your choosing but for this case we will select ‘Date & Time’.\nThe new layer can be saved to memory as a temporary layer, but its best to save the layer locally.\n\n\n\n\nThe new layer created does not include the ‘no_data’ values.\nAs shown in the image below; the black symbology is the original layer and the red symbology is the newly created layer without the ‘no_data’ values.\n\n\n\n\nWithin the processing toolbox, to create a time series select the ‘Plots’ category to show the various ways of plotting data.\n\n\n\n\nThere also is the option of using the plugin DataPlotly, which utilizes the python library Plotly.\nThis offers a variety of ways to plot and customize your charts.\nFor this example, we will configure a box plot looking at both time and ‘wse’. Also, querying ‘wse’ to only include values greater than 0, so it does not include any negative values.\n\n\n\n\nThis plot showcases the data without the date/time transformation for a single month.\n\n\n\n\nThis plot is the same single month dataset but with the date/time transformation.\n\n\n\n\nThis plot showcases a single pass river reach as the same transformed image from above.", + "objectID": "notebooks/DataStories/eof_example_ersst.html#import-packages", + "href": "notebooks/DataStories/eof_example_ersst.html#import-packages", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "Import Packages", + "text": "Import Packages\nIn addition to the packages imported below, the following are also needed: * The cftime package is required to decode the dataset’s timestamps using Xarray. * The h5netcdf package should be installed as a backend for Xarray to open the data.\n\n## Version numbers listed next to each package:\n\n# Data location and access packages:\nimport earthaccess # 0.6.1\n\n# Analysis packages:\nimport xarray as xr # 2023.9.0\nimport numpy as np # 1.26.0\nimport xeofs as xe # 1.1.0\n\n# Visualization packages:\nimport matplotlib.pyplot as plt # 3.8.0\nfrom cartopy.crs import EqualEarth, PlateCarree # 0.22.0\n\n%matplotlib inline\n\n\nlibgomp: Invalid value for environment variable OMP_NUM_THREADS", "crumbs": [ "Tutorials", - "Dataset Specific", - "SWOT", - "GIS Workflows", - "Datetime Conversion" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#set-start-and-end-dates", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#set-start-and-end-dates", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Set start and end dates", - "text": "Set start and end dates\n\nstart_date = \"1992-01-01\"\nend_date = \"2002-12-31\"\n\n# break it down into Year, Month, Day (and minutes and seconds if desired) \n# as inputs to harmony.py call using datetime()\nstart_year = 2002\nstart_month = 1\nstart_day = 1\n\nend_year = 2017\nend_month = 12\nend_day = 31", + "objectID": "notebooks/DataStories/eof_example_ersst.html#authenticate", + "href": "notebooks/DataStories/eof_example_ersst.html#authenticate", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "1.1 Authenticate", + "text": "1.1 Authenticate\n\nearthaccess.login() # Login with your credentials\n\n<earthaccess.auth.Auth at 0x7ffa83386810>", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#spatial-bounds-region-of-interest-not-used", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#spatial-bounds-region-of-interest-not-used", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Spatial bounds (Region of Interest) – Not used", - "text": "Spatial bounds (Region of Interest) – Not used\n\nwesternmost_longitude = 100.\neasternmost_longitude = 150.\nnorthermost_latitude = 30.\nsouthernmost_latitude = 0.", + "objectID": "notebooks/DataStories/eof_example_ersst.html#locate-data-files", + "href": "notebooks/DataStories/eof_example_ersst.html#locate-data-files", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "1.2 Locate data files", + "text": "1.2 Locate data files\nThe earthaccess package is used to login to locate file path endpoints and wrap them in “file-like objects” readable by Xarray, without downloading the files.\nAlthough the above study uses the time period 1910 to 2009, we instead use 1910 to 2008, since the data providers of the dataset changed the time format from 2008 onward and xarray doesn’t like trying to concatinate data files with different time formats.\n\n# Locate data file information, which includes endpoints, on Earthdata Cloud:\ndatainfo = earthaccess.search_data(\n short_name=\"REYNOLDS_NCDC_L4_MONTHLY_V5\",\n cloud_hosted=True,\n temporal=(\"1910-01-01\", \"2008-02-01\"), # We only want till end of 2007, but this ending date was required to obtain that.\n )\n\nGranules found: 1178\n\n\n\n# Generate file objects from the endpoints which are compatible with Xarray:\nfileobjs = earthaccess.open(datainfo[1:]) # The month prior to 1910-01-01 is included in the returned endpoints (bug?), so start the list at the 2nd element.\n\n Opening 1177 granules, approx size: 0.12 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\nWarning: This collection contains more than one file per granule. earthaccess will only open the first data link, try filtering the links before opening them.\n\n\n\n\n\nRemoval of one of the file objects which returned a bad result\nThese lines of code are not typically needed for other datasets, but unexpectedly earthaccess returns one endpoint for a file which does not exist. Remove this element from the file objects list:\n\n# Print the bad result just for reference:\nfileobjs_bad = [f for f in fileobjs if type(f) == FileNotFoundError]\nprint(fileobjs_bad)\n\n# Remove this bad result from the list:\nfileobjs = [f for f in fileobjs if type(f) != FileNotFoundError]\n\n[FileNotFoundError('podaac-ops-cumulus-protected/REYNOLDS_NCDC_L4_MONTHLY_V5/ersst.v5.195908.nc.1')]", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#setup-the-harmony-py-service-call-and-execute-a-request", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#setup-the-harmony-py-service-call-and-execute-a-request", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Setup the harmony-py service call and execute a request", - "text": "Setup the harmony-py service call and execute a request\n\n# using the the harmony.py service, set up the request and exectue it\necco_collection = Collection(id=ccid)\ntime_range = {'start': datetime(start_year, start_month, start_day), 'stop': datetime(end_year, end_month, end_day)}\nprint(time_range)\n\nharmony_client = Client(env=Environment.PROD)\n\n# in this example set concatentae to 'False' because the monthly input time steps vary slightly\n# (not always centered in the middle of month)\necco_request = Request(collection=ecco_collection, temporal=time_range, format='application/x-zarr', concatenate='False')\n\n# sumbit request and monitor job\necco_job_id = harmony_client.submit(ecco_request)\nprint('\\n Waiting for the job to finish. . .\\n')\necco_response = harmony_client.result_json(ecco_job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n{'start': datetime.datetime(2002, 1, 1, 0, 0), 'stop': datetime.datetime(2017, 12, 31, 0, 0)}\n\nWaiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!\n\n\n\nYou can also wrap the creation of the Harmony request URL into one function. Shown here for legacy purposes (does not execute a Harmony request):\n\ndef get_harmony_url(ccid,start_date,end_date):\n \"\"\"\n Parameters:\n ===========\n ccid: string\n concept_id of the datset\n date_range: list\n [start_data, end_date] \n \n Return:\n =======\n url: the harmony URL used to perform the netcdf to zarr transformation\n \"\"\"\n \n base = f\"https://harmony.earthdata.nasa.gov/{ccid}\"\n hreq = f\"{base}/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset\"\n rurl = f\"{hreq}?format=application/x-zarr\"\n\n #print(rurl)\n\n subs = '&'.join([f'subset=time(\"{start_date}T00:00:00.000Z\":\"{end_date}T23:59:59.999Z\")']) \n #subs = subs + '&' + '&'.join([f'subset=lat({southernmost_latitude}:{northermost_latitude})'])\n #subs = subs + '&' + '&'.join([f'subset=lon({westernmost_longitude}:{easternmost_longitude})'])\n\n rurl = f\"{rurl}&{subs}\"\n return rurl\n\nccid='C2129189405-POCLOUD'\nprint(get_harmony_url(ccid,start_date,end_date))\n\n# this is the way you would execute it\n# response = requests.get(url=rurl).json()\n\nhttps://harmony.earthdata.nasa.gov/C2129189405-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?format=application/x-zarr&subset=time(\"1992-01-01T00:00:00.000Z\":\"2002-12-31T23:59:59.999Z\")", + "objectID": "notebooks/DataStories/eof_example_ersst.html#load-data", + "href": "notebooks/DataStories/eof_example_ersst.html#load-data", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "1.3 Load data", + "text": "1.3 Load data\nIf working in the cloud, loading and combining all files for this analysis into a single dataset object will take 2-4 minutes. This can be sped up using e.g. kerchunk or parallelization with remote clusters, but to simplify this notebook those methods are not implemented.\nSince we are using Xarray’s open_mfdataset() the returned object includes Dask arrays instead of NumPy arrays. The SST data is small enough that we can load it all into memory, which we will do so that we can proceed even if you are not familiar with Dask arrays (all you need to know is that we have not actually loaded the data into memory yet, so we need one more step after loading the data).\n\n%%time\n\n# Load data:\nsstdata = xr.open_mfdataset(fileobjs)\nsstdata = sstdata.squeeze() # Remove the unnecessary 'lev' dimension (size 1)\nsstdata\n\nCPU times: user 36.2 s, sys: 426 ms, total: 36.6 s\nWall time: 2min 48s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 89, lon: 180, time: 1176)\nCoordinates:\n * lat (lat) float64 -88.0 -86.0 -84.0 -82.0 -80.0 ... 82.0 84.0 86.0 88.0\n lev float64 0.0\n * lon (lon) float64 0.0 2.0 4.0 6.0 8.0 ... 350.0 352.0 354.0 356.0 358.0\n * time (time) object 1910-01-01 00:00:00 ... 2007-12-01 00:00:00\nData variables:\n sst (time, lat, lon) float32 dask.array<chunksize=(1, 89, 180), meta=np.ndarray>\n ssta (time, lat, lon) float32 dask.array<chunksize=(1, 89, 180), meta=np.ndarray>\nAttributes: (12/38)\n Conventions: CF-1.6, ACDD-1.3\n metadata_link: https://doi.org/10.7289/V5T72FNM\n id: ersst.v5.191001\n naming_authority: gov.noaa.ncei\n title: NOAA ERSSTv5 (in situ only)\n summary: ERSST.v5 is developped based on v4 after revi...\n ... ...\n platform: Ship and Buoy SSTs from ICOADS R3.0 and NCEP GTS\n instrument: Conventional thermometers\n source: In situ data: ICOADS R3.0 before 2015, NCEP i...\n comment: SSTs were observed by conventional thermomete...\n references: Huang et al, 2017: Extended Reconstructed Sea...\n climatology: Climatology is based on 1971-2000 SST, Xue, Y...xarray.DatasetDimensions:lat: 89lon: 180time: 1176Coordinates: (4)lat(lat)float64-88.0 -86.0 -84.0 ... 86.0 88.0units :degrees_northlong_name :Latitudestandard_name :latitudeaxis :Ycomment :Uniform grid from -88 to 88 by 2array([-88., -86., -84., -82., -80., -78., -76., -74., -72., -70., -68., -66.,\n -64., -62., -60., -58., -56., -54., -52., -50., -48., -46., -44., -42.,\n -40., -38., -36., -34., -32., -30., -28., -26., -24., -22., -20., -18.,\n -16., -14., -12., -10., -8., -6., -4., -2., 0., 2., 4., 6.,\n 8., 10., 12., 14., 16., 18., 20., 22., 24., 26., 28., 30.,\n 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., 52., 54.,\n 56., 58., 60., 62., 64., 66., 68., 70., 72., 74., 76., 78.,\n 80., 82., 84., 86., 88.])lev()float640.0units :meterslong_name :Depth of sea surface temperature measurementsstandard_name :depthaxis :Zpositive :down_CoordinateAxisType :Heightcomment :Actual measurement depth of in situ sea surface temperature varies from 0.2 to 10 m, but corrected to the nominal depth of buoy at 0.2 marray(0.)lon(lon)float640.0 2.0 4.0 ... 354.0 356.0 358.0units :degrees_eastlong_name :Longitudestandard_name :longitudeaxis :Xcomment :Uniform grid from 0 to 358 by 2array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20., 22.,\n 24., 26., 28., 30., 32., 34., 36., 38., 40., 42., 44., 46.,\n 48., 50., 52., 54., 56., 58., 60., 62., 64., 66., 68., 70.,\n 72., 74., 76., 78., 80., 82., 84., 86., 88., 90., 92., 94.,\n 96., 98., 100., 102., 104., 106., 108., 110., 112., 114., 116., 118.,\n 120., 122., 124., 126., 128., 130., 132., 134., 136., 138., 140., 142.,\n 144., 146., 148., 150., 152., 154., 156., 158., 160., 162., 164., 166.,\n 168., 170., 172., 174., 176., 178., 180., 182., 184., 186., 188., 190.,\n 192., 194., 196., 198., 200., 202., 204., 206., 208., 210., 212., 214.,\n 216., 218., 220., 222., 224., 226., 228., 230., 232., 234., 236., 238.,\n 240., 242., 244., 246., 248., 250., 252., 254., 256., 258., 260., 262.,\n 264., 266., 268., 270., 272., 274., 276., 278., 280., 282., 284., 286.,\n 288., 290., 292., 294., 296., 298., 300., 302., 304., 306., 308., 310.,\n 312., 314., 316., 318., 320., 322., 324., 326., 328., 330., 332., 334.,\n 336., 338., 340., 342., 344., 346., 348., 350., 352., 354., 356., 358.])time(time)object1910-01-01 00:00:00 ... 2007-12-...long_name :Start time of monthstandard_name :timeaxis :Tdelta_t :0000-01-00avg_period :0000-01-00array([cftime.Datetime360Day(1910, 1, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(1910, 2, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(1910, 3, 1, 0, 0, 0, 0, has_year_zero=True), ...,\n cftime.Datetime360Day(2007, 10, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(2007, 11, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(2007, 12, 1, 0, 0, 0, 0, has_year_zero=True)],\n dtype=object)Data variables: (2)sst(time, lat, lon)float32dask.array<chunksize=(1, 89, 180), meta=np.ndarray>long_name :Extended reconstructed sea surface temperaturestandard_name :sea_surface_temperatureunits :degree_Cvalid_min :-3.0valid_max :45.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n71.87 MiB\n62.58 kiB\n\n\nShape\n(1176, 89, 180)\n(1, 89, 180)\n\n\nDask graph\n1176 chunks in 2354 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 180 89 1176\n\n\n\n\nssta(time, lat, lon)float32dask.array<chunksize=(1, 89, 180), meta=np.ndarray>long_name :Extended reconstructed SST anomaliesunits :degree_Cvalid_min :-12.0valid_max :12.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n71.87 MiB\n62.58 kiB\n\n\nShape\n(1176, 89, 180)\n(1, 89, 180)\n\n\nDask graph\n1176 chunks in 2354 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 180 89 1176\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Index([-88.0, -86.0, -84.0, -82.0, -80.0, -78.0, -76.0, -74.0, -72.0, -70.0,\n -68.0, -66.0, -64.0, -62.0, -60.0, -58.0, -56.0, -54.0, -52.0, -50.0,\n -48.0, -46.0, -44.0, -42.0, -40.0, -38.0, -36.0, -34.0, -32.0, -30.0,\n -28.0, -26.0, -24.0, -22.0, -20.0, -18.0, -16.0, -14.0, -12.0, -10.0,\n -8.0, -6.0, -4.0, -2.0, 0.0, 2.0, 4.0, 6.0, 8.0, 10.0,\n 12.0, 14.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0,\n 32.0, 34.0, 36.0, 38.0, 40.0, 42.0, 44.0, 46.0, 48.0, 50.0,\n 52.0, 54.0, 56.0, 58.0, 60.0, 62.0, 64.0, 66.0, 68.0, 70.0,\n 72.0, 74.0, 76.0, 78.0, 80.0, 82.0, 84.0, 86.0, 88.0],\n dtype='float64', name='lat'))lonPandasIndexPandasIndex(Index([ 0.0, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0,\n ...\n 340.0, 342.0, 344.0, 346.0, 348.0, 350.0, 352.0, 354.0, 356.0, 358.0],\n dtype='float64', name='lon', length=180))timePandasIndexPandasIndex(CFTimeIndex([1910-01-01 00:00:00, 1910-02-01 00:00:00, 1910-03-01 00:00:00,\n 1910-04-01 00:00:00, 1910-05-01 00:00:00, 1910-06-01 00:00:00,\n 1910-07-01 00:00:00, 1910-08-01 00:00:00, 1910-09-01 00:00:00,\n 1910-10-01 00:00:00,\n ...\n 2007-03-01 00:00:00, 2007-04-01 00:00:00, 2007-05-01 00:00:00,\n 2007-06-01 00:00:00, 2007-07-01 00:00:00, 2007-08-01 00:00:00,\n 2007-09-01 00:00:00, 2007-10-01 00:00:00, 2007-11-01 00:00:00,\n 2007-12-01 00:00:00],\n dtype='object', length=1176, calendar='360_day', freq='MS'))Attributes: (38)Conventions :CF-1.6, ACDD-1.3metadata_link :https://doi.org/10.7289/V5T72FNMid :ersst.v5.191001naming_authority :gov.noaa.nceititle :NOAA ERSSTv5 (in situ only)summary :ERSST.v5 is developped based on v4 after revisions of 8 parameters using updated data sets and advanced knowledge of ERSST analysisinstitution :NOAA/NESDIS/NCEI/CCOGcreator_name :Boyin Huangcreator_email :boyin.huang@noaa.govdate_created :2017-06-30T12:18:00Zdate_modified :2017-06-30T12:18:00Zproduct_version :Version 5history :Fri Jun 30 12:26:49 2017: ncatted -O -a _FillValue,ssta,o,f,-999.0 ssta.nc\nVersion 5 based on Version 4creator_url :https://www.ncei.noaa.govlicense :No constraints on data access or usetime_coverage_start :1910-01-01T00:00:00Ztime_coverage_end :1910-02-01T00:00:00Zgeospatial_lon_min :-1.0geospatial_lon_max :359.0geospatial_lat_min :-89.0geospatial_lat_max :89.0geospatial_lat_units :degrees_northgeospatial_lat_resolution :2.0geospatial_lon_units :degrees_eastgeospatial_lon_resolution :2.0spatial_resolution :2.0 degree gridcdm_data_type :Gridprocessing_level :NOAA Level 4standard_name_vocabulary :CF Standard Name Table (v40, 25 January 2017)keywords :Earth Science > Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsproject :NOAA Extended Reconstructed Sea Surface Temperature (ERSST)platform :Ship and Buoy SSTs from ICOADS R3.0 and NCEP GTSinstrument :Conventional thermometerssource :In situ data: ICOADS R3.0 before 2015, NCEP in situ GTS from 2016 to present, and Argo SST from 1999 to present. Ice data: HadISST2 ice before 2015, and NCEP ice after 2015.comment :SSTs were observed by conventional thermometers in Buckets (in sulated or un-insulated canvas and wooded buckets), Engine Room Intakers, or floats and driftersreferences :Huang et al, 2017: Extended Reconstructed Sea Surface Temperatures Version 5 (ERSSTv5): Upgrades, Validations, and Intercomparisons. Journal of Climate, https://doi.org/10.1175/JCLI-D-16-0836.1climatology :Climatology is based on 1971-2000 SST, Xue, Y., T. M. Smith, and R. W. Reynolds, 2003: Interdecadal changes of 30-yr SST normals during 1871.2000. Journal of Climate, 16, 1601-1612.\n\n\n\n# Load the SST variable into a DataArry object containing a NumPy array:\nsst = sstdata['sst'].load()", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#run-2nd-harmony-netcdf-to-zarr-call", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#run-2nd-harmony-netcdf-to-zarr-call", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Run 2nd Harmony netCDF-to-Zarr call", - "text": "Run 2nd Harmony netCDF-to-Zarr call\n\nShortName = \"ECCO_L4_TEMP_SALINITY_05DEG_MONTHLY_V4R4\"\n\n# 1) Find new concept_id for this dataset\nresponse = requests.get(\n url='https://cmr.earthdata.nasa.gov/search/collections.umm_json', \n params={'provider': \"POCLOUD\",\n 'ShortName': ShortName,\n 'page_size': 1}\n)\n\nummc = response.json()['items'][0]\nccid = ummc['meta']['concept-id']\n\n# using the the harmony.py service, set up the request and exectue it\necco_collection = Collection(id=ccid)\ntime_range = {'start': datetime(start_year, start_month, start_day), 'stop': datetime(end_year, end_month, end_day)}\n\nharmony_client = Client(env=Environment.PROD)\n\n# in this example set concatentae to 'False' because the monthly input time steps vary slightly\n# (not always centered in the middle of month)\necco_request = Request(collection=ecco_collection, temporal=time_range, format='application/x-zarr', concatenate='False')\n\n# sumbit request and monitor job\necco_job_id = harmony_client.submit(ecco_request)\nprint('\\nWaiting for the job to finish. . .\\n')\necco_response = harmony_client.result_json(ecco_job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\n\nWaiting for the job to finish. . .\n\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\n. . .DONE!", + "objectID": "notebooks/DataStories/eof_example_ersst.html#proprocessing", + "href": "notebooks/DataStories/eof_example_ersst.html#proprocessing", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "2.1 Proprocessing", + "text": "2.1 Proprocessing\n\n# Before proceeding, remove data poleward of 65 degress lat (as in the publication):\nsst = sst.sel(lat=slice(-65, 65))", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#read-the-s3-zarr-endpoints-and-aggregate-to-single-zarr", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#read-the-s3-zarr-endpoints-and-aggregate-to-single-zarr", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Read the S3 Zarr endpoints and aggregate to single Zarr", - "text": "Read the S3 Zarr endpoints and aggregate to single Zarr\n\n# 1) read the AWS credentials\nprint(ecco_response['message'])\nwith requests.get(ecco_response['links'][2]['href']) as r:\n creds = r.json()\n\nprint( creds.keys() )\nprint(\"AWS credentials expire on: \", creds['Expiration'] )\n\n\n# 2) print root directory and read the s3 URLs into a list\ns3_dir2 = ecco_response['links'][3]['href']\nprint(\"root directory:\", s3_dir2)\ns3_urls2 = [u['href'] for u in ecco_response['links'][4:-1]]\n\n# sort the URLs in time order\ns3_urls2.sort()\n\n# 3) Autenticate AWS S3 credentials\ns3 = s3fs.S3FileSystem(\n key=creds['AccessKeyId'],\n secret=creds['SecretAccessKey'],\n token=creds['SessionToken'],\n client_kwargs={'region_name':'us-west-2'},\n)\n\n# 4) Read and concatenate into a single Zarr dataset\ntemp_ds = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls2], dim=\"time\", coords='minimal')\n#temp_ds_group = xr.concat([xr.open_zarr(s3.get_mapper(u)) for u in s3_urls2], dim=\"time\", coords='minimal').groupby('time.month')\n\ntemp_ds\n\nThe job has completed successfully. Contains results in AWS S3. Access from AWS us-west-2 with keys from https://harmony.earthdata.nasa.gov/cloud-access.sh\ndict_keys(['AccessKeyId', 'SecretAccessKey', 'SessionToken', 'Expiration'])\nAWS credentials expire on: 2022-05-03T08:48:44.000Z\nroot directory: s3://harmony-prod-staging/public/harmony/netcdf-to-zarr/9dd5c9b3-84c4-48e5-907d-2bd21d92a60c/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 193, Z: 50, latitude: 360, longitude: 720, nv: 2)\nCoordinates:\n * Z (Z) float32 -5.0 -15.0 -25.0 ... -5.461e+03 -5.906e+03\n Z_bnds (Z, nv) float32 nan -10.0 -10.0 ... -5.678e+03 -6.134e+03\n * latitude (latitude) float32 -89.75 -89.25 -88.75 ... 89.25 89.75\n latitude_bnds (latitude, nv) float32 -90.0 -89.5 -89.5 ... 89.5 89.5 90.0\n * longitude (longitude) float32 -179.8 -179.2 -178.8 ... 179.2 179.8\n longitude_bnds (longitude, nv) float32 -180.0 -179.5 -179.5 ... 179.5 180.0\n * time (time) datetime64[ns] 2001-12-16T12:00:00 ... 2017-12-16T...\n time_bnds (time, nv) datetime64[ns] dask.array<chunksize=(1, 2), meta=np.ndarray>\nDimensions without coordinates: nv\nData variables:\n SALT (time, Z, latitude, longitude) float32 dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>\n THETA (time, Z, latitude, longitude) float32 dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>\nAttributes: (12/62)\n Conventions: CF-1.8, ACDD-1.3\n acknowledgement: This research was carried out by the Jet...\n author: Ian Fenty and Ou Wang\n cdm_data_type: Grid\n comment: Fields provided on a regular lat-lon gri...\n coordinates_comment: Note: the global 'coordinates' attribute...\n ... ...\n time_coverage_duration: P1M\n time_coverage_end: 2002-01-01T00:00:00\n time_coverage_resolution: P1M\n time_coverage_start: 2001-12-01T00:00:00\n title: ECCO Ocean Temperature and Salinity - Mo...\n uuid: 7f718714-4159-11eb-8bbd-0cc47a3f819bxarray.DatasetDimensions:time: 193Z: 50latitude: 360longitude: 720nv: 2Coordinates: (8)Z(Z)float32-5.0 -15.0 ... -5.906e+03axis :Zbounds :Z_bndscomment :Non-uniform vertical spacing.coverage_content_type :coordinatelong_name :depth of grid cell centerpositive :upstandard_name :depthunits :marray([-5.000000e+00, -1.500000e+01, -2.500000e+01, -3.500000e+01,\n -4.500000e+01, -5.500000e+01, -6.500000e+01, -7.500500e+01,\n -8.502500e+01, -9.509500e+01, -1.053100e+02, -1.158700e+02,\n -1.271500e+02, -1.397400e+02, -1.544700e+02, -1.724000e+02,\n -1.947350e+02, -2.227100e+02, -2.574700e+02, -2.999300e+02,\n -3.506800e+02, -4.099300e+02, -4.774700e+02, -5.527100e+02,\n -6.347350e+02, -7.224000e+02, -8.144700e+02, -9.097400e+02,\n -1.007155e+03, -1.105905e+03, -1.205535e+03, -1.306205e+03,\n -1.409150e+03, -1.517095e+03, -1.634175e+03, -1.765135e+03,\n -1.914150e+03, -2.084035e+03, -2.276225e+03, -2.491250e+03,\n -2.729250e+03, -2.990250e+03, -3.274250e+03, -3.581250e+03,\n -3.911250e+03, -4.264250e+03, -4.640250e+03, -5.039250e+03,\n -5.461250e+03, -5.906250e+03], dtype=float32)Z_bnds(Z, nv)float32nan -10.0 ... -5.678e+03 -6.134e+03comment :One pair of bounds for each vertical level.coverage_content_type :coordinatelong_name :depths of grid cell upper and lower interfacesarray([[ nan, -10. ],\n [ -10. , -20. ],\n [ -20. , -30. ],\n [ -30. , -40. ],\n [ -40. , -50. ],\n [ -50. , -60. ],\n [ -60. , -70. ],\n [ -70. , -80.01 ],\n [ -80.01 , -90.04 ],\n [ -90.04 , -100.15 ],\n [ -100.15 , -110.47 ],\n [ -110.47 , -121.270004],\n [ -121.270004, -133.03 ],\n [ -133.03 , -146.45 ],\n [ -146.45 , -162.48999 ],\n [ -162.48999 , -182.31 ],\n [ -182.31 , -207.16 ],\n [ -207.16 , -238.26001 ],\n [ -238.26001 , -276.68 ],\n [ -276.68 , -323.18 ],\n...\n [-1155.53 , -1255.54 ],\n [-1255.54 , -1356.87 ],\n [-1356.87 , -1461.4299 ],\n [-1461.4299 , -1572.7599 ],\n [-1572.7599 , -1695.5898 ],\n [-1695.5898 , -1834.6798 ],\n [-1834.6798 , -1993.6199 ],\n [-1993.6199 , -2174.45 ],\n [-2174.45 , -2378. ],\n [-2378. , -2604.5 ],\n [-2604.5 , -2854. ],\n [-2854. , -3126.5 ],\n [-3126.5 , -3422. ],\n [-3422. , -3740.5 ],\n [-3740.5 , -4082. ],\n [-4082. , -4446.5 ],\n [-4446.5 , -4834. ],\n [-4834. , -5244.5 ],\n [-5244.5 , -5678. ],\n [-5678. , -6134.5 ]], dtype=float32)latitude(latitude)float32-89.75 -89.25 ... 89.25 89.75axis :Ybounds :latitude_bndscomment :uniform grid spacing from -89.75 to 89.75 by 0.5coverage_content_type :coordinatelong_name :latitude at grid cell centerstandard_name :latitudeunits :degrees_northarray([-89.75, -89.25, -88.75, ..., 88.75, 89.25, 89.75], dtype=float32)latitude_bnds(latitude, nv)float32-90.0 -89.5 -89.5 ... 89.5 90.0coverage_content_type :coordinatelong_name :latitude bounds grid cellsarray([[-90. , -89.5],\n [-89.5, -89. ],\n [-89. , -88.5],\n [-88.5, -88. ],\n [-88. , -87.5],\n [-87.5, -87. ],\n [-87. , -86.5],\n [-86.5, -86. ],\n [-86. , -85.5],\n [-85.5, -85. ],\n [-85. , -84.5],\n [-84.5, -84. ],\n [-84. , -83.5],\n [-83.5, -83. ],\n [-83. , -82.5],\n [-82.5, -82. ],\n [-82. , -81.5],\n [-81.5, -81. ],\n [-81. , -80.5],\n [-80.5, -80. ],\n...\n [ 80. , 80.5],\n [ 80.5, 81. ],\n [ 81. , 81.5],\n [ 81.5, 82. ],\n [ 82. , 82.5],\n [ 82.5, 83. ],\n [ 83. , 83.5],\n [ 83.5, 84. ],\n [ 84. , 84.5],\n [ 84.5, 85. ],\n [ 85. , 85.5],\n [ 85.5, 86. ],\n [ 86. , 86.5],\n [ 86.5, 87. ],\n [ 87. , 87.5],\n [ 87.5, 88. ],\n [ 88. , 88.5],\n [ 88.5, 89. ],\n [ 89. , 89.5],\n [ 89.5, 90. ]], dtype=float32)longitude(longitude)float32-179.8 -179.2 ... 179.2 179.8axis :Xbounds :longitude_bndscomment :uniform grid spacing from -179.75 to 179.75 by 0.5coverage_content_type :coordinatelong_name :longitude at grid cell centerstandard_name :longitudeunits :degrees_eastarray([-179.75, -179.25, -178.75, ..., 178.75, 179.25, 179.75],\n dtype=float32)longitude_bnds(longitude, nv)float32-180.0 -179.5 ... 179.5 180.0coverage_content_type :coordinatelong_name :longitude bounds grid cellsarray([[-180. , -179.5],\n [-179.5, -179. ],\n [-179. , -178.5],\n ...,\n [ 178.5, 179. ],\n [ 179. , 179.5],\n [ 179.5, 180. ]], dtype=float32)time(time)datetime64[ns]2001-12-16T12:00:00 ... 2017-12-...axis :Tbounds :time_bndscoverage_content_type :coordinatelong_name :center time of averaging periodstandard_name :timearray(['2001-12-16T12:00:00.000000000', '2002-01-16T12:00:00.000000000',\n '2002-02-15T00:00:00.000000000', '2002-03-16T12:00:00.000000000',\n '2002-04-16T00:00:00.000000000', '2002-05-16T12:00:00.000000000',\n '2002-06-16T00:00:00.000000000', '2002-07-16T12:00:00.000000000',\n '2002-08-16T12:00:00.000000000', '2002-09-16T00:00:00.000000000',\n '2002-10-16T12:00:00.000000000', '2002-11-16T00:00:00.000000000',\n '2002-12-16T12:00:00.000000000', '2003-01-16T12:00:00.000000000',\n '2003-02-15T00:00:00.000000000', '2003-03-16T12:00:00.000000000',\n '2003-04-16T00:00:00.000000000', '2003-05-16T12:00:00.000000000',\n '2003-06-16T00:00:00.000000000', '2003-07-16T12:00:00.000000000',\n '2003-08-16T12:00:00.000000000', '2003-09-16T00:00:00.000000000',\n '2003-10-16T12:00:00.000000000', '2003-11-16T00:00:00.000000000',\n '2003-12-16T12:00:00.000000000', '2004-01-16T12:00:00.000000000',\n '2004-02-15T12:00:00.000000000', '2004-03-16T12:00:00.000000000',\n '2004-04-16T00:00:00.000000000', '2004-05-16T12:00:00.000000000',\n '2004-06-16T00:00:00.000000000', '2004-07-16T12:00:00.000000000',\n '2004-08-16T12:00:00.000000000', '2004-09-16T00:00:00.000000000',\n '2004-10-16T12:00:00.000000000', '2004-11-16T00:00:00.000000000',\n '2004-12-16T12:00:00.000000000', '2005-01-16T12:00:00.000000000',\n '2005-02-15T00:00:00.000000000', '2005-03-16T12:00:00.000000000',\n '2005-04-16T00:00:00.000000000', '2005-05-16T12:00:00.000000000',\n '2005-06-16T00:00:00.000000000', '2005-07-16T12:00:00.000000000',\n '2005-08-16T12:00:00.000000000', '2005-09-16T00:00:00.000000000',\n '2005-10-16T12:00:00.000000000', '2005-11-16T00:00:00.000000000',\n '2005-12-16T12:00:00.000000000', '2006-01-16T12:00:00.000000000',\n '2006-02-15T00:00:00.000000000', '2006-03-16T12:00:00.000000000',\n '2006-04-16T00:00:00.000000000', '2006-05-16T12:00:00.000000000',\n '2006-06-16T00:00:00.000000000', '2006-07-16T12:00:00.000000000',\n '2006-08-16T12:00:00.000000000', '2006-09-16T00:00:00.000000000',\n '2006-10-16T12:00:00.000000000', '2006-11-16T00:00:00.000000000',\n '2006-12-16T12:00:00.000000000', '2007-01-16T12:00:00.000000000',\n '2007-02-15T00:00:00.000000000', '2007-03-16T12:00:00.000000000',\n '2007-04-16T00:00:00.000000000', '2007-05-16T12:00:00.000000000',\n '2007-06-16T00:00:00.000000000', '2007-07-16T12:00:00.000000000',\n '2007-08-16T12:00:00.000000000', '2007-09-16T00:00:00.000000000',\n '2007-10-16T12:00:00.000000000', '2007-11-16T00:00:00.000000000',\n '2007-12-16T12:00:00.000000000', '2008-01-16T12:00:00.000000000',\n '2008-02-15T12:00:00.000000000', '2008-03-16T12:00:00.000000000',\n '2008-04-16T00:00:00.000000000', '2008-05-16T12:00:00.000000000',\n '2008-06-16T00:00:00.000000000', '2008-07-16T12:00:00.000000000',\n '2008-08-16T12:00:00.000000000', '2008-09-16T00:00:00.000000000',\n '2008-10-16T12:00:00.000000000', '2008-11-16T00:00:00.000000000',\n '2008-12-16T12:00:00.000000000', '2009-01-16T12:00:00.000000000',\n '2009-02-15T00:00:00.000000000', '2009-03-16T12:00:00.000000000',\n '2009-04-16T00:00:00.000000000', '2009-05-16T12:00:00.000000000',\n '2009-06-16T00:00:00.000000000', '2009-07-16T12:00:00.000000000',\n '2009-08-16T12:00:00.000000000', '2009-09-16T00:00:00.000000000',\n '2009-10-16T12:00:00.000000000', '2009-11-16T00:00:00.000000000',\n '2009-12-16T12:00:00.000000000', '2010-01-16T12:00:00.000000000',\n '2010-02-15T00:00:00.000000000', '2010-03-16T12:00:00.000000000',\n '2010-04-16T00:00:00.000000000', '2010-05-16T12:00:00.000000000',\n '2010-06-16T00:00:00.000000000', '2010-07-16T12:00:00.000000000',\n '2010-08-16T12:00:00.000000000', '2010-09-16T00:00:00.000000000',\n '2010-10-16T12:00:00.000000000', '2010-11-16T00:00:00.000000000',\n '2010-12-16T12:00:00.000000000', '2011-01-16T12:00:00.000000000',\n '2011-02-15T00:00:00.000000000', '2011-03-16T12:00:00.000000000',\n '2011-04-16T00:00:00.000000000', '2011-05-16T12:00:00.000000000',\n '2011-06-16T00:00:00.000000000', '2011-07-16T12:00:00.000000000',\n '2011-08-16T12:00:00.000000000', '2011-09-16T00:00:00.000000000',\n '2011-10-16T12:00:00.000000000', '2011-11-16T00:00:00.000000000',\n '2011-12-16T12:00:00.000000000', '2012-01-16T12:00:00.000000000',\n '2012-02-15T12:00:00.000000000', '2012-03-16T12:00:00.000000000',\n '2012-04-16T00:00:00.000000000', '2012-05-16T12:00:00.000000000',\n '2012-06-16T00:00:00.000000000', '2012-07-16T12:00:00.000000000',\n '2012-08-16T12:00:00.000000000', '2012-09-16T00:00:00.000000000',\n '2012-10-16T12:00:00.000000000', '2012-11-16T00:00:00.000000000',\n '2012-12-16T12:00:00.000000000', '2013-01-16T12:00:00.000000000',\n '2013-02-15T00:00:00.000000000', '2013-03-16T12:00:00.000000000',\n '2013-04-16T00:00:00.000000000', '2013-05-16T12:00:00.000000000',\n '2013-06-16T00:00:00.000000000', '2013-07-16T12:00:00.000000000',\n '2013-08-16T12:00:00.000000000', '2013-09-16T00:00:00.000000000',\n '2013-10-16T12:00:00.000000000', '2013-11-16T00:00:00.000000000',\n '2013-12-16T12:00:00.000000000', '2014-01-16T12:00:00.000000000',\n '2014-02-15T00:00:00.000000000', '2014-03-16T12:00:00.000000000',\n '2014-04-16T00:00:00.000000000', '2014-05-16T12:00:00.000000000',\n '2014-06-16T00:00:00.000000000', '2014-07-16T12:00:00.000000000',\n '2014-08-16T12:00:00.000000000', '2014-09-16T00:00:00.000000000',\n '2014-10-16T12:00:00.000000000', '2014-11-16T00:00:00.000000000',\n '2014-12-16T12:00:00.000000000', '2015-01-16T12:00:00.000000000',\n '2015-02-15T00:00:00.000000000', '2015-03-16T12:00:00.000000000',\n '2015-04-16T00:00:00.000000000', '2015-05-16T12:00:00.000000000',\n '2015-06-16T00:00:00.000000000', '2015-07-16T12:00:00.000000000',\n '2015-08-16T12:00:00.000000000', '2015-09-16T00:00:00.000000000',\n '2015-10-16T12:00:00.000000000', '2015-11-16T00:00:00.000000000',\n '2015-12-16T12:00:00.000000000', '2016-01-16T12:00:00.000000000',\n '2016-02-15T12:00:00.000000000', '2016-03-16T12:00:00.000000000',\n '2016-04-16T00:00:00.000000000', '2016-05-16T12:00:00.000000000',\n '2016-06-16T00:00:00.000000000', '2016-07-16T12:00:00.000000000',\n '2016-08-16T12:00:00.000000000', '2016-09-16T00:00:00.000000000',\n '2016-10-16T12:00:00.000000000', '2016-11-16T00:00:00.000000000',\n '2016-12-16T12:00:00.000000000', '2017-01-16T12:00:00.000000000',\n '2017-02-15T00:00:00.000000000', '2017-03-16T12:00:00.000000000',\n '2017-04-16T00:00:00.000000000', '2017-05-16T12:00:00.000000000',\n '2017-06-16T00:00:00.000000000', '2017-07-16T12:00:00.000000000',\n '2017-08-16T12:00:00.000000000', '2017-09-16T00:00:00.000000000',\n '2017-10-16T12:00:00.000000000', '2017-11-16T00:00:00.000000000',\n '2017-12-16T06:00:00.000000000'], dtype='datetime64[ns]')time_bnds(time, nv)datetime64[ns]dask.array<chunksize=(1, 2), meta=np.ndarray>comment :Start and end times of averaging period.coverage_content_type :coordinatelong_name :time bounds of averaging period\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.02 kiB\n16 B\n\n\nShape\n(193, 2)\n(1, 2)\n\n\nCount\n579 Tasks\n193 Chunks\n\n\nType\ndatetime64[ns]\nnumpy.ndarray\n\n\n\n\n 2 193\n\n\n\n\nData variables: (2)SALT(time, Z, latitude, longitude)float32dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>comment :Defined using CF convention 'Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.' see https://cfconventions.org/Data/cf-standard-names/73/build/cf-standard-name-table.htmlcoverage_content_type :modelResultlong_name :Salinitystandard_name :sea_water_salinityunits :1e-3valid_max :41.26802444458008valid_min :17.106637954711914\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.32 GiB\n14.95 MiB\n\n\nShape\n(193, 50, 360, 720)\n(1, 50, 280, 280)\n\n\nCount\n2509 Tasks\n1158 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 193 1 720 360 50\n\n\n\n\nTHETA(time, Z, latitude, longitude)float32dask.array<chunksize=(1, 50, 280, 280), meta=np.ndarray>comment :Sea water potential temperature is the temperature a parcel of sea water would have if moved adiabatically to sea level pressure. Note: the equation of state is a modified UNESCO formula by Jackett and McDougall (1995), which uses the model variable potential temperature as input assuming a horizontally and temporally constant pressure of $p_0=-g ho_{0} z$.coverage_content_type :modelResultlong_name :Potential temperature standard_name :sea_water_potential_temperatureunits :degree_Cvalid_max :36.032955169677734valid_min :-2.2909388542175293\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.32 GiB\n14.95 MiB\n\n\nShape\n(193, 50, 360, 720)\n(1, 50, 280, 280)\n\n\nCount\n2509 Tasks\n1158 Chunks\n\n\nType\nfloat32\nnumpy.ndarray\n\n\n\n\n 193 1 720 360 50\n\n\n\n\nAttributes: (62)Conventions :CF-1.8, ACDD-1.3acknowledgement :This research was carried out by the Jet Propulsion Laboratory, managed by the California Institute of Technology under a contract with the National Aeronautics and Space Administration.author :Ian Fenty and Ou Wangcdm_data_type :Gridcomment :Fields provided on a regular lat-lon grid. They have been mapped to the regular lat-lon grid from the original ECCO lat-lon-cap 90 (llc90) native model grid.coordinates_comment :Note: the global 'coordinates' attribute describes auxillary coordinates.creator_email :ecco-group@mit.educreator_institution :NASA Jet Propulsion Laboratory (JPL)creator_name :ECCO Consortiumcreator_type :groupcreator_url :https://ecco-group.orgdate_created :2020-12-18T09:50:20date_issued :2020-12-18T09:50:20date_metadata_modified :2021-03-15T22:06:59date_modified :2021-03-15T22:06:59geospatial_bounds_crs :EPSG:4326geospatial_lat_max :90.0geospatial_lat_min :-90.0geospatial_lat_resolution :0.5geospatial_lat_units :degrees_northgeospatial_lon_max :180.0geospatial_lon_min :-180.0geospatial_lon_resolution :0.5geospatial_lon_units :degrees_eastgeospatial_vertical_max :0.0geospatial_vertical_min :-6134.5geospatial_vertical_positive :upgeospatial_vertical_resolution :variablegeospatial_vertical_units :meterhistory :Inaugural release of an ECCO Central Estimate solution to PO.DAACid :10.5067/ECG5M-OTS44institution :NASA Jet Propulsion Laboratory (JPL)instrument_vocabulary :GCMD instrument keywordskeywords :EARTH SCIENCE SERVICES > MODELS > EARTH SCIENCE REANALYSES/ASSIMILATION MODELS, EARTH SCIENCE > OCEANS > SALINITY/DENSITY > SALINITY, EARTH SCIENCE > OCEANS > OCEAN TEMPERATURE > POTENTIAL TEMPERATUREkeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordslicense :Public Domainmetadata_link :https://cmr.earthdata.nasa.gov/search/collections.umm_json?ShortName=ECCO_L4_TEMP_SALINITY_05DEG_MONTHLY_V4R4naming_authority :gov.nasa.jplplatform :ERS-1/2, TOPEX/Poseidon, Geosat Follow-On (GFO), ENVISAT, Jason-1, Jason-2, CryoSat-2, SARAL/AltiKa, Jason-3, AVHRR, Aquarius, SSM/I, SSMIS, GRACE, DTU17MDT, Argo, WOCE, GO-SHIP, MEOP, Ice Tethered Profilers (ITP)platform_vocabulary :GCMD platform keywordsprocessing_level :L4product_name :OCEAN_TEMPERATURE_SALINITY_mon_mean_2001-12_ECCO_V4r4_latlon_0p50deg.ncproduct_time_coverage_end :2018-01-01T00:00:00product_time_coverage_start :1992-01-01T12:00:00product_version :Version 4, Release 4program :NASA Physical Oceanography, Cryosphere, Modeling, Analysis, and Prediction (MAP)project :Estimating the Circulation and Climate of the Ocean (ECCO)publisher_email :podaac@podaac.jpl.nasa.govpublisher_institution :PO.DAACpublisher_name :Physical Oceanography Distributed Active Archive Center (PO.DAAC)publisher_type :institutionpublisher_url :https://podaac.jpl.nasa.govreferences :ECCO Consortium, Fukumori, I., Wang, O., Fenty, I., Forget, G., Heimbach, P., & Ponte, R. M. 2020. Synopsis of the ECCO Central Production Global Ocean and Sea-Ice State Estimate (Version 4 Release 4). doi:10.5281/zenodo.3765928source :The ECCO V4r4 state estimate was produced by fitting a free-running solution of the MITgcm (checkpoint 66g) to satellite and in situ observational data in a least squares sense using the adjoint methodstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsummary :This dataset provides monthly-averaged ocean potential temperature and salinity interpolated to a regular 0.5-degree grid from the ECCO Version 4 Release 4 (V4r4) ocean and sea-ice state estimate. Estimating the Circulation and Climate of the Ocean (ECCO) state estimates are dynamically and kinematically-consistent reconstructions of the three-dimensional, time-evolving ocean, sea-ice, and surface atmospheric states. ECCO V4r4 is a free-running solution of a global, nominally 1-degree configuration of the MIT general circulation model (MITgcm) that has been fit to observations in a least-squares sense. Observational data constraints used in V4r4 include sea surface height (SSH) from satellite altimeters [ERS-1/2, TOPEX/Poseidon, GFO, ENVISAT, Jason-1,2,3, CryoSat-2, and SARAL/AltiKa]; sea surface temperature (SST) from satellite radiometers [AVHRR], sea surface salinity (SSS) from the Aquarius satellite radiometer/scatterometer, ocean bottom pressure (OBP) from the GRACE satellite gravimeter; sea-ice concentration from satellite radiometers [SSM/I and SSMIS], and in-situ ocean temperature and salinity measured with conductivity-temperature-depth (CTD) sensors and expendable bathythermographs (XBTs) from several programs [e.g., WOCE, GO-SHIP, Argo, and others] and platforms [e.g., research vessels, gliders, moorings, ice-tethered profilers, and instrumented pinnipeds]. V4r4 covers the period 1992-01-01T12:00:00 to 2018-01-01T00:00:00.time_coverage_duration :P1Mtime_coverage_end :2002-01-01T00:00:00time_coverage_resolution :P1Mtime_coverage_start :2001-12-01T00:00:00title :ECCO Ocean Temperature and Salinity - Monthly Mean 0.5 Degree (Version 4 Release 4)uuid :7f718714-4159-11eb-8bbd-0cc47a3f819b", + "objectID": "notebooks/DataStories/eof_example_ersst.html#linear-detrend", + "href": "notebooks/DataStories/eof_example_ersst.html#linear-detrend", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "2.2 Linear Detrend", + "text": "2.2 Linear Detrend\nCompute and remove linear trend\n\np = sst.polyfit(dim='time', deg=1) # Degree 1 polynomial fit coefficients over time for each lat, lon.\nfit = xr.polyval(sst['time'], p.polyfit_coefficients) # Compute linear trend time series at each lat, lon.\nsst_detrend = (sst - fit) # xarray is smart enough to subtract along the time dim only.\n\nTest plot of detrend results at a few locations on the globe\n\n# Find lats, lons in the dataset that are closest to a few chosen values.\ntestpoints = sst.sel(lat=[0, -30, 30, 45], lon=[0, 90, 190, 220], method='nearest')\nlat_testpoints = testpoints['lat'].data\nlon_testpoints = testpoints['lon'].data\n\n\n# Plot before, after, and detrend fit for first 200 timestamps:\nn_ts = 200\n\nfig1, axes1 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes1.flatten(), lat_testpoints, lon_testpoints):\n ax.plot(sst.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'b-', linewidth=1, label='original SST')\n ax.plot(fit.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'k--', label='linear fit')\n ax.plot(sst_detrend.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'm-', linewidth=1, label='SST detrended')\n\nfig1.text(0.5, 0.025, \"n month since \" + str(sst['time'].data[0]), ha='center', va='center', fontsize=12)\nfig1.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\naxes1[0,0].legend(fontsize=8)", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#do-data-masking-calculate-a-sst-anomaly-and-plot-some-figures", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#do-data-masking-calculate-a-sst-anomaly-and-plot-some-figures", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Do data masking, calculate a SST anomaly, and plot some figures", - "text": "Do data masking, calculate a SST anomaly, and plot some figures\n\n# Mask for the good data. Everything else defaults to NaN\n# SST missing value 9.9692100e+36 \n# SSH missing value 9.9692100e+36\ncond = (ssh_ds < 1000)\nssh_ds_masked = ssh_ds['SSH'].where(cond)\n\ncond = (temp_ds < 1000)\ntemp_ds_masked = temp_ds['THETA'].where(cond)\n\n# Derive a SST climatology and subtract it from the SST to create SST anomaly and remove trends\nclimatology_mean = temp_ds_masked.groupby('time.month').mean('time',keep_attrs=True,skipna=False)\ntemp_ds_masked_anomaly = temp_ds_masked.groupby('time.month') - climatology_mean # subtract out longterm monthly mean\n\nfig,ax=plt.subplots(1,3,figsize=(25,5))\n\n# take a slice of the Indian Ocean and plot SSH, SST, SST anomaly\nssh_ds_masked['SSH'][6].sel(longitude=slice(40,120),latitude=slice(-30,20)).plot(ax=ax[0], vmin=-0.5,vmax=1.25)\ntemp_ds_masked['THETA'][6].sel(longitude=slice(40,120),latitude=slice(-30,20), Z=slice(0,-5)).plot(ax=ax[1], vmin=10,vmax=32)\ntemp_ds_masked_anomaly['THETA'][6].sel(longitude=slice(40,120),latitude=slice(-30,20), Z=slice(0,-5)).plot(ax=ax[2], vmin=-2,vmax=2)", + "objectID": "notebooks/DataStories/eof_example_ersst.html#remove-seasonal-cycle", + "href": "notebooks/DataStories/eof_example_ersst.html#remove-seasonal-cycle", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "2.3 Remove Seasonal Cycle", + "text": "2.3 Remove Seasonal Cycle\nComputation\n\n# Very easy to remove a daily/monthly/yearly/etc cycle using Xarray built-in function:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\nsst_nocycle = sst_detrend.groupby(\"time.month\") - seasonal_cycle\n\nCreate some confirmation plots at same test points as in Section 2.1\n\n# Mean seasonal cycle overlaid on data for first 10 years:\nfig2, axes2 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes2.flatten(), lat_testpoints, lon_testpoints):\n for i in np.arange(1,11):\n ax.plot(seasonal_cycle['month'], sst_detrend.isel(time=range(12*(i-1), 12*i)).sel(lat=lat, lon=lon), '.')\n ax.plot(seasonal_cycle['month'], seasonal_cycle.sel(lat=lat, lon=lon), 'kx-', linewidth=1)\n\nxticks = [0, 3, 6, 9, 12]\nfor ax in axes2.flatten():\n ax.set_xticks(xticks)\n ax.set_xticklabels([str(xt) for xt in xticks])\nfig2.text(0.5, 0.025, \"n month of year\", ha='center', va='center', fontsize=12)\nfig2.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\n\nText(0.05, 0.5, 'SST (K)')\n\n\n\n\n\n\n\n\n\n\n# Plot before and after cycle removal, for first 200 timestamps:\nfig3, axes3 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes3.flatten(), lat_testpoints, lon_testpoints):\n ax.plot(sst_detrend.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'm-', linewidth=1, label='SST detrended')\n ax.plot(sst_nocycle.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'k-', linewidth=1, label='SST seasonal cycle removed')\n\nfig3.text(0.5, 0.025, \"n month since \" + str(sst['time'].data[0]), ha='center', va='center', fontsize=12)\nfig3.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\naxes3[0,0].legend(fontsize=8)", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#perform-the-correlations-in-the-east-and-west-indian-ocean", - "href": "notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html#perform-the-correlations-in-the-east-and-west-indian-ocean", - "title": "The spatial Correlation between sea surface temperature anomaly and sea surface height anomaly in the Indian Ocean – A demo using ECCO", - "section": "Perform the correlations in the east and west Indian Ocean", - "text": "Perform the correlations in the east and west Indian Ocean\n\n# Western and Eastern Indian Ocean regions (WIO and EIO respectively)\n# EIO; 90 –110 E, 10 S–0N\n# WIO; 50 –70 E, 10 S–10 N\n\n# Group Eastern Indian Ocean data by month. This will make the correlation of all monthly values straightforwrd.\nssh_group = ssh_ds_masked['SSH'].sel(longitude=slice(90,110),latitude=slice(-10,0)).groupby('time.month')\n#temp_group = temp_ds_masked['THETA'].sel(longitude=slice(90,110),latitude=slice(-10,0), Z=-5.0).drop('Z').groupby('time.month')\ntemp_group = temp_ds_masked_anomaly['THETA'].sel(longitude=slice(90,110),latitude=slice(-10,0), Z=-5.0).drop('Z').groupby('time.month')\n\nprint(\" Running correlations in eastern Indian Ocean . . .\\n\") \ncorr = []\nfor month in range(1,13):\n corr.append(xr.corr(ssh_group[month], temp_group[month]))\n #print(\"\\nthe correlation in the east is: \" , xr.corr(ssh_group[month], temp_group[month]).values)\n \n# Do some plotting\nfig,ax=plt.subplots(1,2,figsize=(14,8))\n\nax[0].set_title(\"Spatial correlation in Eastern Indian Ocean\",fontsize=16)\nax[0].set_ylabel(\"Correlation\",fontsize=16)\nax[0].set_xlabel(\"Month\",fontsize=16)\nax[0].set_ylim([-1, 1])\nax[0].plot(corr)\n\n# Repeat for Western Indian Ocean\n# Group the data by month. This will make the correlation of all monthly values straightforwrd.\nssh_group = ssh_ds_masked['SSH'].sel(longitude=slice(50,70),latitude=slice(-10,10)).groupby('time.month')\n#temp_group = temp_ds_masked['THETA'].sel(longitude=slice(50,70),latitude=slice(-10,10), Z=-5.0).drop('Z').groupby('time.month')\ntemp_group = temp_ds_masked_anomaly['THETA'].sel(longitude=slice(50,70),latitude=slice(-10,10), Z=-5.0).drop('Z').groupby('time.month')\n\n\nprint(\" Running correlations in western Indian Ocean . . .\\n\") \ncorr2 =[]\nfor month in range(1,13):\n corr2.append(xr.corr(ssh_group[month], temp_group[month]))\n #print(\"\\nthe correlation in the west is: \" , xr.corr(ssh_group[month], temp_group[month]).values)\n \nax[1].set_title(\"Spatial correlation in Western Indian Ocean\",fontsize=16)\nax[1].set_ylabel(\"Correlation\",fontsize=16)\nax[1].set_xlabel(\"Month\",fontsize=16)\nax[1].set_ylim([-1, 1])\nax[1].plot(corr2)\n\n Running correlations in eastern Indian Ocean . . .\n\n Running correlations in western Indian Ocean . . .", + "objectID": "notebooks/DataStories/eof_example_ersst.html#variance-map", + "href": "notebooks/DataStories/eof_example_ersst.html#variance-map", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "3.1 Variance map", + "text": "3.1 Variance map\nPlot a variance map as a sanity check.\n\nsstvar = sst_nocycle.var(dim=['time'], skipna=True)\n\n/opt/coiled/env/lib/python3.11/site-packages/xarray/core/nputils.py:183: RuntimeWarning: Degrees of freedom <= 0 for slice.\n result = getattr(npmodule, name)(values, axis=axis, **kwargs)\n\n\n\nproj = EqualEarth(central_longitude=180)\nfigvar = plt.figure(figsize=(8, 4))\naxvar = plt.axes(projection=proj)\n\n\nsstvar.plot(\n vmin=0, vmax=1, # vmax of 1 used since there are a few points with anomolously high values.\n transform=PlateCarree(), \n cmap='Spectral_r', cbar_kwargs={'label': \"(\"+r\"$^\\circ$\"+\"C)$^2$\"}\n )\naxvar.coastlines(color='.5')\naxvar.set_title(\"Variance of SST anomalies\", fontsize=12)\n\nText(0.5, 1.0, 'Variance of SST anomalies')\n\n\n\n\n\n\n\n\n\n\nsst_nocycle = sst_nocycle.where(sstvar < 2, drop=False) # Remove a few points with anomolously high variances.", "crumbs": [ "Tutorials", - "Dataset Specific", - "ECCO", - "Use Case Demo" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#in-aws-cloud-version", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#in-aws-cloud-version", - "title": "Amazon Estuary Exploration:", - "section": "In AWS Cloud Version", - "text": "In AWS Cloud Version\nThis tutorial is one of two jupyter notebook versions of the same use case exploring multiple satellite data products over the Amazon Estuary. In this version, we use data products directly in the Amazon Web Services (AWS) Cloud.\n\nLearning Objectives\n\nCompare cloud access methods (in tandem with notebook “Amazon Estuary Exploration: Cloud Direct Download Version”)\nSearch for data products using earthaccess Python library\nAccess datasets using direct s3 access in cloud, xarray and visualize using hvplot or plot tools\n\nThis tutorial explores the relationships between river height, land water equivalent thickness, sea surface salinity, and sea surface temperature in the Amazon River estuary and coastal region from multiple datasets listed below. The contents are useful for the ocean, coastal, and terrestrial hydrosphere communities, showcasing how to use cloud datasets and services. The notebook is designed to be executed in Amazon Web Services (AWS) (in us-west-2 region where the cloud data is located).", + "objectID": "notebooks/DataStories/eof_example_ersst.html#fit-eof-model-and-compute-pcs-eofs-and-explained-variances", + "href": "notebooks/DataStories/eof_example_ersst.html#fit-eof-model-and-compute-pcs-eofs-and-explained-variances", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "3.2 Fit EOF model and compute PCs, EOFs, and explained variances", + "text": "3.2 Fit EOF model and compute PCs, EOFs, and explained variances\nWe fit the EOF model and compute explain variance ratios, PC’s (or as xeofs calls them “scores”), and EOF’s (xeofs calls them “components”).\n\nModel fit\n\nwgts = np.cos(np.deg2rad(sst_nocycle['lat']))**0.5 # Common practice to weight by latitude\n\n\nmodel = xe.models.EOF(\n n_modes=6,\n use_weights=True,\n standardize=False\n )\nmodel.fit(sst_nocycle, dim='time', weights=wgts)\n\n\n\nCompute PCs (scores), EOFs (components), and explained variances\n\nexpvar = model.explained_variance_ratio()\nexpvar.values\n\narray([0.15566093, 0.04830667, 0.03850468, 0.0346849 , 0.03283792,\n 0.02758786])\n\n\n\n# PC's (\"scores\"):\n# The package automatically normalizes the returned PC's. We back out the raw PC's as well (following https://github.com/nicrie/xeofs/issues/81):\nscores_normed = model.scores()\nsvals = model.singular_values()\nscores = scores_normed * svals\n\n\n# EOFs (\"components\"):\ncomponents = model.components()\n\n\n\nRescale PCs and EOFs to match publication\nSince mode=EOF*PC, we can divide a factor of c from PC if we multiply EOF by that same c. We do this here so that our amplitudes resemble those of Messie and Chavez (2011). Turns out we get the right scaling if c=50 for mode 1 and c=25 for the remaining modes.\n\ncomponents_scaled = xr.where(components['mode']==1, components*50, components*25)\nscores_scaled = xr.where(scores['mode']==1, scores/50, scores/25)", "crumbs": [ "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#cloud-datasets", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#cloud-datasets", - "title": "Amazon Estuary Exploration:", - "section": "Cloud Datasets", - "text": "Cloud Datasets\nThe tutorial itself will use four different datasets:\n1. TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3\n\nDOI: https://doi.org/10.5067/TEMSC-3JC63\n\nThe Gravity Recovery And Climate Experiment Follow-On (GRACE-FO) satellite land water equivalent (LWE) thicknesses will be used to observe seasonal changes in water storage around the river. When discharge is high, the change in water storage will increase, thus highlighting a wet season. \n2. PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\n\nDOI: https://doi.org/10.5067/PSGRA-DA2V2\n\nThe NASA Pre-SWOT Making Earth System Data Records for Use in Research Environments (MEaSUREs) Program virtual gauges will be used as a proxy for Surface Water and Ocean Topography (SWOT) discharge until SWOT products are available. MEaSUREs contains river height products, not discharge, but river height is directly related to discharge and thus will act as a good substitute.\n3. OISSS_L4_multimission_7day_v1\n\nDOI: https://doi.org/10.5067/SMP10-4U7CS\n\nOptimally Interpolated Sea surface salinity (OISSS) is a level 4 product that combines the records from Aquarius (Sept 2011-June 2015), the Soil Moisture Active Passive (SMAP) satellite (April 2015-present), and ESAs Soil Moisture Ocean Salinity (SMOS) data to fill in data gaps.\n4. MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0\n\nDOI: https://doi.org/10.5067/MODAM-MO9N9\n\nSea surface temperature is obtained from the Moderate Resolution Imaging Spectrometer (MODIS) instrument on board the Aqua satellite. \nMore details on available collections are on the PO.DAAC Cloud Earthdata Search Portal. For more information on the PO.DAAC transition to the cloud, please visit: https://podaac.jpl.nasa.gov/cloud-datasets/about", + "objectID": "notebooks/DataStories/eof_example_ersst.html#plot-eofs-and-pcs", + "href": "notebooks/DataStories/eof_example_ersst.html#plot-eofs-and-pcs", + "title": "EOF decomposition of global monthly SST data using the xeofs package", + "section": "3.3 Plot EOFs and PC’s", + "text": "3.3 Plot EOFs and PC’s\n\n## EOFs\n\nfig4 = plt.figure(figsize=(12, 8))\naxes4 = []\nproj = EqualEarth(central_longitude=180)\nfor i in range(1, 7):\n axes4.append(plt.subplot(3, 2, i, projection=proj))\n\n\nfor ax in axes4:\n ax.coastlines(color='.5')\n\n\nfor i, ax in zip(range(1,7), axes4):\n components_scaled.sel(mode=i).plot(\n ax=ax, vmin=-2, vmax=2, add_labels=False,\n transform=PlateCarree(), \n cmap='seismic', cbar_kwargs={'label': \"(\"+r\"$^\\circ$\"+\"C)\"}\n \n )\n ax.set_title(\"Mode \"+str(i)+\": \"+str(round(expvar.values[i-1]*100, 1))+\"%\", fontsize=12)\n\n\n\n\n\n\n\n\n\n## PC's\n\n# The format of the ERSST timestamps cannot be read by matplotlib without additional packages.\n# Instead, convert them to numpy.datetime64:\ntimestamps_np = [np.datetime64(str(t)) for t in sst['time'].data]\n\nfig5, axes5 = plt.subplots(6, 1, figsize=(10,10))\n\nzeroline = np.zeros(len(timestamps_np)) # For use with matplotlib's fill_between()\nfor i, ax in zip(range(1, 7), axes5):\n scores_i = scores_scaled.sel(mode=i).values\n pos_score = scores_i > 0\n ax.fill_between(timestamps_np, scores_i, zeroline, where=pos_score, facecolor='lightcoral', interpolate=True)\n ax.fill_between(timestamps_np, scores_i, zeroline, where=~pos_score, facecolor='royalblue', interpolate=True)\n ax.plot(timestamps_np, scores_i, color='lightgrey', linewidth=0.5)\n \n ax.grid(axis='x')\n ax.set_xlabel(\"year\", fontsize=12)\n ax.set_ylabel(\"M\"+str(i)+\": \"+str(round(expvar.values[i-1]*100, 1))+\"%\", fontsize=12)", "crumbs": [ "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" + "Science Data Stories", + "Monthly SST EOF Decomposition" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#needed-packages", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#needed-packages", - "title": "Amazon Estuary Exploration:", - "section": "Needed Packages", - "text": "Needed Packages\n\nimport os\nimport glob\nimport s3fs\nimport requests\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\nimport hvplot.xarray\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport cartopy\nimport dask\nfrom datetime import datetime\nfrom os.path import isfile, basename, abspath\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", - "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" - ] + "objectID": "notebooks/harmony_concatenation/Harmony_Concatenation.html#what-is-concise", + "href": "notebooks/harmony_concatenation/Harmony_Concatenation.html#what-is-concise", + "title": "Harmony EOSS Concise API Tutorial", + "section": "What is Concise?", + "text": "What is Concise?\nConcise is a Harmony service developed by PODAAC that allows users to concatenate multiple L2 granules together into a single granule. This concatenation is done by adding a new subset_index dimension to the resulting granule." + }, + { + "objectID": "notebooks/harmony_concatenation/Harmony_Concatenation.html#before-you-start", + "href": "notebooks/harmony_concatenation/Harmony_Concatenation.html#before-you-start", + "title": "Harmony EOSS Concise API Tutorial", + "section": "Before you start", + "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata.\nSet up libraries needed to run demo\n\nimport os\nfrom harmony import BBox, Client, Collection, Request, Environment\nimport xarray as xr\nimport netCDF4 as nc\nimport matplotlib.pyplot as plt\n\nSet up collection to run concise and how many granules to concatenate\n\ncollection_id = 'C1940473819-POCLOUD'\nmax_results = 5\n\nSetup harmony client to make our harmony request.\nCreate our request with the collection we want to concatenate, set concatenate to true, how many granules we want to concatenate, set skip preview to true so job doesn’t pause, and the format output we want.\nCheck to make sure our harmony request is valid.\n\nharmony_client = Client(env=Environment.PROD)\n\ncollection = Collection(id=collection_id)\n\nrequest = Request(\n collection = collection,\n concatenate = True,\n max_results = max_results,\n skip_preview = True,\n format=\"application/x-netcdf4\",\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\n\njob1_id = harmony_client.submit(request)\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=d2e082a6b1cc5b8ebff64aba5ebfd18e' -H 'User-Agent: Darwin/20.6.0 python-requests/2.26.0 harmony-py/0.4.2 CPython/3.8.10' 'https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-netcdf4&maxResults=5&concatenate=true&skipPreview=true'\n\n\nAfter submitting the request it is possible to retrieve the current processing status by using the job ID returned from the submission.\nIf the request is still running, we can wait until the Harmony request has finished processing. This cell will wait until the request has finised.\n\nprint(f'\\n{job1_id}')\n\nprint(harmony_client.status(job1_id))\n\nprint('\\nWaiting for the job to finish')\nresults = harmony_client.result_json(job1_id, show_progress=True)\n\n\n848c36db-0fe4-472e-b0e4-51abfba08101\n{'status': 'running', 'message': 'CMR query identified 2406552 granules, but the request has been limited to process only the first 5 granules because you requested 5 maxResults.', 'progress': 0, 'created_at': datetime.datetime(2022, 7, 27, 21, 37, 40, 347000, tzinfo=tzutc()), 'updated_at': datetime.datetime(2022, 7, 27, 21, 37, 40, 577000, tzinfo=tzutc()), 'created_at_local': '2022-07-27T14:37:40-07:00', 'updated_at_local': '2022-07-27T14:37:40-07:00', 'data_expiration': datetime.datetime(2022, 8, 26, 21, 37, 40, 347000, tzinfo=tzutc()), 'data_expiration_local': '2022-08-26T14:37:40-07:00', 'request': 'https://harmony.earthdata.nasa.gov/C1940473819-POCLOUD/ogc-api-coverages/1.0.0/collections/all/coverage/rangeset?forceAsync=true&format=application%2Fx-netcdf4&maxResults=5&concatenate=true&skipPreview=true', 'num_input_granules': 5}\n\nWaiting for the job to finish\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\nAfter the harmony job is finished we download the resulting concatenated granule file.\n\nprint('\\nDownloading results:')\nfilename = None\nfutures = harmony_client.download_all(job1_id, overwrite=True)\nfor f in futures:\n print(f)\n print(f.result()) # f.result() is a filename, in this case\n filename = f.result()\nprint('\\nDone downloading.')\n\n\nDownloading results:\n<Future at 0x108e8ac70 state=running>\nC1940473819-POCLOUD_merged.nc4\n\nDone downloading.\n\n\nWith the output file downloaded, now we can open concatenated granule using xarray to inspect some of the metadata.\nNote: In some of the collections the time variable has a time dimension and when we concatenate files we add a subset_index into the time dimension which causes the time variable have two dimension. Xarray doesn’t allow the time variable have two dimensions so when using xarray to open concatenated files the time variable might need to be dropped. The file can be open with netcdf library\n\n#some collections time variabe has a time dimension which can cause an exception when we concatenate and makes time two dimension\ntry:\n ds = xr.open_dataset(filename, decode_times=False)\nexcept xr.core.variable.MissingDimensionsError:\n ds = xr.open_dataset(filename, decode_times=False, drop_variables=['time'])\n\nprint(list(ds.variables))\n \nassert len(ds.coords['subset_index']) == max_results\n\n['subset_files', 'lat', 'lon', 'sea_surface_temperature', 'sst_dtime', 'quality_level', 'sses_bias', 'sses_standard_deviation', 'l2p_flags', 'sea_surface_temperature_4um', 'quality_level_4um', 'sses_bias_4um', 'sses_standard_deviation_4um', 'wind_speed', 'dt_analysis']\n\n\nAfter opening the file we can use matplotlib to create a plot for each subindex where each subindex represents the data for the granule file. We will plot sea_surface_temperature for each granule using subset_index dimension.\n\nvariable = None\nfor v in list(ds.variables):\n if v not in ['subset_files', 'lat', 'lon']:\n variable = v\n break;\n\nfor index in range(0, max_results):\n \n ds.isel(subset_index=index).plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=variable,\n s=1,\n levels=9,\n cmap=\"jet\",\n aspect=2.5,\n size=9\n )\n \n plt.xlim( 0., 360.)\n plt.ylim(-90., 90.)\n plt.show()\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWe can also plot out the entire granule file which would plot all the data of the concatenated files.\n\nds.plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=variable,\n s=1,\n levels=9,\n cmap=\"jet\",\n aspect=2.5,\n size=9\n)\n\nplt.xlim( 0., 360.)\nplt.ylim(-90., 90.)\nplt.show()" + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html", + "href": "notebooks/podaac_cmr_tutorial.html", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "", + "text": "This notebook will introduce you to programmatic Common Metadata Repository (CMR) search in python, using PO.DAAC Data as the example of data we’re interested in. While these tutorials focus on PO.DAAC data, the same strategies and code snippets can be used for other earthdata collections." + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#api-documentation", + "href": "notebooks/podaac_cmr_tutorial.html#api-documentation", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "API Documentation", + "text": "API Documentation\nThis tutorial is not meant to be a replacement for the official CMR documentation. Its features are well documented and that should be the first place to go for information. It can be found at https://cmr.earthdata.nasa.gov/search. Some users may find it easier to navigate the Earthdata Search interface, find data of interest, and then automate the results using scripts. We’d suggest visiting https://search.earthdata.nasa.gov/" + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#cmr-background-information", + "href": "notebooks/podaac_cmr_tutorial.html#cmr-background-information", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "CMR Background information", + "text": "CMR Background information\nCMR houses metadata for the 12 different DAACs. These come in the following forms:\n\nCollections\nGranules\nVariables\nServices\nVisualizations\nTools\n\nThis tutorial will focus on Collections and Granules. for more information, see the https://earthdata.nasa.gov/learn/user-resources/glossary" + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#collection-dataset-series", + "href": "notebooks/podaac_cmr_tutorial.html#collection-dataset-series", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "Collection / Dataset Series", + "text": "Collection / Dataset Series\nCollection of datasets sharing the same product specification. They are synonym of EO collections. They are named dataset series as they may be mapped to ‘dataset series’ according to the terminology defined in ISO 19113, ISO 19114 and ISO 19115." + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#granule", + "href": "notebooks/podaac_cmr_tutorial.html#granule", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "Granule", + "text": "Granule\nThe smallest aggregation of data which is independently managed (i. e. described, inventoried, retrievable). Granules may be managed as logical granules and/or physical granules. See also Scene.\nNote that granule is often equivalent to Data Set." + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#data-set", + "href": "notebooks/podaac_cmr_tutorial.html#data-set", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "Data Set", + "text": "Data Set\nA logically meaningful grouping or collection of similar or related data. Data having all of the same characteristics (source or class of source, processing level, resolution, etc.) but different independent variable ranges and/or responding to a specific need are normally considered part of a single data set. A data set is typically composed by products from several missions, gathered together to respond to the overall coverage or revisit requirements from a specific group of users.\nIn the context of EO data preservation a data set consists of the data records of one mission, sensor, and product type and the associated knowledge(information, tools). See collection." + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#what-does-all-of-this-mean", + "href": "notebooks/podaac_cmr_tutorial.html#what-does-all-of-this-mean", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "What does all of this mean?", + "text": "What does all of this mean?\nFor the most part, users want to discover collections of interest to them, usually defined by parameter (Sea Surface Temperature, Ocean Winds, Sea Surface Height, etc), Level, spatial and temporal coverage, etc. Lets show an example." + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#find-collections-by-parameter", + "href": "notebooks/podaac_cmr_tutorial.html#find-collections-by-parameter", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "Find collections by parameter", + "text": "Find collections by parameter\n\nfrom urllib import request\nimport json\nimport pprint\n\ncmr_url = \"https://cmr.earthdata.nasa.gov/search/\"\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\nThere’s a lot going on here. First off, the url:\nhttps://cmr.earthdata.nasa.gov/search/collections.umm_json?science_keywords[0][topic]=OCEANS\nThe basic premise is this: We are asking for all collections (../search/collections) that fall under the ‘OCEANS’ science topic as defined by GCMD. We are requesting this in the umm_json format (.umm_json). What we get back is a listing of those collections matching this. When last run, this was over 10900 collections! that’s a lot. Let’s get that down a bit…\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS&science_keywords[0][term]=Ocean%20Temperature&has_granules_or_cwic=true&page_size=50\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\nHere we’re now limiting the search to those with the Oceans topic as well as the ‘Ocean Temperature’ term. To limit this further, we are only searching for collections that contain granules (data). We do this by specifying\nhas_granules_or_cwic=true\nSo we are closing in on this. Let’s add a time range and find some PO.DAAC data:\n\nwith request.urlopen(cmr_url+\"collections.umm_json?science_keywords[0][topic]=OCEANS&science_keywords[0][term]=Ocean%20Temperature&has_granules_or_cwic=true&temporal=2018-01-01T10:00:00Z,2019-01-01T10:00:00Z&provider_short_name=PODAAC&processing_level_id=4&page_size=50\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\n{ 'hits': 29,\n 'items': [ { 'meta': { 'concept-id': 'C1658476070-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+RAMSSA+Australian+Regional+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:28Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Australian '\n 'Bureau of Meteorology using optimal '\n 'interpolation (OI) on a regional 1/12 '\n 'degree grid over the Australian region '\n '(20N - 70S, 60E - 170W). This BLUELink '\n 'Regional Australian Multi-Sensor SST '\n 'Analysis (RAMSSA) v1.0 system blends '\n 'satellite SST observations from the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Advanced Along Track '\n 'Scanning Radiometer (AATSR), and, the '\n 'Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSRE), and in situ data '\n 'from ships, and drifting and moored buoy '\n 'from the Global Telecommunications System '\n '(GTS). The processing results in daily '\n 'foundation SST estimates that are largely '\n 'free of nocturnal cooling and diurnal '\n 'warming effects.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2008-01-24, '\n 'GHRSST '\n 'Level '\n '4 '\n 'RAMSSA '\n 'Australian '\n 'Regional '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHRAM-4FA01, '\n 'http://www.bom.gov.au/jshess/docs/2011/beggs_hres.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHRAM-4FA01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2008-01-29T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 RAMSSA Australian '\n 'Regional Foundation Sea Surface '\n 'Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'OCEANIA'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:25.914Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/AUS/ABOM/RAMSSA_09km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/AUS/ABOM/RAMSSA_09km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHRAM-4FA01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHRAM-4FA01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/AUS/ABOM/RAMSSA_09km/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'ABOM-L4HRfnd-AUS-RAMSSA_09km',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': 60.0},\n { 'EastBoundingCoordinate': -170.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657548743-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+GAMSSA+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:51Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Australian '\n 'Bureau of Meteorology using optimal '\n 'interpolation (OI) on a global 0.25 '\n 'degree grid. This BLUELink Global '\n 'Australian Multi-Sensor SST Analysis '\n '(GAMSSA) v1.0 system blends satellite SST '\n 'observations from the Advanced Very High '\n 'Resolution Radiometer (AVHRR), the '\n 'Advanced Along Track Scanning Radiometer '\n '(AATSR), and, the Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), and in '\n 'situ data from ships, and drifting and '\n 'moored buoy from the Global '\n 'Telecommunications System (GTS). In order '\n 'to produce a foundation SST estimate, the '\n 'AATSR skin SST data stream is converted '\n 'to foundation SST using the Donlon et al. '\n '(2002) skin to foundation temperature '\n 'conversion algorithms. These '\n 'empirically-derived algorithms apply a '\n 'small correction for the cool-skin effect '\n 'depending on surface wind speed, and '\n 'filter out SST values suspected to be '\n 'affected by diurnal warming by excluding '\n 'cases which have experienced recent '\n 'surface wind speeds of below 6 ms-1 '\n 'during the day and less than 2 ms-1 '\n 'during the night.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2008-07-28, '\n 'GHRSST '\n 'Level '\n '4 '\n 'GAMSSA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHGAM-4FA01, '\n 'http://www.bom.gov.au/australia/charts/bulletins/apob77.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGAM-4FA01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2008-08-01T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 GAMSSA Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:49.385Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/ABOM/GAMSSA_28km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/ABOM/GAMSSA_28km',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access to the data '\n 'through OpenDAP '\n 'protocol',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'http://opendap.bom.gov.au:8080/thredds/catalog',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGAM-4FA01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_ABOM-L4LRfnd-GLOB-GAMSSA_28km.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGAM-4FA01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/ABOM/GAMSSA_28km/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'ABOM-L4LRfnd-GLOB-GAMSSA_28km',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-08-24T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1652971997-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+AVHRR_OI+Global+Blended+Sea+Surface+Temperature+Analysis+(GDS+version+2)+from+NCEI',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:02Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.25 degree grid at the NOAA '\n 'National Centers for Environmental '\n 'Information. This product uses optimal '\n 'interpolation (OI) by interpolating and '\n 'extrapolating SST observations from '\n 'different sources, resulting in a '\n 'smoothed complete field. The sources of '\n 'data are satellite (AVHRR) and in situ '\n 'platforms (i.e., ships and buoys), and '\n 'the specific datasets employed may change '\n 'over. At the marginal ice zone, sea ice '\n 'concentrations are used to generate proxy '\n 'SSTs. A preliminary version of this file '\n 'is produced in near-real time (1-day '\n 'latency), and then replaced with a final '\n 'version after 2 weeks. Note that this is '\n 'the AVHRR-ONLY (AVHRR-OI), available from '\n 'September 1, 1981, but there is a '\n 'companion SST product that includes '\n 'microwave satellite data, available from '\n 'June 2002.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information, '\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information, '\n '2016-04-20, '\n 'GHRSST '\n 'Level '\n '4 '\n 'AVHRR_OI '\n 'Global '\n 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2) '\n 'from '\n 'NCEI, '\n '10.5067/GHAAO-4BC02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHAAO-4BC02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1-828-271-4302'},\n { 'Type': 'Email',\n 'Value': 'Richard.W.Reynolds@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Richard',\n 'LastName': 'Reynolds',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2015-12-28T17:28:56.110Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 AVHRR_OI Global Blended '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2) from NCEI',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:10:59.809Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Journal publication',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/papers/daily-sst.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=AVHRR_OI-NCEI-L4-GLOB-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'Homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=5&t=219',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHAAO-4BC02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Daily 1/4 Degree '\n 'Optimum '\n 'Interpolation Sea '\n 'Surface Temperature '\n '(OISST)- Climate '\n 'Algorithm '\n 'Theoretical '\n 'Theoretical Basis '\n 'Document, NOAA '\n 'Climate Data Record '\n 'Program '\n 'CDRP-ATBD-0303 Rev. '\n '2 (2013)',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www1.ncdc.noaa.gov/pub/data/sds/cdr/CDRs/Sea_Surface_Temperature_Optimum_Interpolation/AlgorithmDescription.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Web site with '\n 'general description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/description.php',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Viva Banzon, Thomas '\n 'M. Smith, Toshio '\n 'Mike Chin, Chunying '\n 'Liu, and William '\n 'Hankins, A '\n 'long-term record of '\n 'blended satellite '\n 'and in situ '\n 'sea-surface '\n 'temperature for '\n 'climate monitoring, '\n 'modeling and '\n 'environmental '\n 'studies, Earth '\n 'Syst. Sci. Data, 8, '\n '165-176, 2016',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.earth-syst-sci-data.net/8/165/2016/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Reynolds, et '\n 'al.(2009)',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/sites/default/files/attachments/Reynolds2009_oisst_daily_v02r00_version2-features.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHAAO-4BC02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'AVHRR_OI-NCEI-L4-GLOB-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-09-01T00:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1652972273-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+CMC0.1deg+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:06Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature (SST) analysis produced daily '\n 'on an operational basis at the Canadian '\n 'Meteorological Center. This dataset '\n 'merges infrared satellite SST at varying '\n 'points in the time series from the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) from NOAA-18,19, the European '\n 'Meteorological Operational-A (METOP-A) '\n 'and Operational-B (METOP-B), and '\n 'microwave data from the Advanced '\n 'Microwave Scanning Radiometer 2 (AMSR2) '\n 'onboard the GCOM-W satellite in '\n 'conjunction with in situ observations of '\n 'SST from drifting buoys and ships from '\n 'the ICOADS program. It uses the previous '\n 'days analysis as the background field for '\n 'the statistical interpolation used to '\n 'assimilate the satellite and in situ '\n 'observations. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Canada '\n 'Meteorological '\n 'Center, '\n 'Canada '\n 'Meteorological '\n 'Center, '\n '2016-07-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'CMC0.1deg '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHCMC-4FM03, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHCMC-4FM03'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'CMC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '514-421-5002'},\n { 'Type': 'Email',\n 'Value': 'dorina.surcel-colan@canada.ca'}]},\n 'ContactPersons': [ { 'FirstName': 'Dorina',\n 'LastName': 'Colan',\n 'MiddleName': 'Surcel',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Canada Meteorological '\n 'Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2015-12-21T18:32:39.515Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 CMC0.1deg Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis (GDS version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:03.941Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/CMC/CMC0.1deg/v3',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/CMC/CMC0.1deg/v3',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=7',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Previous version '\n '(v2.0) with 0.2 '\n 'degree spatial '\n 'resolution starting '\n 'from Sept 1, 1991',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac.jpl.nasa.gov/dataset/CMC0.2deg-CMC-L4-GLOB-v2.0',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Sensitivity of '\n 'Ocean Surface '\n 'Salinity '\n 'Measurements From '\n 'Spaceborne L-Band '\n 'Radiometers to '\n 'Ancillary Sea '\n 'Surface Temperature',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/document/7547916/',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=CMC0.1deg-CMC-L4-GLOB-v3.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHCMC-4FM03',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHCMC-4FM03',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/CMC/CMC0.1deg/v3/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'CMC0.1deg-CMC-L4-GLOB-v3.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2016-01-01T00:00:00.000Z'}]}],\n 'Version': '3.0'}},\n { 'meta': { 'concept-id': 'C1653649473-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+DMI_OI+Global+Foundation+Sea+Surface+Temperature+Analysis++(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T19:03:13Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis by the Danish '\n 'Meteorological Institute (DMI) using an '\n 'optimal interpolation (OI) approach on a '\n 'global 0.05 degree grid. The analysis is '\n 'based upon nighttime GHRSST L2P skin and '\n 'subskin SST observations from several '\n 'satellites. The sensors include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Spinning Enhanced Visible '\n 'and Infrared Imager (SEVIRI), the '\n 'Advanced Microwave Scanning Radiometer 2 '\n '(AMSR2), the Visible Infrared Imager '\n 'Radiometer Suite (VIIRS), and the '\n 'Moderate Resolution Imaging '\n 'Spectroradiometer (MODIS) on Aqua. An ice '\n 'field from the EUMETSAT OSI-SAF is used '\n 'to mask out areas with ice. This dataset '\n 'adheres to the version 2 GHRSST Data '\n 'Processing Specification (GDS).',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'DMI, '\n 'Center '\n 'for '\n 'Ocean '\n 'and '\n 'Ice, '\n '2007-09-08, '\n 'GHRSST '\n 'Level '\n '4 '\n 'DMI_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGDM-4FD02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGDM-4FD02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Danish Meteorological '\n 'Institute'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+45-39157203'},\n { 'Type': 'Email',\n 'Value': 'jlh@dmi.dk'}]},\n 'ContactPersons': [ { 'FirstName': 'Jacob',\n 'LastName': 'Hoeyer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Danish Meteorological '\n 'Institute, Center for '\n 'Ocean and Ice'}],\n 'DataDates': [ { 'Date': '2013-02-14T00:57:45.743Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 DMI_OI Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T19:03:11.255Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/DMI/DMI_OI/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/DMI/DMI_OI/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=DMI_OI-DMI-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGDM-4FD02&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'OSI SAF homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.osi-saf.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'user services',\n 'Type': 'USE SERVICE API',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGDM-4FD02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/DMI/DMI_OI/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'DMI_OI-DMI-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2013-04-30T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1653205971-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+GAMSSA_28km+Global+Foundation+Sea+Surface+Temperature+Analysis+v1.0+dataset+(GDS2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T16:08:53Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis, produced daily on '\n 'an operational basis at the Australian '\n 'Bureau of Meteorology (BoM) using optimal '\n 'interpolation (OI) on a global 0.25 '\n 'degree grid. This Global Australian '\n 'Multi-Sensor SST Analysis (GAMSSA) v1.0 '\n 'system blends satellite SST observations '\n 'from passive infrared and passive '\n 'microwave radiometers with in situ data '\n 'from ships, drifting buoys and moorings '\n 'from the Global Telecommunications System '\n '(GTS). SST observations that have '\n 'experienced recent surface wind speeds '\n 'less than 6 m/s during the day or less '\n 'than 2 m/s during night are rejected from '\n 'the analysis. The processing results in '\n 'daily foundation SST estimates that are '\n 'largely free of nocturnal cooling and '\n 'diurnal warming effects. Sea ice '\n 'concentrations are supplied by the '\n 'NOAA/NCEP 12.7 km sea ice analysis. In '\n 'the absence of observations, the analysis '\n 'relaxes to the Reynolds and Smith (1994) '\n 'Monthly 1 degree SST climatology for 1961 '\n '- 1990.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF '\n '4.3',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2019-09-18, '\n 'GHRSST '\n 'Level '\n '4 '\n 'GAMSSA_28km '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n 'v1.0 '\n 'dataset '\n '(GDS2), '\n '10.5067/GHGAM-4FA1A, '\n 'http://www.bom.gov.au/australia/charts/bulletins/apob77.pdf'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGAM-4FA1A'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2019-08-23T23:59:16.644Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-08-23T23:59:16.644Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 GAMSSA_28km Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis v1.0 dataset (GDS2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T16:08:50.647Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/ABOM/GAMSSA/v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGAM-4FA1A',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=GAMSSA_28km-ABOM-L4-GLOB-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGAM-4FA1A',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/ABOM/GAMSSA/v1.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'GAMSSA_28km-ABOM-L4-GLOB-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-07-23T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657544973-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSPO+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:28Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Office of '\n 'Satellite and Product Operations (OSPO) '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. \\n'\n 'The Geo-Polar Blended Sea Surface '\n 'Temperature (SST) Analysis combines '\n 'multi-satellite retrievals of sea surface '\n 'temperature into a single analysis of '\n 'SST. This analysis uses both daytime and '\n 'nighttime data from sensors that include '\n 'the Advanced Very High Resolution '\n 'Radiometer (AVHRR), the Visible Infrared '\n 'Imager Radiometer Suite (VIIRS), the '\n 'Geostationary Operational Environmental '\n 'Satellite (GOES) imager, the Japanese '\n 'Advanced Meteorological Imager (JAMI) and '\n 'in situ data from ships, drifting and '\n 'moored buoys. This analysis was '\n 'specifically produced to be used as a '\n 'lower boundary condition in Numerical '\n 'Weather Prediction (NWP) models. This '\n 'dataset adheres to the GHRSST Data '\n 'Processing Specification (GDS) version 2 '\n 'format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Office '\n 'of '\n 'Satellite '\n 'Products '\n 'and '\n 'Operations, '\n 'The '\n 'GHRSST '\n 'Project '\n 'Office, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSPO '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGPB-4FO02, '\n 'www.osdpd.nesdis.noaa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGPB-4FO02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'OSPO'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-763-8102'},\n { 'Type': 'Email',\n 'Value': 'Eileen.maturi@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Eileen',\n 'LastName': 'Maturi',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA Office of '\n 'Satellite and Product '\n 'Operations'}],\n 'DataDates': [ { 'Date': '2014-08-05T02:38:36.840Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSPO Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:25.672Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Himawari '\n 'Imager',\n 'ShortName': 'AHI'}],\n 'LongName': 'Himawari Meteorological '\n 'Satellites',\n 'ShortName': 'Himawari',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-99.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '6000.0'}],\n 'LongName': 'null',\n 'ShortName': 'GOES-15 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '15',\n 'ShortName': 'GOES-15',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat-10',\n 'ShortName': 'METEOSAT-10',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGPB-4FO02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Fieguth, P. '\n 'Multiply-Rooted '\n 'Multiscale Models '\n 'for Large-Scale '\n 'Estimation, IEEE '\n 'Image Processing, '\n '10(11), 1676-1686, '\n '2001',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=967396',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Khellah, F., P.W. '\n 'Fieguth, M.J. '\n 'Murray and M.R. '\n 'Allen, Statistical '\n 'Processing of Large '\n 'Image Sequences, '\n 'IEEE Transactions '\n 'on Geoscience and '\n 'Remote Sensing, 12 '\n '(1), 80-93, 2005',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1369331',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Fieguth,P.W. et al. '\n 'Mapping '\n 'Mediterranean '\n 'altimeter data with '\n 'a multiresolution '\n 'optimal '\n 'interpolation '\n 'algorithm, J. '\n 'Atmos. Ocean Tech, '\n '15 (2): 535-546, '\n '1998',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/full/10.1175/1520-0426%281998%29015%3C0535%3AMMADWA%3E2.0.CO%3B2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=Geo_Polar_Blended-OSPO-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGPB-4FO02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'Geo_Polar_Blended-OSPO-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2014-06-02T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1657544629-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSPO+Global+Nighttime+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-18T21:27:24Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Office of '\n 'Satellite and Product Operations (OSPO) '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Geo-Polar '\n 'Blended Sea Surface Temperature (SST) '\n 'Analysis combines multi-satellite '\n 'retrievals of sea surface temperature '\n 'into a single analysis of SST. This '\n 'analysis includes only nighttime data '\n 'from sensors that include the Advanced '\n 'Very High Resolution Radiometer (AVHRR), '\n 'the Visible Infrared Imager Radiometer '\n 'Suite (VIIRS), the Geostationary '\n 'Operational Environmental Satellite '\n '(GOES) imager, the Japanese Advanced '\n 'Meteorological Imager (JAMI) and in situ '\n 'data from ships, drifting and moored '\n 'buoys. This analysis was specifically '\n 'produced to be used as a lower boundary '\n 'condition in Numerical Weather Prediction '\n '(NWP) models. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Office '\n 'of '\n 'Satellite '\n 'Products '\n 'and '\n 'Operations, '\n 'The '\n 'GHRSST '\n 'Project '\n 'Office, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSPO '\n 'Global '\n 'Nighttime '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHGPN-4FO02, '\n 'www.osdpd.nesdis.noaa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGPN-4FO02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'OSPO'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-763-8102'},\n { 'Type': 'Email',\n 'Value': 'Eileen.maturi@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Eileen',\n 'LastName': 'Maturi',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA Office of '\n 'Satellite and Product '\n 'Operations'}],\n 'DataDates': [ { 'Date': '2014-08-05T02:44:36.854Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSPO Global Nighttime '\n 'Foundation Sea Surface Temperature '\n 'Analysis (GDS version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-18T21:27:21.342Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Himawari '\n 'Imager',\n 'ShortName': 'AHI'}],\n 'LongName': 'Himawari Meteorological '\n 'Satellites',\n 'ShortName': 'Himawari',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-99.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '6000.0'}],\n 'LongName': 'null',\n 'ShortName': 'GOES-15 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '15',\n 'ShortName': 'GOES-15',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat-10',\n 'ShortName': 'METEOSAT-10',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Khellah, F., P.W. '\n 'Fieguth, M.J. '\n 'Murray and M.R. '\n 'Allen, Statistical '\n 'Processing of Large '\n 'Image Sequences, '\n 'IEEE Transactions '\n 'on Geoscience and '\n 'Remote Sensing, 12 '\n '(1), 80-93, 2005',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1369331',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=Geo_Polar_Blended_Night-OSPO-L4-GLOB-v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Fieguth,P.W. et al. '\n 'Mapping '\n 'Mediterranean '\n 'altimeter data with '\n 'a multiresolution '\n 'optimal '\n 'interpolation '\n 'algorithm, J. '\n 'Atmos. Ocean Tech, '\n '15 (2): 535-546, '\n '1998',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/full/10.1175/1520-0426%281998%29015%3C0535%3AMMADWA%3E2.0.CO%3B2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Fieguth, P. '\n 'Multiply-Rooted '\n 'Multiscale Models '\n 'for Large-Scale '\n 'Estimation, IEEE '\n 'Image Processing, '\n '10(11), 1676-1686, '\n '2001',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=967396',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGPN-4FO02',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGPN-4FO02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/OSPO/Geo_Polar_Blended_Night/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'Geo_Polar_Blended_Night-OSPO-L4-GLOB-v1.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2014-06-02T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1650311564-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+G1SST+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-01T16:27:07Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis by the JPL OurOcean '\n 'group using a multi-scale two-dimensional '\n 'variational (MS-2DVAR) blending algorithm '\n 'on a global 0.009 degree grid. This '\n 'Global 1 km SST (G1SST) analysis uses '\n 'satellite data from sensors that include '\n 'the Advanced Very High Resolution '\n 'Radiometer (AVHRR), the Advanced Along '\n 'Track Scanning Radiometer (AATSR), the '\n 'Spinning Enhanced Visible and Infrared '\n 'Imager (SEVIRI), the Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), the '\n 'Tropical Rainfall Measuring Mission '\n 'Microwave Imager (TMI), the Moderate '\n 'Resolution Imaging Spectroradiometer '\n '(MODIS), the Geostationary Operational '\n 'Environmental Satellite (GOES) Imager, '\n 'the Multi-Functional Transport Satellite '\n '1R (MTSAT-1R) radiometer, and in situ '\n 'data from drifting and moored buoys.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'OurOcean '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2010-06-03, '\n 'GHRSST '\n 'Level '\n '4 '\n 'G1SST '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHG1S-4FP01, '\n 'http://ourocean.jpl.nasa.gov/SST/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHG1S-4FP01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'The OurOcean Team, '\n 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1 '\n '818 '\n '354 '\n '0327'},\n { 'Type': 'Email',\n 'Value': 'benyang.tang@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Benyang',\n 'LastName': 'Tang',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '1 '\n '818 '\n '354 '\n '8168'},\n { 'Type': 'Email',\n 'Value': 'yi.chao@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Yi',\n 'LastName': 'Chao',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'}],\n 'DataDates': [ { 'Date': '2010-06-16T06:32:13.049Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 G1SST Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-01T16:27:04.718Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '12000.0'}],\n 'LongName': 'Multifunctional '\n 'Transport '\n 'Satellites '\n '1R '\n 'Imager',\n 'ShortName': 'MTSAT '\n '1R '\n 'Imager'}],\n 'LongName': 'Multi-functional '\n 'Transport Satellite 1 '\n 'Replacement',\n 'ShortName': 'MTSAT-1R',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'NDBC MOORED BUOY',\n 'ShortName': 'NDBC-MOORED-BUOY',\n 'Type': 'bouy, spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '12000.0'}],\n 'LongName': 'Multifunction '\n 'Transport '\n '2 '\n 'Imager',\n 'ShortName': 'MTSAT '\n '2 '\n 'Imager'}],\n 'LongName': 'The Multi-functional '\n 'Transport Satellite 2',\n 'ShortName': 'MTSAT-2',\n 'Type': 'Geostationary'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/JPL_OUROCEAN/G1SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/JPL_OUROCEAN/G1SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Select (Sea Surface '\n 'Temperature - '\n 'Blended)',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'http://podaac-tools.jpl.nasa.gov/soto/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'OurOcean Team '\n 'homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ourocean.jpl.nasa.gov/sst',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHG1S-4FP01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_JPL_OUROCEAN-L4UHfnd-GLOB-G1SST_OI.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHG1S-4FP01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/JPL_OUROCEAN/G1SST/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'JPL_OUROCEAN-L4UHfnd-GLOB-G1SST',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 80.0,\n 'SouthBoundingCoordinate': -80.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2010-06-09T00:00:00.000Z'}]}],\n 'Version': '1'}},\n { 'meta': { 'concept-id': 'C1664741463-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MUR+Global+Foundation+Sea+Surface+Temperature+Analysis+(v4.1)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T15:46:40Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced as a '\n 'retrospective dataset (four day latency) '\n 'and near-real-time dataset (one day '\n 'latency) at the JPL Physical Oceanography '\n 'DAAC using wavelets as basis functions in '\n 'an optimal interpolation approach on a '\n 'global 0.01 degree grid. The version 4 '\n 'Multiscale Ultrahigh Resolution (MUR) L4 '\n 'analysis is based upon nighttime GHRSST '\n 'L2P skin and subskin SST observations '\n 'from several instruments including the '\n 'NASA Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSR-E), the JAXA '\n 'Advanced Microwave Scanning Radiometer 2 '\n 'on GCOM-W1, the Moderate Resolution '\n 'Imaging Spectroradiometers (MODIS) on the '\n 'NASA Aqua and Terra platforms, the US '\n 'Navy microwave WindSat radiometer, the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) on several NOAA satellites, and '\n 'in situ SST observations from the NOAA '\n 'iQuam project. The ice concentration data '\n 'are from the archives at the EUMETSAT '\n 'Ocean and Sea Ice Satellite Application '\n 'Facility (OSI SAF) High Latitude '\n 'Processing Center and are also used for '\n 'an improved SST parameterization for the '\n 'high-latitudes. The dataset also '\n 'contains additional variables for some '\n 'granules including a SST anomaly derived '\n 'from a MUR climatology and the temporal '\n 'distance to the nearest IR measurement '\n 'for each pixel.\\n'\n 'This dataset is funded by the NASA '\n 'MEaSUREs program ( '\n 'http://earthdata.nasa.gov/our-community/community-data-system-programs/measures-projects '\n '), and created by a team led by Dr. '\n 'Toshio M. Chin from JPL. It adheres to '\n 'the GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications. '\n 'Use the file global metadata \"history:\" '\n 'attribute to determine if a granule is '\n 'near-realtime or retrospective.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'MUR '\n 'MEaSUREs '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2015-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MUR '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(v4.1), '\n '10.5067/GHGMR-4FJ04, '\n 'http://mur.jpl.nasa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHGMR-4FJ04'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': ' '\n '1-818-393-2510'},\n { 'Type': 'Email',\n 'Value': 'mike.chin@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Mike',\n 'LastName': 'Chin',\n 'MiddleName': 'noen',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2014-10-31T16:30:37.998Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MUR Global Foundation '\n 'Sea Surface Temperature Analysis (v4.1)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-06T15:46:37.263Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'MEaSUREs'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/JPL/MUR/v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'SOTO (State of the '\n 'Ocean) '\n 'Visualization',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/soto/#b=BlueMarble_ShadedRelief_Bathymetry&l=GHRSST_L4_MUR_Sea_Surface_Temperature(la=true)',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://github.com/nasa/podaac_tools_and_services/tree/master/subset_opendap',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHGMR-4FJ04',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Homepage for the '\n 'NASA MEaSUREs '\n 'projects',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://science.nasa.gov/earth-science/earth-science-data/Earth-Science-Data-Records-Programs/MEaSUREs-Projects/',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MUR-JPL-L4-GLOB-v4.1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Chin T.M., Milliff '\n 'R.F., Large W.G. '\n '(1998). '\n 'Basin-scale, '\n 'high-wavenumber sea '\n 'surface wind fields '\n 'from a '\n 'multiresolution '\n 'analysis of '\n 'scatterometer data. '\n 'Journal of '\n 'Atmospheric and '\n 'Oceanic Technology, '\n '15: 741-763',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Chin, Toshio '\n 'Michael, Jorge '\n 'Vazquez-Cuervo, and '\n 'Edward M. '\n 'Armstrong. A '\n 'multi-scale '\n 'high-resolution '\n 'analysis of global '\n 'sea surface '\n 'temperature. Remote '\n 'sensing of '\n 'environment 200 '\n '(2017): 154-169.',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://doi.org/10.1016/j.rse.2017.07.029',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'website',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHGMR-4FJ04',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T09:00:00.000Z'}]}],\n 'Version': '4.1'}},\n { 'meta': { 'concept-id': 'C1646568487-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MUR+0.25deg+Global+Foundation+Sea+Surface+Temperature+Analysis+(v4.2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-10-17T15:10:57Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced as a '\n 'retrospective dataset (four day latency) '\n 'and near-real-time dataset (one day '\n 'latency) at the JPL Physical Oceanography '\n 'DAAC using wavelets as basis functions in '\n 'an optimal interpolation approach on a '\n 'global 0.25 degree grid. The version 4 '\n 'Multiscale Ultrahigh Resolution (MUR) L4 '\n 'analysis is based upon nighttime GHRSST '\n 'L2P skin and subskin SST observations '\n 'from several instruments including the '\n 'NASA Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSR-E), the JAXA '\n 'Advanced Microwave Scanning Radiometer 2 '\n 'on GCOM-W1, the Moderate Resolution '\n 'Imaging Spectroradiometers (MODIS) on the '\n 'NASA Aqua and Terra platforms, the US '\n 'Navy microwave WindSat radiometer, the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR) on several NOAA satellites, and '\n 'in situ SST observations from the NOAA '\n 'iQuam project. The ice concentration data '\n 'are from the archives at the EUMETSAT '\n 'Ocean and Sea Ice Satellite Application '\n 'Facility (OSI SAF) High Latitude '\n 'Processing Center and are also used for '\n 'an improved SST parameterization for the '\n 'high-latitudes. The dataset also '\n 'contains an additional SST anomaly '\n 'variable derived from a MUR climatology.\\n'\n '\\n'\n '\\n'\n 'This dataset is funded by the NASA '\n 'MEaSUREs '\n 'program(http://earthdata.nasa.gov/our-community/community-data-system-programs/measures-projects), '\n 'and created by a team led by Dr. Toshio '\n 'M. Chin from JPL. It adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications. '\n 'Use the file global metadata \"history:\" '\n 'attribute to determine if a granule is '\n 'near-realtime or retrospective.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'JPL '\n 'MUR '\n 'MEaSUREs '\n 'Project, '\n 'JPL '\n 'NASA, '\n '2018-10-17, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MUR '\n '0.25deg '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(v4.2), '\n '10.5067/GHM25-4FJ42, '\n 'http://mur.jpl.nasa.gov'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHM25-4FJ42'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': ' '\n '1-818-393-2510'},\n { 'Type': 'Email',\n 'Value': 'mike.chin@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Mike',\n 'LastName': 'Chin',\n 'MiddleName': 'noen',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Jet Propulsion '\n 'Laboratory'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2019-08-09T19:47:48.185Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-08-09T19:47:48.185Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MUR 0.25deg Global '\n 'Foundation Sea Surface Temperature '\n 'Analysis (v4.2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-10-17T15:10:54.695Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'SPURS-I SVP Drifters',\n 'ShortName': 'Drifter',\n 'Type': 'BUOY'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR25/v4.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/JPL/MUR25/v4.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'R language read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'MUR Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://mur.rsmas.miami.edu',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'website',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'IDL read software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'MATLAB read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Homepage for the '\n 'NASA MEaSUREs '\n 'projects',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://science.nasa.gov/earth-science/earth-science-data/Earth-Science-Data-Records-Programs/MEaSUREs-Projects/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Algorithm '\n 'Theoretical Basis '\n 'Document',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/docs/Chin2017.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'THREDDS access URL',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MUR25-JPL-L4-GLOB-v04.2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python read '\n 'software',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Chin T.M., Milliff '\n 'R.F., Large W.G. '\n '(1998). '\n 'Basin-scale, '\n 'high-wavenumber sea '\n 'surface wind fields '\n 'from a '\n 'multiresolution '\n 'analysis of '\n 'scatterometer data. '\n 'Journal of '\n 'Atmospheric and '\n 'Oceanic Technology, '\n '15: 741-763',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://journals.ametsoc.org/doi/abs/10.1175/1520-0426%281998%29015%3C0741:BSHWSS%3E2.0.CO;2',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHM25-4FJ42',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Python Subsetting '\n 'Script',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac.jpl.nasa.gov/forum/viewtopic.php?f=5&t=219',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHM25-4FJ42',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR25/v4.2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'MUR25-JPL-L4-GLOB-v04.2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T09:00:00.000Z'}]}],\n 'Version': '4.2'}},\n { 'meta': { 'concept-id': 'C1658476085-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MW_IR_OI+Global+Foundation+Sea+Surface+Temperature+analysis+version+5.0+from+REMSS',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:32Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.09-degree grid at Remote '\n 'Sensing Systems. This product uses '\n 'optimal interpolation (OI) from both '\n 'microwave (MW) sensors including the '\n 'Global Precipitation Measurement (GPM) '\n 'Microwave Imager (GMI), the Tropical '\n 'Rainfall Measuring Mission (TRMM) '\n 'Microwave Imager (TMI), the NASA Advanced '\n 'Microwave Scanning Radiometer-EOS '\n '(AMSRE), the Advanced Microwave Scanning '\n 'Radiometer 2 (AMSR2) onboard the GCOM-W1 '\n 'satellite, and WindSat operates on the '\n 'Coriolis satellite, and infrared (IR) '\n 'sensors such as the Moderate Resolution '\n 'Imaging Spectroradiometer (MODIS) on the '\n 'NASA Aqua and Terra platform and the '\n 'Visible Infrared Imaging Radiometer Suite '\n '(VIIRS) on board the Suomi-NPP '\n 'satellite. The through-cloud '\n 'capabilities of microwave radiometers '\n 'provide a valuable picture of global sea '\n 'surface temperature (SST) while infrared '\n 'radiometers (i.e., MODIS) have a higher '\n 'spatial resolution. This analysis does '\n 'not use any in situ SST data such as '\n 'drifting buoy SST. Comparing with '\n 'previous version 4.0 dataset, the version '\n '5.0 has made the updates in several '\n 'areas, including the diurnal warming '\n 'model, the sensor-specific error '\n 'statistics (SSES) for each microwave '\n 'sensor, the sensor correlation model, and '\n 'the quality mask.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Remote '\n 'Sensing '\n 'Systems, '\n 'Remote '\n 'Sensing '\n 'Systems, '\n '2017-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MW_IR_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'analysis '\n 'version '\n '5.0 '\n 'from '\n 'REMSS, '\n '10.5067/GHMWI-4FR05, '\n 'http://www.remss.com'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHMWI-4FR05'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Remote Sensing '\n 'Systems'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '001 '\n '707 '\n '545 '\n '2904'},\n { 'Type': 'Email',\n 'Value': 'brewer@remss.com'}]},\n 'ContactPersons': [ { 'FirstName': 'Marty',\n 'LastName': 'Brewer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Remote Sensing '\n 'Systems'}],\n 'DataDates': [ { 'Date': '2017-09-30T00:13:19.814Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-09-30T00:13:19.814Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MW_IR_OI Global '\n 'Foundation Sea Surface Temperature '\n 'analysis version 5.0 from REMSS',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:30.012Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '95.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '65.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '904.0'}],\n 'LongName': 'GPM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'GMI'}],\n 'LongName': 'Global Precipitation '\n 'Measurement Core '\n 'Observatory',\n 'ShortName': 'GPM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHMWI-4FR04&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Microwave Infrared '\n 'OI SST Product '\n 'Description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.remss.com/measurements/sea-surface-temperature/oisst-description',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MW_IR_OI-REMSS-L4-GLOB-v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHMWI-4FR05',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_ir_OI/v5.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'MW_IR_OI-REMSS-L4-GLOB-v5.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -179.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2002-06-01T00:00:00.000Z'}]}],\n 'Version': '5.0'}},\n { 'meta': { 'concept-id': 'C1658476097-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+MW_OI+Global+Foundation+Sea+Surface+Temperature+analysis+version+5.0+from+REMSS',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:36Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) global Level 4 sea '\n 'surface temperature analysis produced '\n 'daily on a 0.25-degree grid at Remote '\n 'Sensing Systems. This product uses '\n 'optimal interpolation (OI) from microwave '\n '(MW) sensors including the Global '\n 'Precipitation Measurement (GPM) Microwave '\n 'Imager (GMI), the Tropical Rainfall '\n 'Measuring Mission (TRMM) Microwave Imager '\n '(TMI), the NASA Advanced Microwave '\n 'Scanning Radiometer-EOS (AMSRE), the '\n 'Advanced Microwave Scanning Radiometer 2 '\n '(AMSR2) onboard the GCOM-W1 satellite, '\n 'and WindSat operates on the Coriolis '\n 'satellite. The through-cloud capabilities '\n 'of microwave radiometers provide a '\n 'valuable picture of global sea surface '\n 'temperature (SST). This analysis does not '\n 'use any in situ SST data such as drifting '\n 'buoy SST. Comparing with previous version '\n '4.0 dataset, the version 5.0 has made the '\n 'updates in several areas, including the '\n 'diurnal warming model, the '\n 'sensor-specific error statistics (SSES) '\n 'for each microwave sensor, the sensor '\n 'correlation model, and the quality mask.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Remote '\n 'Sensing '\n 'Systems, '\n 'Remote '\n 'Sensing '\n 'Systems, '\n '2017-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'MW_OI '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'analysis '\n 'version '\n '5.0 '\n 'from '\n 'REMSS, '\n '10.5067/GHMWO-4FR05, '\n 'http://www.remss.com'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHMWO-4FR05'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Remote Sensing '\n 'Systems'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '001 '\n '707 '\n '545 '\n '2904'},\n { 'Type': 'Email',\n 'Value': 'brewer@remss.com'}]},\n 'ContactPersons': [ { 'FirstName': 'Marty',\n 'LastName': 'Brewer',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Remote Sensing '\n 'Systems'}],\n 'DataDates': [ { 'Date': '2017-10-17T01:11:38.234Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-10-17T01:11:38.234Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 MW_OI Global Foundation '\n 'Sea Surface Temperature analysis '\n 'version 5.0 from REMSS',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:33.999Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.6'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1200.0'}],\n 'LongName': 'WindSat',\n 'ShortName': 'WINDSAT'}],\n 'LongName': 'Coriolis',\n 'ShortName': 'CORIOLIS',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '95.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '65.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '904.0'}],\n 'LongName': 'GPM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'GMI'}],\n 'LongName': 'Global Precipitation '\n 'Measurement Core '\n 'Observatory',\n 'ShortName': 'GPM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/REMSS/mw_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_OI/v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHMWO-4FR05',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=MW_OI-REMSS-L4-GLOB-v5.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Full details of the '\n 'OISST Project',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.remss.com/measurements/sea-surface-temperature/oisst-description',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHMWO-4FR05',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/REMSS/mw_OI/v5.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(SSTfnd)',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'MW_OI-REMSS-L4-GLOB-v5.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1997-12-31T16:00:00.000Z'}]}],\n 'Version': '5.0'}},\n { 'meta': { 'concept-id': 'C1652972817-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+K10_SST+Global+1+meter+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:16Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the Naval '\n 'Oceanographic Office (NAVOCEANO) on a '\n 'global 0.1 degree grid. The K10 L4 sea '\n 'surface temperature analysis uses SST '\n 'observations from the Advanced Very High '\n 'Resolution Radiometer (AVHRR), the '\n 'Advanced Microwave Scanning Radiometer '\n 'for EOS (AMSR-E), and the Geostationary '\n 'Operational Environmental Satellite '\n '(GOES) Imager. The age, reliability, and '\n 'resolution of the data are used in the '\n 'weighted average with the analysis tuned '\n 'to represent SST at 1 meter depth. AVHRR '\n 'Pathfinder 9km climatology is used when '\n 'no new satellite SST retrievals are '\n 'available after 34 days.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Naval '\n 'Oceanographic '\n 'Office, '\n 'Naval '\n 'Oceanographic '\n 'Office, '\n '2008-03-11, '\n 'GHRSST '\n 'Level '\n '4 '\n 'K10_SST '\n 'Global '\n '1 '\n 'meter '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHK10-41N01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHK10-41N01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Naval Oceanographic '\n 'Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '228-688-4859'},\n { 'Type': 'Email',\n 'Value': 'doug.may@navy.mil'}]},\n 'ContactPersons': [ { 'FirstName': 'Doug',\n 'LastName': 'May',\n 'MiddleName': 'none',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Naval Oceanographic '\n 'Office (NAVOCEANO)'}],\n 'DataDates': [ { 'Date': '2008-03-17T18:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 K10_SST Global 1 meter '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:08.267Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental '\n 'Satellite '\n '11-Imager',\n 'ShortName': 'GOES-11 '\n 'Imager'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '11',\n 'ShortName': 'GOES-11',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/NAVO/K10_SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/NAVO/K10_SST',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst-pp.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHK10-41N01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'http://thredds.jpl.nasa.gov/thredds/catalog/ncml_aggregation/OceanTemperature/ghrsst/catalog.html?dataset=ncml_aggregation/OceanTemperature/ghrsst/aggregate__ghrsst_NAVO-L4HR1m-GLOB-K10_SST.ncml',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHK10-41N01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/NAVO/K10_SST/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea '\n 'Surface '\n 'Temperature '\n '1m',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'NAVO-L4HR1m-GLOB-K10_SST',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2008-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1658476026-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Black+Sea+High+Resolution+SST+L4+Analysis+0.0625+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:13Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.0625 deg. x '\n '0.0625 deg. horizontal resolution over '\n 'the Black Sea. The data are obtained from '\n 'infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Black sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Black '\n 'Sea '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.0625 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOHN-4GB20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOHN-4GB20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:50:32.594Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Black Sea High Resolution SST L4 '\n 'Analysis 0.0625 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:10.288Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_HR_NRT-GOS-L4-BLK-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GB20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOHN-4GB20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_HR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_HR_NRT-GOS-L4-BLK-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 42.375,\n 'NorthBoundingCoordinate': 48.812,\n 'SouthBoundingCoordinate': 38.75,\n 'WestBoundingCoordinate': 26.375}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476036-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Mediterranean+Sea+High+Resolution+SST+L4+Analysis+1/16deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:16Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.0625deg. x '\n '0.0625deg. horizontal resolution over the '\n 'Mediterranean Sea. The data are obtained '\n 'from infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Mediterranean sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Mediterranean '\n 'Sea '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '1/16deg '\n 'Resolution, '\n '10.5067/GHOHN-4GM20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOHN-4GM20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:06:51.859Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Mediterranean Sea High Resolution SST '\n 'L4 Analysis 1/16deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:14.375Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Project Homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_HR_NRT-GOS-L4-MED-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GM20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOHN-4GM20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_HR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_HR_NRT-GOS-L4-MED-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 36.25,\n 'NorthBoundingCoordinate': 46.0,\n 'SouthBoundingCoordinate': 30.25,\n 'WestBoundingCoordinate': -18.125}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476046-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Black+Sea+Ultra+High+Resolution+SST+L4+Analysis+0.01+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:20Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.01 deg. x '\n '0.01 deg. horizontal resolution over the '\n 'Black Sea. The data are obtained from '\n 'infra-red measurements collected by '\n 'satellite radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Black sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-06-03, '\n 'Black '\n 'Sea '\n 'Ultra '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.01 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOUN-4GB20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOUN-4GB20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:56:27.961Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Black Sea Ultra High Resolution SST L4 '\n 'Analysis 0.01 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:18.149Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOUN-4GB20',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_UHR_NRT-GOS-L4-BLK-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Project Homepage',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Web site with '\n 'general description',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://www.ncdc.noaa.gov/oa/climate/research/sst/description.php',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOUN-4GB20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/BLACKSEA/GOS/OISST_UHR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_UHR_NRT-GOS-L4-BLK-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 42.375,\n 'NorthBoundingCoordinate': 48.812,\n 'SouthBoundingCoordinate': 38.75,\n 'WestBoundingCoordinate': 26.375}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1658476058-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Mediterranean+Sea+Ultra+High+Resolution+SST+L4+Analysis+0.01+deg+Resolution',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-20T20:39:24Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'CNR MED Sea Surface Temperature provides '\n 'daily gap-free maps (L4) at 0.01 deg. x '\n '0.01deg. horizontal resolution over the '\n 'Mediterranean \\n'\n 'Sea. The data are obtained from infra-red '\n 'measurements collected by satellite '\n 'radiometers and statistical '\n 'interpolation. It is the CMEMS sea '\n 'surface temperature nominal operational '\n 'product for the Mediterranean sea.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n 'Institute '\n 'of '\n 'Atmospheric '\n 'Sciences '\n 'and '\n 'Climate '\n '(CNR '\n '- '\n 'Rome), '\n '2016-05-31, '\n 'Mediterranean '\n 'Sea '\n 'Ultra '\n 'High '\n 'Resolution '\n 'SST '\n 'L4 '\n 'Analysis '\n '0.01 '\n 'deg '\n 'Resolution, '\n '10.5067/GHOUH-4GM20, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOUH-4GM20'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'none'},\n { 'Type': 'Email',\n 'Value': 'cristina.tronconi@artov.isac.cnr.it'}]},\n 'ContactPersons': [ { 'FirstName': 'Cristina',\n 'LastName': 'Tronconi',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Institute of '\n 'Atmospheric Sciences '\n 'and Climate (CNR - '\n 'Rome)'}],\n 'DataDates': [ { 'Date': '2016-04-19T04:32:57.226Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Mediterranean Sea Ultra High Resolution '\n 'SST L4 Analysis 0.01 deg Resolution',\n 'LocationKeywords': [ { 'Category': 'OTHER',\n 'Type': 'Regional'}],\n 'MetadataDates': [ { 'Date': '2019-11-20T20:39:21.884Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.8'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.2'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2330.0'}],\n 'LongName': 'Moderate-Resolution '\n 'Imaging '\n 'Spectroradiometer',\n 'ShortName': 'MODIS'}],\n 'LongName': 'Earth Observing System, '\n 'TERRA',\n 'ShortName': 'Terra',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'http://gosweb.artov.isac.cnr.it/',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOHN-4GM20',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Global Data '\n 'Assembly Center',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OISST_UHR_NRT-GOS-L4-MED-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOUH-4GM20',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/MEDITERRANEAN/GOS/OISST_UHR/v2.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Blended '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'OISST_UHR_NRT-GOS-L4-MED-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 36.25,\n 'NorthBoundingCoordinate': 46.0,\n 'SouthBoundingCoordinate': 30.25,\n 'WestBoundingCoordinate': -18.125}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2007-12-31T19:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1652972902-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSTIA+Global+Foundation+Sea+Surface+Temperature+Analysis+(GDS+version+2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:20Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the UK Met Office '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Operational '\n 'Sea Surface Temperature and Sea Ice '\n 'Analysis (OSTIA) analysis uses satellite '\n 'data from sensors that include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Spinning Enhanced Visible '\n 'and Infrared Imager (SEVIRI), the '\n 'Geostationary Operational Environmental '\n 'Satellite (GOES) imager, the Infrared '\n 'Atmospheric Sounding Interferometer '\n '(IASI), the Tropical Rainfall Measuring '\n 'Mission Microwave Imager (TMI) and in '\n 'situ data from ships, drifting and moored '\n 'buoys. This analysis was specifically '\n 'produced to be used as a lower boundary '\n 'condition in Numerical Weather Prediction '\n '(NWP) models. This dataset adheres to the '\n 'GHRSST Data Processing Specification '\n '(GDS) version 2 format specifications.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'UK '\n 'Met '\n 'Office, '\n 'UK '\n 'Met '\n 'Office, '\n '2012-12-19, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSTIA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n '(GDS '\n 'version '\n '2), '\n '10.5067/GHOST-4FK02, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOST-4FK02'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'UK Met Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': '-9000000000000000'}]},\n 'ContactPersons': [ { 'FirstName': 'Emma',\n 'LastName': 'Fielder',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': 'servicedesk@myocean.eu.org'}]},\n 'ContactPersons': [ { 'FirstName': 'Jonah',\n 'LastName': 'Roberts-Jones',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'}],\n 'DataDates': [ { 'Date': '2013-02-14T01:44:31.886Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:46.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSTIA Global Foundation '\n 'Sea Surface Temperature Analysis (GDS '\n 'version 2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:17.696Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '7000.0'}],\n 'LongName': 'Advanced '\n 'Baseline '\n 'Imager '\n '(ABI)',\n 'ShortName': 'ABI'}],\n 'LongName': 'Geostationary '\n 'Operational '\n 'Environmental Satellite '\n '16',\n 'ShortName': 'GOES-16',\n 'Type': 'Geostationary'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/UKMO/OSTIA/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/UKMO/OSTIA/v2',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOST-4FK02&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=OSTIA-UKMO-L4-GLOB-v2.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOST-4FK02',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/UKMO/OSTIA/v2/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'},\n { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea Ice '\n 'Fraction',\n 'Term': 'Sea Ice',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Ice '\n 'Concentration'}],\n 'ShortName': 'OSTIA-UKMO-L4-GLOB-v2.0',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2013-04-25T00:00:00.000Z'}]}],\n 'Version': '2.0'}},\n { 'meta': { 'concept-id': 'C1653205927-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+RAMSSA_9km+Australian+Regional+Foundation+Sea+Surface+Temperature+Analysis+v1.0+dataset+(GDS2)',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T22:47:03Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis, produced daily on '\n 'an operational basis at the Australian '\n 'Bureau of Meteorology (BoM) using optimal '\n 'interpolation (OI) on a regional 1/12 '\n 'degree grid over the Australian region '\n '(20N - 70S, 60E - 170W). This Regional '\n 'Australian Multi-Sensor SST Analysis '\n '(RAMSSA) v1.0 system blends satellite SST '\n 'observations from passive infrared and '\n 'passive microwave radiometers, with in '\n 'situ data from ships, Argo floats, XBTs, '\n 'CTDs, drifting buoys and moorings from '\n 'the Global Telecommunications System '\n '(GTS). SST observations that have '\n 'experienced recent surface wind speeds '\n 'less than 6 m/s during the day or less '\n 'than 2 m/s during night are rejected from '\n 'the analysis. The processing results in '\n 'daily foundation SST estimates that are '\n 'largely free of nocturnal cooling and '\n 'diurnal warming effects. Sea ice '\n 'concentrations are supplied by the '\n 'NOAA/NCEP 12.7 km sea ice analysis. In '\n 'the absence of observations, the analysis '\n 'relaxes to the BoM Global Weekly 1 degree '\n 'OI SST analysis, which relaxes to the '\n 'Reynolds and Smith (1994) Monthly 1 '\n 'degree SST climatology for 1961 - 1990.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF '\n '4.3',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n 'Australian '\n 'Bureau '\n 'of '\n 'Meteorology, '\n '2019-11-14, '\n 'GHRSST '\n 'Level '\n '4 '\n 'RAMSSA_9km '\n 'Australian '\n 'Regional '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis '\n 'v1.0 '\n 'dataset '\n '(GDS2), '\n '10.5067/GHRAM-4FA1A, '\n 'http://www.bom.gov.au/jshess/docs/2011/beggs_hres.pdf, '\n 'DOI: '\n '10.22499/2.6101.001'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHRAM-4FA1A'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694746'},\n { 'Type': 'Email',\n 'Value': 'ghrsst@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Leon',\n 'LastName': 'Majewski',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+61-3-96694394'},\n { 'Type': 'Email',\n 'Value': 'h.beggs@bom.gov.au'}]},\n 'ContactPersons': [ { 'FirstName': 'Helen',\n 'LastName': 'Beggs',\n 'MiddleName': 'none',\n 'Roles': [ 'Investigator']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Australian Bureau of '\n 'Meteorology'}],\n 'DataDates': [ { 'Date': '2019-09-03T21:16:56.600Z',\n 'Type': 'CREATE'},\n { 'Date': '2019-09-03T21:16:56.600Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 RAMSSA_9km Australian '\n 'Regional Foundation Sea Surface '\n 'Temperature Analysis v1.0 dataset '\n '(GDS2)',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'OCEANIA'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T22:47:00.185Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.19'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer '\n '2',\n 'ShortName': 'AMSR2'}],\n 'LongName': 'Global Change '\n 'Observation Mission 1st '\n '- Water (SHIZUKU)',\n 'ShortName': 'GCOM-W1',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/AUS/ABOM/RAMSSA/v1.0',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'https://www.ghrsst.org/',\n 'URLContentType': 'CollectionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=RAMSSA_09km-ABOM-L4-AUS-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHRAM-4FA1A',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'https://podaac.jpl.nasa.gov/ghrsst',\n 'URLContentType': 'CollectionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHRAM-4FA1A',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/AUS/ABOM/RAMSSA/v1.0/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'EARTH SCIENCE',\n 'DetailedVariable': 'FOUNDATION '\n 'SEA '\n 'SURFACE '\n 'TEMPERATURE',\n 'Term': 'OCEAN TEMPERATURE',\n 'Topic': 'OCEANS',\n 'VariableLevel1': 'SEA SURFACE '\n 'TEMPERATURE'}],\n 'ShortName': 'RAMSSA_09km-ABOM-L4-AUS-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': 60.0},\n { 'EastBoundingCoordinate': -170.0,\n 'NorthBoundingCoordinate': 20.0,\n 'SouthBoundingCoordinate': -70.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2006-06-12T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1655116781-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'NOAA+Smith+and+Reynolds+Extended+Reconstructed+Sea+Surface+Temperature+(ERSST)+Level+4+Monthly+Version+4+Dataset+in+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-10T18:29:41Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '4 of this dataset implements release 2.5 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, v4 '\n 'implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 monthly climatology. The '\n 'version 4 has been improved from previous '\n 'version 3b. Major revisions include '\n 'updated and substantially more complete '\n 'input data from the ICOADS release 2.5, '\n 'revised EOTs and EOT acceptance '\n 'criterion, updated SST quality control '\n 'procedures, revised SST anomaly '\n 'evaluation methods, updated bias '\n 'adjustments of ship SSTs using the Hadley '\n 'Centre Nighttime Marine Air Temperature '\n 'dataset version 2 (HadNMAT2), and buoy '\n 'SST bias adjustment not previously made '\n 'in v3b. The ERSST v4 in netCDF format '\n 'contains extended reconstructed sea '\n 'surface temperature, SST anomaly, and '\n 'associated estimated SST error standard '\n 'deviation fields, incompliance with CF1.6 '\n 'standard metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n \"NOAA's \"\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information '\n '(NCEI), '\n '1981-11-07, '\n 'NOAA '\n 'Smith '\n 'and '\n 'Reynolds '\n 'Extended '\n 'Reconstructed '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(ERSST) '\n 'Level '\n '4 '\n 'Monthly '\n 'Version '\n '4 '\n 'Dataset '\n 'in '\n 'netCDF, '\n '10.5067/ERSST-L4N40, '\n 'https://www1.ncdc.noaa.gov/pub/data/cmb/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/ERSST-L4N40'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEI'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2017-08-15T01:07:30.704Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-08-15T01:07:30.704Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'NOAA Smith and Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 Monthly Version 4 '\n 'Dataset in netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-10T18:29:38.569Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v4/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 4 '\n '(ERSST.v4) Part I. '\n 'Upgrades and '\n 'intercomparisons. '\n 'Journal of Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Huang-2014.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Further Exploring '\n 'and Quantifying '\n 'Uncertainties for '\n 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n '(ERSST) Version 4 '\n '(v4). Journal of '\n 'Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Huang-2015.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 4 '\n '(ERSST.v4) Part II. '\n 'Parametric and '\n 'structural '\n 'uncertainty '\n 'estimations. '\n 'Journal of Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST4_Wei-Liu-2015.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-ERSST-L4N40',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ersst.html?dataset=REYNOLDS_NCDC_L4_MONTHLY_V4',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 4',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/hyrax/allData/ersst/L4/ncei/v4/README',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/ERSST-L4N40',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v4/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_MONTHLY_V4',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '4'}},\n { 'meta': { 'concept-id': 'C1655116806-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'NOAA+Smith+and+Reynolds+Extended+Reconstructed+Sea+Surface+Temperature+(ERSST)+Level+4+Monthly+Version+5+Dataset+in+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-10T18:29:45Z',\n 'revision-id': 3,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '5 of this dataset implements release 3.0 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, v5 '\n 'implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 monthly climatology. The '\n 'version 5 has been improved from previous '\n 'version 4. Major improvements in v5 '\n 'include: 1) Inclusion and use of new '\n 'sources and new versions of input '\n 'datasets, such as data from Argo floats '\n '(new source), ICOADS R3.0 (from R2.5), '\n 'HadISST2 (from HadISST1) sea ice '\n 'concentration, and 2) Improved '\n 'methodologies, such as inclusion of '\n 'additional statistical modes, less '\n 'spatial-temporal smoothing, better '\n 'quality control method, and bias '\n 'correction with baseline to modern buoy '\n 'observations. The new version improves '\n 'the spatial structures and magnitudes of '\n 'El Nino and La Nina events. The ERSST v5 '\n 'in netCDF format contains extended '\n 'reconstructed sea surface temperature, '\n 'SST anomaly, and associated estimated SST '\n 'error standard deviation fields, '\n 'incompliance with CF1.6 standard '\n 'metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n \"NOAA's \"\n 'National '\n 'Centers '\n 'for '\n 'Environmental '\n 'Information '\n '(NCEI), '\n '1981-11-07, '\n 'NOAA '\n 'Smith '\n 'and '\n 'Reynolds '\n 'Extended '\n 'Reconstructed '\n 'Sea '\n 'Surface '\n 'Temperature '\n '(ERSST) '\n 'Level '\n '4 '\n 'Monthly '\n 'Version '\n '5 '\n 'Dataset '\n 'in '\n 'netCDF, '\n '10.5067/ERSST-L4N50, '\n 'https://www1.ncdc.noaa.gov/pub/data/cmb/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/ERSST-L4N50'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEI'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2017-08-15T01:11:29.253Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-08-15T01:11:29.253Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'NOAA Smith and Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 Monthly Version 5 '\n 'Dataset in netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-12-10T18:29:42.498Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v5/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-ERSST-L4N50',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ersst.html?dataset=REYNOLDS_NCDC_L4_MONTHLY_V5',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 5',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/hyrax/allData/ersst/L4/ncei/v5/README',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Extended '\n 'Reconstructed Sea '\n 'Surface Temperature '\n 'version 5 '\n '(ERSSTv5), '\n 'Upgrades, '\n 'validations, and '\n 'intercomparisons. '\n 'J. Climate',\n 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/docs/ERSST5_Huang-2017.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/ERSST-L4N50',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v5/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_MONTHLY_V5',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '5'}},\n { 'meta': { 'concept-id': 'C1652973820-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:36Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies on a 2 degree '\n 'spatial grid from 1854-2009 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '2 of this dataset implements release 2 of '\n 'ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and utilizes '\n 'Empirical Orthogonal Teleconnections '\n '(EOT) in reconstruction analyses to '\n 'estimate both surface temperature and '\n 'associated standard deviation error '\n 'fields. ERSST v2 presents extended '\n 'reconstructed sea surface temperature and '\n 'associated estimated SST error standard '\n 'deviation fields as 2 similarly '\n 'structured ASCII flat files.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '2, '\n '10.5067/REYN2-ERMON, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-ERMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-07-29T20:44:48.306Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:33.606Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v2/monthly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Subtype': 'READ-ME',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-ERMON',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1652973478-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+3b+Ascii',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:28Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies on a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '3b of this dataset implements release 2.4 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, '\n 'v3b implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 month climatology. The ASCII '\n 'text file version of ERSST v3b contains '\n 'extended reconstructed sea surface '\n 'temperature and associated estimated SST '\n 'error standard deviation fields as 2 '\n 'similarly structured ASCII flat files.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'ASCII',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '3b '\n 'Ascii, '\n '10.5067/REY3B-ERMOA, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REY3B-ERMOA'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data '\n 'Center'}],\n 'DataDates': [ { 'Date': '2010-12-01T22:22:37.871Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 3b Ascii',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:25.754Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v3b/monthly/ascii',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Documentation of '\n 'Reynolds Historical '\n 'Reconstructed SST '\n 'version 3b',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs/README.V3b',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REY3B-ERMOA',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V3B_ASC',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '3b'}},\n { 'meta': { 'concept-id': 'C1652973774-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Smith+and+Reynolds+NCDC+Level+4+Historical+Reconstructed+SST+Monthly+Version+3b+netCDF',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:32Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The Smith & Reynolds Extended '\n 'Reconstructed Sea Surface Temperature '\n '(ERSST) Level 4 dataset provides a '\n 'historical reconstruction of monthly '\n 'global ocean surface temperatures and '\n 'temperature anomalies over a 2 degree '\n 'spatial grid since 1854 from in-situ '\n 'observations based on a consistent '\n 'statistical methodology that accounts for '\n 'uneven sampling distributions over time '\n 'and related observational biases. Version '\n '3b of this dataset implements release 2.4 '\n 'of ICOADS (International Comprehensive '\n 'Ocean-Atmosphere Data Set) and is '\n 'supplemented by monthly GTS (Global '\n 'Telecommunications Ship and buoy) system '\n 'data. As for the prior ERSST version, '\n 'v3b implements Empirical Orthogonal '\n 'Teleconnection analysis (EOT) but with an '\n 'improved tuning method for sparsely '\n 'sampled regions and periods. ERSST '\n 'anomalies are computed with respect to a '\n '1971-2000 month climatology. The netCDF '\n 'version of ERSST v3b contains extended '\n 'reconstructed sea surface temperature, '\n 'SST anomaly, and associated estimated SST '\n 'error standard deviation fields in netCDF '\n 'classic format with CF1.0 standard '\n 'metadata.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Smith, '\n 'T., '\n 'Reynolds, '\n 'R., '\n 'National '\n 'Climatic '\n 'Data '\n 'Center '\n '(NCDC), '\n '1981-11-07, '\n 'Smith '\n 'and '\n 'Reynolds '\n 'NCDC '\n 'Level '\n '4 '\n 'Historical '\n 'Reconstructed '\n 'SST '\n 'Monthly '\n 'Version '\n '3b '\n 'netCDF, '\n '10.5067/REY3B-ERMON, '\n 'http://www.ncdc.noaa.gov/ersst/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REY3B-ERMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCDC'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '828-271-4851'},\n { 'Type': 'Email',\n 'Value': 'Boyin.Huang@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Boyin',\n 'LastName': 'Huang',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National '\n 'Climatic Data Center'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-12-01T22:38:30.625Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Smith and Reynolds NCDC Level 4 '\n 'Historical Reconstructed SST Monthly '\n 'Version 3b netCDF',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:29.606Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'International '\n 'Comprehensive '\n 'Ocean-Atmosphere Data '\n 'Set',\n 'ShortName': 'ICOADS',\n 'Type': 'InSitu'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'REYNOLDS_SST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ersst/L4/ncei/v3b/monthly/netcdf',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/R/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/idl/',\n 'URLContentType': 'DistributionURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/matlab/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-REY3B-ERMON',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Description of '\n 'Reynolds '\n 'Re-constructed data '\n 'version 3b.',\n 'Subtype': 'READ-ME',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_er/docs/README.V3b',\n 'URLContentType': 'PublicationURL'},\n { 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers/python/',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REY3B-ERMON',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ersst/L4/ncei/v3b/monthly/netcdf/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature '\n 'Reconstruction'}],\n 'ShortName': 'REYNOLDS_NCDC_L4_SST_HIST_RECON_MONTHLY_V3B_NETCDF',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1854-01-01T00:00:00.000Z'}]}],\n 'Version': '3b'}},\n { 'meta': { 'concept-id': 'C1645281597-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Reynolds+NCEP+Level+4+Optimally+Interpolated+SST+Monthly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-10-29T17:21:13Z',\n 'revision-id': 2,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The NOAA/NCEP Reynolds Optimally '\n 'Interpolated (OI) Sea Surface Temperature '\n 'monthly Level 4 product consists of '\n 'aggregate global sea surface temperature '\n 'fields on a 1 degree by 1 degree grid '\n 'over a month time interval. The OI '\n 'analysis employed uses both in-situ SSTs '\n 'from ships and buoys and satellite '\n 'derived SSTs from the NOAA Advanced Very '\n 'High Resolution Radiometer (AVHRR). The '\n 'satellite derived SSTs are from the '\n 'Multichannel Sea Surface Temperature '\n 'products that have been constructed '\n 'operationally from the five-channel AVHRR '\n \"by NOAA's Environmental Satellite, Data, \"\n 'and Information Service (NESDIS) since '\n 'late 1981 through to present. Monthly OI '\n 'SST fields are derived by a linear '\n 'interpolation of the weekly optimum '\n 'interpolation (OI) fields to daily fields '\n 'then averaging the daily values over a '\n 'month. The monthly fields are in the same '\n 'format and spatial resolution as the '\n 'weekly fields, which have been widely '\n 'used for weather and climate monitoring '\n 'and forecasting. Version 2.0 of this '\n 'dataset utilizes an update and extension '\n 'of the COADS in-situ data series '\n 'providing enhanced ship data coverage '\n 'through 1997 and reducing the residual '\n 'satellite biases in otherwise data sparse '\n 'regions. This version also implements '\n 'enhancements to the OI analysis utilizing '\n 'simulations of SST observations from an '\n 'improved sea ice algorithm and data '\n 'following a technique developed at the UK '\n 'Met Office, improvements that further '\n 'reduce biases in the OI SST particularly '\n 'at higher latitudes.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Reynolds, '\n 'R., '\n 'Stokes, '\n 'D., '\n 'National '\n 'Center '\n 'for '\n 'Environmental '\n 'Prediction '\n '(NCEP), '\n '1981-11-08, '\n 'Reynolds '\n 'NCEP '\n 'Level '\n '4 '\n 'Optimally '\n 'Interpolated '\n 'SST '\n 'Monthly '\n 'Version '\n '2, '\n '10.5067/REYN2-OIMON, '\n 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-OIMON'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEP'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-683-3713'},\n { 'Type': 'Email',\n 'Value': 'Diane.Stokes@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Diane',\n 'LastName': 'Stokes',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National Center '\n 'for Environmental '\n 'Prediction'}],\n 'DataDates': [ { 'Date': '2010-06-07T00:14:34.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Reynolds NCEP Level 4 Optimally '\n 'Interpolated SST Monthly Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-10-29T17:21:10.709Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'POES'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/v2/monthly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'description',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'User Guide',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/oisst.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-OIMON',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'None',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'REYNOLDS_NCEP_L4_SST_OPT_INTERP_MONTHLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-11-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1652973931-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'Reynolds+NCEP+Level+4+Optimally+Interpolated+SST+Weekly+Version+2',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-06T18:11:40Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'The NOAA/NCEP Reynolds Optimally '\n 'Interpolated (OI) Sea Surface Temperature '\n 'weekly Level 4 product consists of '\n 'aggregate 7 day global sea surface '\n 'temperature fields on a 1 degree by 1 '\n 'degree grid. The OI analysis employed '\n 'uses both in-situ SSTs from ships and '\n 'buoys and satellite derived SSTs from the '\n 'NOAA Advanced Very High Resolution '\n 'Radiometer (AVHRR). The satellite derived '\n 'SSTs are from the Multichannel Sea '\n 'Surface Temperature products that have '\n 'been constructed operationally from the '\n \"five-channel AVHRR by NOAA's \"\n 'Environmental Satellite, Data, and '\n 'Information Service (NESDIS) since late '\n '1981 through to present. The weekly '\n 'product has been available since 1993 and '\n 'is widely used for weather and climate '\n 'monitoring and forecasting. Version 2.0 '\n 'of this dataset utilizes an update and '\n 'extension of the COADS in-situ data '\n 'series providing enhanced ship data '\n 'coverage through 1997 and reducing the '\n 'residual satellite biases in otherwise '\n 'data sparse regions. This version also '\n 'implements enhancements to the OI '\n 'analysis utilizing simulations of SST '\n 'observations from an improved sea ice '\n 'algorithm and data following a technique '\n 'developed at the UK Met Office, '\n 'improvements that further reduce biases '\n 'in the OI SST particularly at higher '\n 'latitudes.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'RAW',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Reynolds, '\n 'R., '\n 'Stokes, '\n 'D., '\n 'National '\n 'Center '\n 'for '\n 'Environmental '\n 'Prediction '\n '(NCEP), '\n '1981-11-07, '\n 'Reynolds '\n 'NCEP '\n 'Level '\n '4 '\n 'Optimally '\n 'Interpolated '\n 'SST '\n 'Weekly '\n 'Version '\n '2, '\n '10.5067/REYN2-OIMOW, '\n 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/REYN2-OIMOW'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'NOAA/NCEP'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '301-683-3713'},\n { 'Type': 'Email',\n 'Value': 'Diane.Stokes@noaa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Diane',\n 'LastName': 'Stokes',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'NOAA National Center '\n 'for Environmental '\n 'Prediction'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '(818) '\n '393-7165'},\n { 'Type': 'Email',\n 'Value': 'podaac@podaac.jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'User',\n 'LastName': 'Services',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'}],\n 'DataDates': [ { 'Date': '2010-06-07T00:13:29.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2011-01-21T17:10:13.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'Reynolds NCEP Level 4 Optimally '\n 'Interpolated SST Weekly Version 2',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-06T18:11:37.407Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-11',\n 'ShortName': 'NOAA-11',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-14',\n 'ShortName': 'NOAA-14',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '0.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '0.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'Global Telecommunication '\n 'System Ship and Buoy In '\n 'Situ Observations',\n 'ShortName': 'NCEP GTS',\n 'Type': 'InSitu'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-9',\n 'ShortName': 'NOAA-9',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-20',\n 'ShortName': 'NOAA-20',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-2',\n 'ShortName': 'AVHRR-2'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-7',\n 'ShortName': 'NOAA-7',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'POES'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/v2/weekly',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'description',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'http://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'NCEP Reynolds '\n 'Optimally '\n 'Interpolated SST '\n 'User Guide',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/avhrr/L4/reynolds_oi/docs/oisst.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/REYN2-OIMOW',\n 'URLContentType': 'CollectionURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'None',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'REYNOLDS_NCEP_L4_SST_OPT_INTERP_WEEKLY_V2',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '1981-01-01T00:00:00.000Z'}]}],\n 'Version': '2'}},\n { 'meta': { 'concept-id': 'C1650311566-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+OSTIA+Global+Foundation+Sea+Surface+Temperature+Analysis',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-01T16:27:11Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'A Group for High Resolution Sea Surface '\n 'Temperature (GHRSST) Level 4 sea surface '\n 'temperature analysis produced daily on an '\n 'operational basis at the UK Met Office '\n 'using optimal interpolation (OI) on a '\n 'global 0.054 degree grid. The Operational '\n 'Sea Surface Temperature and Sea Ice '\n 'Analysis (OSTIA) analysis uses satellite '\n 'data from sensors that include the '\n 'Advanced Very High Resolution Radiometer '\n '(AVHRR), the Advanced Along Track '\n 'Scanning Radiometer (AATSR), the Spinning '\n 'Enhanced Visible and Infrared Imager '\n '(SEVIRI), the Advanced Microwave Scanning '\n 'Radiometer-EOS (AMSRE), the Tropical '\n 'Rainfall Measuring Mission Microwave '\n 'Imager (TMI), and in situ data from '\n 'drifting and moored buoys. This analysis '\n 'has a highly smoothed SST field and was '\n 'specifically produced to support SST data '\n 'assimilation into Numerical Weather '\n 'Prediction (NWP) models.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'UK '\n 'Met '\n 'Office, '\n 'UK '\n 'Met '\n 'Office, '\n '2005-12-23, '\n 'GHRSST '\n 'Level '\n '4 '\n 'OSTIA '\n 'Global '\n 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'Analysis, '\n '10.5067/GHOST-4FK01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHOST-4FK01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'UK Met Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '818-393-6710'},\n { 'Type': 'Email',\n 'Value': 'edward.m.armstrong@jpl.nasa.gov'}]},\n 'ContactPersons': [ { 'FirstName': 'Edward',\n 'LastName': 'Armstrong',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'LongName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion Laboratory, '\n 'NASA',\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Physical Oceanography '\n 'Distributed Active '\n 'Archive Center, Jet '\n 'Propulsion '\n 'Laboratory, N'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': '-9000000000000000'}]},\n 'ContactPersons': [ { 'FirstName': 'Emma',\n 'LastName': 'Fielder',\n 'MiddleName': 'null',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': '+44 '\n '1392 '\n '886441'},\n { 'Type': 'Email',\n 'Value': 'servicedesk@myocean.eu.org'}]},\n 'ContactPersons': [ { 'FirstName': 'Jonah',\n 'LastName': 'Roberts-Jones',\n 'MiddleName': 'none',\n 'Roles': [ 'Technical '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'United Kingdom Met '\n 'Office'}],\n 'DataDates': [ { 'Date': '2006-03-03T00:00:00.000Z',\n 'Type': 'CREATE'},\n { 'Date': '2017-04-28T05:01:45.000Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 OSTIA Global Foundation '\n 'Sea Surface Temperature Analysis',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-01T16:27:08.650Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '92.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '35.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '878.0'}],\n 'LongName': 'TRMM '\n 'Microwave '\n 'Imager',\n 'ShortName': 'TMI'}],\n 'LongName': 'Tropical Rainfall '\n 'Measuring Mission',\n 'ShortName': 'TRMM',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.1'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '99.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-16',\n 'ShortName': 'NOAA-16',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.2'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-17',\n 'ShortName': 'NOAA-17',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '98.4'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '1450.0'}],\n 'LongName': 'Advanced '\n 'Microwave '\n 'Scanning '\n 'Radiometer-EOS',\n 'ShortName': 'AMSR-E'}],\n 'LongName': 'Earth Observing System, '\n 'AQUA',\n 'ShortName': 'Aqua',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '102.12'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.74'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer-3',\n 'ShortName': 'AVHRR-3'}],\n 'LongName': 'National Oceanic & '\n 'Atmospheric '\n 'Administration-19',\n 'ShortName': 'NOAA-19',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '-999.0'}],\n 'LongName': 'Ships '\n 'and '\n 'Moored '\n 'and '\n 'Drifting '\n 'Buoys',\n 'ShortName': 'InSitu'}],\n 'LongName': 'InSitu',\n 'ShortName': 'InSitu',\n 'Type': 'instrument'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '100.59'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.55'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '500.0'}],\n 'LongName': 'Advanced '\n 'Along-Track '\n 'Scanning '\n 'Radiometer',\n 'ShortName': 'AATSR'}],\n 'LongName': 'Environmental Satellite',\n 'ShortName': 'ENVISAT',\n 'Type': 'spacecraft'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/L4/GLOB/UKMO/OSTIA',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/L4/GLOB/UKMO/OSTIA',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Type': 'GET DATA',\n 'URL': 'http://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHOST-4FK01&apidoc',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'GHRSST Project '\n 'homepage',\n 'Type': 'PROJECT HOME PAGE',\n 'URL': 'http://www.ghrsst.org',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHOST-4FK01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/L4/GLOB/UKMO/OSTIA/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Foundation '\n 'Sea '\n 'Surface '\n 'Temperature',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'UKMO-L4HRfnd-GLOB-OSTIA',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2006-04-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}},\n { 'meta': { 'concept-id': 'C1653649472-PODAAC',\n 'concept-type': 'collection',\n 'deleted': False,\n 'format': 'application/echo10+xml',\n 'granule-count': 0,\n 'has-formats': False,\n 'has-spatial-subsetting': False,\n 'has-temporal-subsetting': False,\n 'has-transforms': False,\n 'has-variables': False,\n 'native-id': 'GHRSST+Level+4+K10_SST+Global+10+km+Analyzed+Sea+Surface+Temperature+from+Naval+Oceanographic+Office+(NAVO)+in+GDS2.0',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-11-07T19:03:09Z',\n 'revision-id': 1,\n 'user-id': 'cia001'},\n 'umm': { 'Abstract': 'This is a Group for High Resolution Sea '\n 'Surface Temperature (GHRSST) Level 4 sea '\n 'surface temperature (SST) analysis '\n 'dataset produced daily on an operational '\n 'basis by the Naval Oceanographic Office '\n '(NAVO) on a global 0.1x0.1 degree grid. '\n 'The K10 (NAVO 10-km gridded SST analyzed '\n 'product) L4 analysis uses SST '\n 'observations from the following '\n 'instruments: Advanced Very High '\n 'Resolution Radiometer (AVHRR), Visible '\n 'Infrared Imaging Radiometer Suite '\n '(VIIRS), and Spinning Enhanced Visible '\n 'and InfraRed Imager (SEVIRI). The AVHRR '\n 'data for this comes from the MetOp-A, '\n 'MetOp-B, and NOAA-19 satellites; VIIRS '\n 'data is sourced from the Suomi_NPP '\n 'satellite; SEVIRI data comes from the '\n 'Meteosat-8 and -11 satellites. The age '\n '(time-lag), reliability, and resolution '\n 'of the data are used in the weighted '\n 'average with the analysis tuned to '\n 'represent SST at a reference depth of '\n '1-meter. Input data from the AVHRR '\n 'Pathfinder 9km climatology dataset '\n '(1985-1999) is used when no new satellite '\n 'SST retrievals are available after 34 '\n 'days. Comparing with its predecessor '\n '(DOI: https://doi.org/10.5067/GHK10-L4N01 '\n '), this updated dataset has no major '\n 'changes in Level-4 interpolated K10 '\n 'algorithm, except for using different '\n 'satellite instrument data, and updating '\n 'metadata and file format. The major '\n 'updates include: (a) updated and enhanced '\n 'the granule-level metadata information, '\n '(b) converted the SST file from GHRSST '\n 'Data Specification (GDS) v1.0 to v2.0, '\n '(c) added the sea_ice_fraction variable '\n 'to the product, and (d) updated the '\n 'filename convention to reflect compliance '\n 'with GDS v2.0.',\n 'ArchiveAndDistributionInformation': { 'FileDistributionInformation': [ { 'Format': 'NETCDF',\n 'FormatType': 'Native'}]},\n 'CollectionCitations': [ { 'OtherCitationDetails': 'Naval '\n 'Oceanographic '\n 'Office, '\n 'Naval '\n 'Oceanographic '\n 'Office, '\n '2018-12-29, '\n 'GHRSST '\n 'Level '\n '4 '\n 'K10_SST '\n 'Global '\n '10 '\n 'km '\n 'Analyzed '\n 'Sea '\n 'Surface '\n 'Temperature '\n 'from '\n 'Naval '\n 'Oceanographic '\n 'Office '\n '(NAVO) '\n 'in '\n 'GDS2.0, '\n '10.5067/GHK10-L4N01, '\n 'none'}],\n 'CollectionProgress': 'NOT PROVIDED',\n 'DOI': {'DOI': '10.5067/GHK10-L4N01'},\n 'DataCenters': [ { 'Roles': ['PROCESSOR'],\n 'ShortName': 'Naval Oceanographic '\n 'Office'},\n { 'Roles': ['ARCHIVER'],\n 'ShortName': 'NASA/JPL/PODAAC'},\n { 'ContactInformation': { 'ContactMechanisms': [ { 'Type': 'Primary',\n 'Value': 'null'},\n { 'Type': 'Email',\n 'Value': 'daniel.olszewski@navy.mil'}]},\n 'ContactPersons': [ { 'FirstName': 'Daniel',\n 'LastName': 'Olszewski',\n 'MiddleName': 'null',\n 'Roles': [ 'Data '\n 'Center '\n 'Contact']}],\n 'Roles': ['ARCHIVER'],\n 'ShortName': 'Naval Oceanographic '\n 'Office (NAVOCEANO)'}],\n 'DataDates': [ { 'Date': '2018-09-13T00:58:04.861Z',\n 'Type': 'CREATE'},\n { 'Date': '2018-09-13T00:58:04.861Z',\n 'Type': 'UPDATE'}],\n 'EntryTitle': 'GHRSST Level 4 K10_SST Global 10 km '\n 'Analyzed Sea Surface Temperature from '\n 'Naval Oceanographic Office (NAVO) in '\n 'GDS2.0',\n 'LocationKeywords': [ { 'Category': 'GEOGRAPHIC REGION',\n 'Type': 'GLOBAL'}],\n 'MetadataDates': [ { 'Date': '2019-11-07T19:03:07.263Z',\n 'Type': 'UPDATE'}],\n 'Platforms': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 2',\n 'ShortName': 'MSG2',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '-999.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '-999.0'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '11140.0'}],\n 'LongName': 'Spinning '\n 'Enhanced '\n 'Visible '\n 'and '\n 'Infrared '\n 'Imager',\n 'ShortName': 'SEVIRI'}],\n 'LongName': 'Meteosat Second '\n 'Generation 4',\n 'ShortName': 'MSG4',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'A',\n 'ShortName': 'METOP-A',\n 'Type': 'SPACECRAFT'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.0'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '97.1'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '3040.0'}],\n 'LongName': 'Visible '\n 'Infrared '\n 'Imaging '\n 'Radiometer '\n 'Suite',\n 'ShortName': 'VIIRS'}],\n 'LongName': 'Suomi National '\n 'Polar-orbiting '\n 'Partnership',\n 'ShortName': 'SUOMI-NPP',\n 'Type': 'spacecraft'},\n { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Nominal '\n 'period '\n 'of '\n 'a '\n 'spacecraft?s '\n 'single '\n 'revolution '\n 'on '\n 'an '\n 'orbital '\n 'plane.',\n 'Name': 'OrbitPeriod',\n 'Unit': 'Minutes',\n 'Value': '101.3'},\n { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'InclinationAngle',\n 'Unit': 'Degrees',\n 'Value': '98.7'}],\n 'Instruments': [ { 'Characteristics': [ { 'DataType': 'FLOAT',\n 'Description': 'Spacecraft '\n 'angular '\n 'distance '\n 'from '\n 'orbital '\n 'plane '\n 'relative '\n 'to '\n 'the '\n 'Equator.',\n 'Name': 'SwathWidth',\n 'Unit': 'Meters',\n 'Value': '2400.0'}],\n 'LongName': 'Advanced '\n 'Very '\n 'High '\n 'Resolution '\n 'Radiometer',\n 'ShortName': 'AVHRR'}],\n 'LongName': 'Meteorological '\n 'Operational Satellite - '\n 'B',\n 'ShortName': 'METOP-B',\n 'Type': 'SPACECRAFT'}],\n 'ProcessingLevel': {'Id': '4'},\n 'Projects': [{'ShortName': 'GHRSST'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://data.nodc.noaa.gov/ghrsst/GDS2/L4/GLOB/NAVO/K10_SST/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'The HTTP location '\n 'for the collection.',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/v1',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Live Access Server',\n 'Type': 'GOTO WEB TOOL',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/las',\n 'URLContentType': 'DistributionURL'},\n { 'Description': '(Search Granule)',\n 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'application/xml',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac.jpl.nasa.gov/ws/search/granule/?datasetId=PODAAC-GHK10-L4N01',\n 'URLContentType': 'DistributionURL'},\n { 'GetData': { 'Format': 'Not '\n 'provided',\n 'MimeType': 'text/html',\n 'Size': 0.0,\n 'Unit': 'KB'},\n 'Subtype': 'DIRECT DOWNLOAD',\n 'Type': 'GET DATA',\n 'URL': 'https://thredds.jpl.nasa.gov/thredds/catalog_ghrsst_gds2.html?dataset=K10_SST-NAVO-L4-GLOB-v01',\n 'URLContentType': 'DistributionURL'},\n { 'Subtype': 'PUBLICATIONS',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/docs/GMPE_Matthew_2012.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/docs/contents.html',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Documentation on '\n 'the GDS version 2 '\n 'format '\n 'specification',\n 'Subtype': \"USER'S GUIDE\",\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/OceanTemperature/ghrsst/docs/GDS20r5.pdf',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'netCDF generic '\n 'readers',\n 'Type': 'DOWNLOAD SOFTWARE',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/sw/generic_nc_readers',\n 'URLContentType': 'DistributionURL'},\n { 'Description': 'Portal to the '\n 'GHRSST Global Data '\n 'Assembly Center and '\n 'data access',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://ghrsst.jpl.nasa.gov',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Thumbnail image for '\n 'Website',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': '/data/export/web/thumbnails',\n 'URLContentType': 'PublicationURL'},\n { 'Description': 'Access the data set '\n 'landing page for '\n 'the collection.',\n 'Type': 'DATA SET LANDING PAGE',\n 'URL': 'https://doi.org/10.5067/GHK10-L4N01',\n 'URLContentType': 'CollectionURL'},\n { 'Description': 'The OPeNDAP base '\n 'directory location '\n 'for the collection.',\n 'Subtype': 'GENERAL DOCUMENTATION',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/NAVO/K10_SST/v1/',\n 'URLContentType': 'PublicationURL'}],\n 'ScienceKeywords': [ { 'Category': 'Earth Science',\n 'DetailedVariable': 'Sea '\n 'Surface '\n 'Temperature '\n '1m',\n 'Term': 'Ocean Temperature',\n 'Topic': 'Oceans',\n 'VariableLevel1': 'Sea Surface '\n 'Temperature'}],\n 'ShortName': 'K10_SST-NAVO-L4-GLOB-v01',\n 'SpatialExtent': { 'GranuleSpatialRepresentation': 'CARTESIAN',\n 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 180.0,\n 'NorthBoundingCoordinate': 90.0,\n 'SouthBoundingCoordinate': -90.0,\n 'WestBoundingCoordinate': -180.0}],\n 'CoordinateSystem': 'CARTESIAN'},\n 'ResolutionAndCoordinateSystem': { 'GeodeticModel': { 'DenominatorOfFlatteningRatio': 298.2572236,\n 'EllipsoidName': 'WGS '\n '84',\n 'HorizontalDatumName': 'World '\n 'Geodetic '\n 'System '\n '1984',\n 'SemiMajorAxis': 6378137}}},\n 'SpatialCoverageType': 'HORIZONTAL'},\n 'TemporalExtents': [ { 'EndsAtPresentFlag': False,\n 'RangeDateTimes': [ { 'BeginningDateTime': '2018-10-01T00:00:00.000Z'}]}],\n 'Version': '1.0'}}],\n 'took': 92}\n\n\ntemporal=2018-01-01T10:00:00Z,2019-01-01T10:00:00Z&provider_short_name=PODAAC&processing_level_id=4\nwe sepcified a temporal range for all of 2018, PODAAC as the provider, and level 4 data, since it’s a bit easier for us to work with.\nok, that got us down to ~29 collections. Let’s use python to get some information we’re interested in.\n\nfor i in JSON_object[\"items\"]:\n print(i['meta']['concept-id'] + \" \" + i['meta']['native-id'].replace('+',' '))\n #print(\"\\t\"+i['meta']['native-id'].replace('+',' '))\n print(\"\\tBeginning Data Time: \"+str(i['umm']['TemporalExtents'][0]['RangeDateTimes'][0]['BeginningDateTime']))\n \n # Bounding Box Info:\n br_array = i['umm']['SpatialExtent']['HorizontalSpatialDomain']['Geometry']['BoundingRectangles']\n for br in br_array:\n print(\"\\tBounding Rectangle: West: {}, North: {}, East: {}, South: {}\".format(br['WestBoundingCoordinate'], br['NorthBoundingCoordinate'], br['EastBoundingCoordinate'], br['SouthBoundingCoordinate']))\n\n \n \n \n \n\nC1658476070-PODAAC GHRSST Level 4 RAMSSA Australian Regional Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2008-04-01T00:00:00.000Z\n Bounding Rectangle: West: 60.0, North: 20.0, East: 180.0, South: -70.0\n Bounding Rectangle: West: -180.0, North: 20.0, East: -170.0, South: -70.0\nC1657548743-PODAAC GHRSST Level 4 GAMSSA Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2008-08-24T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652971997-PODAAC GHRSST Level 4 AVHRR_OI Global Blended Sea Surface Temperature Analysis (GDS version 2) from NCEI\n Beginning Data Time: 1981-09-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652972273-PODAAC GHRSST Level 4 CMC0.1deg Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2016-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653649473-PODAAC GHRSST Level 4 DMI_OI Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2013-04-30T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653205971-PODAAC GHRSST Level 4 GAMSSA_28km Global Foundation Sea Surface Temperature Analysis v1.0 dataset (GDS2)\n Beginning Data Time: 2008-07-23T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1657544973-PODAAC GHRSST Level 4 OSPO Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2014-06-02T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1657544629-PODAAC GHRSST Level 4 OSPO Global Nighttime Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2014-06-02T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1650311564-PODAAC GHRSST Level 4 G1SST Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2010-06-09T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 80.0, East: 180.0, South: -80.0\nC1664741463-PODAAC GHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1)\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1646568487-PODAAC GHRSST Level 4 MUR 0.25deg Global Foundation Sea Surface Temperature Analysis (v4.2)\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1658476085-PODAAC GHRSST Level 4 MW_IR_OI Global Foundation Sea Surface Temperature analysis version 5.0 from REMSS\n Beginning Data Time: 2002-06-01T00:00:00.000Z\n Bounding Rectangle: West: -179.0, North: 90.0, East: 180.0, South: -90.0\nC1658476097-PODAAC GHRSST Level 4 MW_OI Global Foundation Sea Surface Temperature analysis version 5.0 from REMSS\n Beginning Data Time: 1997-12-31T16:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652972817-PODAAC GHRSST Level 4 K10_SST Global 1 meter Sea Surface Temperature Analysis\n Beginning Data Time: 2008-04-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1658476026-PODAAC Black Sea High Resolution SST L4 Analysis 0.0625 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: 26.375, North: 48.812, East: 42.375, South: 38.75\nC1658476036-PODAAC Mediterranean Sea High Resolution SST L4 Analysis 1/16deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: -18.125, North: 46.0, East: 36.25, South: 30.25\nC1658476046-PODAAC Black Sea Ultra High Resolution SST L4 Analysis 0.01 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: 26.375, North: 48.812, East: 42.375, South: 38.75\nC1658476058-PODAAC Mediterranean Sea Ultra High Resolution SST L4 Analysis 0.01 deg Resolution\n Beginning Data Time: 2007-12-31T19:00:00.000Z\n Bounding Rectangle: West: -18.125, North: 46.0, East: 36.25, South: 30.25\nC1652972902-PODAAC GHRSST Level 4 OSTIA Global Foundation Sea Surface Temperature Analysis (GDS version 2)\n Beginning Data Time: 2013-04-25T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653205927-PODAAC GHRSST Level 4 RAMSSA_9km Australian Regional Foundation Sea Surface Temperature Analysis v1.0 dataset (GDS2)\n Beginning Data Time: 2006-06-12T00:00:00.000Z\n Bounding Rectangle: West: 60.0, North: 20.0, East: 180.0, South: -70.0\n Bounding Rectangle: West: -180.0, North: 20.0, East: -170.0, South: -70.0\nC1655116781-PODAAC NOAA Smith and Reynolds Extended Reconstructed Sea Surface Temperature (ERSST) Level 4 Monthly Version 4 Dataset in netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1655116806-PODAAC NOAA Smith and Reynolds Extended Reconstructed Sea Surface Temperature (ERSST) Level 4 Monthly Version 5 Dataset in netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973820-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 2\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973478-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 3b Ascii\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973774-PODAAC Smith and Reynolds NCDC Level 4 Historical Reconstructed SST Monthly Version 3b netCDF\n Beginning Data Time: 1854-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1645281597-PODAAC Reynolds NCEP Level 4 Optimally Interpolated SST Monthly Version 2\n Beginning Data Time: 1981-11-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1652973931-PODAAC Reynolds NCEP Level 4 Optimally Interpolated SST Weekly Version 2\n Beginning Data Time: 1981-01-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1650311566-PODAAC GHRSST Level 4 OSTIA Global Foundation Sea Surface Temperature Analysis\n Beginning Data Time: 2006-04-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\nC1653649472-PODAAC GHRSST Level 4 K10_SST Global 10 km Analyzed Sea Surface Temperature from Naval Oceanographic Office (NAVO) in GDS2.0\n Beginning Data Time: 2018-10-01T00:00:00.000Z\n Bounding Rectangle: West: -180.0, North: 90.0, East: 180.0, South: -90.0\n\n\nWe now have the start times, CMR Concept-ID (the unique collection identifier), title, and Bounding rectangles for spatial coverage. This is a lot of information we can use to decide on a dataset, and we can keep adding more information.\nFor now, lets choose “C1664741463-PODAAC”: GHRSST Level 4 MUR Global Foundation Sea Surface Temperature Analysis (v4.1)" + }, + { + "objectID": "notebooks/podaac_cmr_tutorial.html#granule-search", + "href": "notebooks/podaac_cmr_tutorial.html#granule-search", + "title": "Introduction to Programmatic Common Metadata Repository Search", + "section": "Granule Search", + "text": "Granule Search\nUsing this collection, and more specifically, its concept-ID, we can now search for data we’re interested in.\n\nwith request.urlopen(cmr_url+\"granules.umm_json?concept-id=C1664741463-PODAAC\") as response:\n data = response.read()\n encoding = response.info().get_content_charset('utf-8')\n JSON_object = json.loads(data.decode(encoding))\n pp = pprint.PrettyPrinter(indent=2)\n pp.pprint(JSON_object)\n\n{ 'hits': 6497,\n 'items': [ { 'meta': { 'concept-id': 'G1664772388-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:29:51Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 332.35974979400635,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:39:29.000Z'},\n 'GranuleUR': '20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:33:18.462Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:29:51.182Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-01T09:00:00.000Z',\n 'EndingDateTime': '2002-06-01T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777267-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:20Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 331.33482456207275,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:35:04.000Z'},\n 'GranuleUR': '20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:31:03.105Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:19.803Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-02T09:00:00.000Z',\n 'EndingDateTime': '2002-06-02T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777275-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:21Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 329.771671295166,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:30:42.000Z'},\n 'GranuleUR': '20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:32:32.948Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:21.251Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-03T09:00:00.000Z',\n 'EndingDateTime': '2002-06-03T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664779141-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:44:55Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.5539598464966,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:26:22.000Z'},\n 'GranuleUR': '20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:35:14.196Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:44:54.615Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-04T09:00:00.000Z',\n 'EndingDateTime': '2002-06-04T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664777247-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:40:17Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 318.64849376678467,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:21:59.000Z'},\n 'GranuleUR': '20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:30:38.111Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:40:17.171Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-05T09:00:00.000Z',\n 'EndingDateTime': '2002-06-05T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664773829-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:33:11Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 310.25645446777344,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:17:42.000Z'},\n 'GranuleUR': '20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:34:35.618Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:33:10.374Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-06T09:00:00.000Z',\n 'EndingDateTime': '2002-06-06T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664774358-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:34:16Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 316.9076223373413,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:13:25.000Z'},\n 'GranuleUR': '20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:26:43.980Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:34:15.270Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-07T09:00:00.000Z',\n 'EndingDateTime': '2002-06-07T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664779133-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:44:54Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.881872177124,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:09:05.000Z'},\n 'GranuleUR': '20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:33:29.406Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:44:53.293Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-08T09:00:00.000Z',\n 'EndingDateTime': '2002-06-08T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664773751-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:33:07Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 328.56553649902344,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:04:43.000Z'},\n 'GranuleUR': '20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:27:35.415Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:33:06.277Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-09T09:00:00.000Z',\n 'EndingDateTime': '2002-06-09T09:00:00.000Z'}}}},\n { 'meta': { 'concept-id': 'G1664774368-PODAAC',\n 'concept-type': 'granule',\n 'format': 'application/echo10+xml',\n 'native-id': '20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'provider-id': 'PODAAC',\n 'revision-date': '2019-12-06T16:34:17Z',\n 'revision-id': 1},\n 'umm': { 'CollectionReference': { 'ShortName': 'MUR-JPL-L4-GLOB-v4.1',\n 'Version': '4.1'},\n 'DataGranule': { 'ArchiveAndDistributionInformation': [ { 'Name': 'Not '\n 'provided',\n 'Size': 327.50969791412354,\n 'SizeUnit': 'MB'}],\n 'DayNightFlag': 'Unspecified',\n 'ProductionDateTime': '2015-08-19T10:00:23.000Z'},\n 'GranuleUR': '20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc',\n 'MetadataSpecification': { 'Name': 'UMM-G',\n 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6',\n 'Version': '1.6'},\n 'OrbitCalculatedSpatialDomains': [{}],\n 'ProviderDates': [ { 'Date': '2015-08-19T19:28:50.109Z',\n 'Type': 'Insert'},\n { 'Date': '2019-12-06T16:34:16.609Z',\n 'Type': 'Update'}],\n 'RelatedUrls': [ { 'Description': 'The HTTP location '\n 'for the granule.',\n 'Type': 'GET DATA',\n 'URL': 'https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'},\n { 'Description': 'The OPENDAP '\n 'location for the '\n 'granule.',\n 'MimeType': 'text/html',\n 'Type': 'VIEW RELATED INFORMATION',\n 'URL': 'https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html'}],\n 'SpatialExtent': { 'HorizontalSpatialDomain': { 'Geometry': { 'BoundingRectangles': [ { 'EastBoundingCoordinate': 58.885,\n 'NorthBoundingCoordinate': 53.855,\n 'SouthBoundingCoordinate': -87.3,\n 'WestBoundingCoordinate': -179.641}]}}},\n 'TemporalExtent': { 'RangeDateTime': { 'BeginningDateTime': '2002-06-10T09:00:00.000Z',\n 'EndingDateTime': '2002-06-10T09:00:00.000Z'}}}}],\n 'took': 36}\n\n\nAlright, 6497 hits (at time of this writing). Let’s once again use some parsing magic to get some information on these data granules.\n\nfor i in JSON_object[\"items\"]:\n print(i['meta']['concept-id'] + \" \" + i['meta']['native-id'].replace('+',' '))\n\n\n dist_info = i['umm']['DataGranule']['ArchiveAndDistributionInformation'][0]\n print(\"\\tGranule Size: \"+\"{:.3f}\".format(dist_info['Size']) + \" \" + str(dist_info['SizeUnit']))\n print(\"\\tBeginning Data Time: \"+str(i['umm']['TemporalExtent']['RangeDateTime']['BeginningDateTime']))\n \n # Bounding Box Info:\n br_array = i['umm']['SpatialExtent']['HorizontalSpatialDomain']['Geometry']['BoundingRectangles']\n for br in br_array:\n print(\"\\tBounding Rectangle: West: {}, North: {}, East: {}, South: {}\".format(br['WestBoundingCoordinate'], br['NorthBoundingCoordinate'], br['EastBoundingCoordinate'], br['SouthBoundingCoordinate']))\n\n related_urls = i['umm']['RelatedUrls']\n for url in related_urls:\n print(\"\\t{} ({})\".format(url[\"URL\"], url['Description']))\n \n \n\nG1664772388-PODAAC 20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 332.360 MB\n Beginning Data Time: 2002-06-01T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/152/20020601090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777267-PODAAC 20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 331.335 MB\n Beginning Data Time: 2002-06-02T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/153/20020602090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777275-PODAAC 20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 329.772 MB\n Beginning Data Time: 2002-06-03T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/154/20020603090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664779141-PODAAC 20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.554 MB\n Beginning Data Time: 2002-06-04T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/155/20020604090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664777247-PODAAC 20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 318.648 MB\n Beginning Data Time: 2002-06-05T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/156/20020605090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664773829-PODAAC 20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 310.256 MB\n Beginning Data Time: 2002-06-06T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/157/20020606090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664774358-PODAAC 20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 316.908 MB\n Beginning Data Time: 2002-06-07T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/158/20020607090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664779133-PODAAC 20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.882 MB\n Beginning Data Time: 2002-06-08T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/159/20020608090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664773751-PODAAC 20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 328.566 MB\n Beginning Data Time: 2002-06-09T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/160/20020609090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\nG1664774368-PODAAC 20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc\n Granule Size: 327.510 MB\n Beginning Data Time: 2002-06-10T09:00:00.000Z\n Bounding Rectangle: West: -179.641, North: 53.855, East: 58.885, South: -87.3\n https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc (The HTTP location for the granule.)\n https://podaac-opendap.jpl.nasa.gov/opendap/allData/ghrsst/data/GDS2/L4/GLOB/JPL/MUR/v4.1/2002/161/20020610090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc.html (The OPENDAP location for the granule.)\n\n\nUsing the above information, we can find the size and location (both whole file and OPeNDAP) URLs." + }, + { + "objectID": "notebooks/PODAAC_Data_Subscriber.html#prerequisites", + "href": "notebooks/PODAAC_Data_Subscriber.html#prerequisites", + "title": "PO.DAAC Data Subscriber", + "section": "Prerequisites", + "text": "Prerequisites\n\nPython3 installed\nEarthdata Login account created" }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#earthdata-login", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#earthdata-login", - "title": "Amazon Estuary Exploration:", - "section": "Earthdata Login", - "text": "Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", - "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" - ] + "objectID": "notebooks/PODAAC_Data_Subscriber.html#install-podaac-data-subscriber", + "href": "notebooks/PODAAC_Data_Subscriber.html#install-podaac-data-subscriber", + "title": "PO.DAAC Data Subscriber", + "section": "1. Install podaac-data-subscriber", + "text": "1. Install podaac-data-subscriber\nInstall podaac-data-subscriber from PyPi. If the PO.DAAC subscriber is not installed, run the following command:\n\n! pip install podaac-data-subscriber\n\nIf the PO.DAAC subscriber is already installed, run the following command to install the latest version (1.14.0)\n\n! pip install podaac-data-subscriber==1.14.0\n\nConfirm installation is successful\n\n! podaac-data-subscriber --version" }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#liquid-water-equivalent-lwe-thickness-grace-grace-fo", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#liquid-water-equivalent-lwe-thickness-grace-grace-fo", - "title": "Amazon Estuary Exploration:", - "section": "Liquid Water Equivalent (LWE) Thickness (GRACE & GRACE-FO)", - "text": "Liquid Water Equivalent (LWE) Thickness (GRACE & GRACE-FO)\n\nSearch for GRACE LWE Thickness data\nSuppose we are interested in LWE data from the dataset (DOI:10.5067/TEMSC-3JC63) described on this PO.DAAC dataset landing page: https://podaac.jpl.nasa.gov/dataset/TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3 From the landing page, we see the dataset Short Name under the Information tab. This is what we will be using to search for the collection with earthaccess.\nYou can also access the short name of the dataset through Earthdata search at: https://search.earthdata.nasa.gov.\n\n#search for the granules using the short name\ngrace_results = earthaccess.search_data(short_name=\"TELLUS_GRAC-GRFO_MASCON_CRI_GRID_RL06.1_V3\")\n\nGranules found: 1\n\n\n\n\nOpen the .nc file in the s3 bucket and load it into an xarray dataset\n\nds_GRACE = xr.open_mfdataset(earthaccess.open([grace_results[0]]), engine='h5netcdf')\nds_GRACE\n\n Opening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lon: 720, lat: 360, time: 219, bounds: 2)\nCoordinates:\n * lon (lon) float64 0.25 0.75 1.25 1.75 ... 358.2 358.8 359.2 359.8\n * lat (lat) float64 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75\n * time (time) datetime64[ns] 2002-04-17T12:00:00 ... 2023-03-16T1...\nDimensions without coordinates: bounds\nData variables:\n lwe_thickness (time, lat, lon) float64 dask.array<chunksize=(219, 360, 720), meta=np.ndarray>\n uncertainty (time, lat, lon) float64 dask.array<chunksize=(219, 360, 720), meta=np.ndarray>\n lat_bounds (lat, bounds) float64 dask.array<chunksize=(360, 2), meta=np.ndarray>\n lon_bounds (lon, bounds) float64 dask.array<chunksize=(720, 2), meta=np.ndarray>\n time_bounds (time, bounds) datetime64[ns] dask.array<chunksize=(219, 2), meta=np.ndarray>\n land_mask (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\n scale_factor (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\n mascon_ID (lat, lon) float64 dask.array<chunksize=(360, 720), meta=np.ndarray>\nAttributes: (12/53)\n Conventions: CF-1.6, ACDD-1.3, ISO 8601\n Metadata_Conventions: Unidata Dataset Discovery v1.0\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadata ...\n title: JPL GRACE and GRACE-FO MASCON RL06.1Mv03 CRI\n summary: Monthly gravity solutions from GRACE and G...\n keywords: Solid Earth, Geodetics/Gravity, Gravity, l...\n ... ...\n C_30_substitution: TN-14; Loomis et al., 2019, Geophys. Res. ...\n user_note_1: The accelerometer on the GRACE-B spacecraf...\n user_note_2: The accelerometer on the GRACE-D spacecraf...\n journal_reference: Watkins, M. M., D. N. Wiese, D.-N. Yuan, C...\n CRI_filter_journal_reference: Wiese, D. N., F. W. Landerer, and M. M. Wa...\n date_created: 2023-05-22T06:05:03Zxarray.DatasetDimensions:lon: 720lat: 360time: 219bounds: 2Coordinates: (3)lon(lon)float640.25 0.75 1.25 ... 359.2 359.8units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :Xvalid_min :0.25valid_max :359.75bounds :lon_boundsarray([2.5000e-01, 7.5000e-01, 1.2500e+00, ..., 3.5875e+02, 3.5925e+02,\n 3.5975e+02])lat(lat)float64-89.75 -89.25 ... 89.25 89.75units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Yvalid_min :-89.75valid_max :89.75bounds :lat_boundsarray([-89.75, -89.25, -88.75, ..., 88.75, 89.25, 89.75])time(time)datetime64[ns]2002-04-17T12:00:00 ... 2023-03-...long_name :timestandard_name :timeaxis :Tbounds :time_boundsarray(['2002-04-17T12:00:00.000000000', '2002-05-10T12:00:00.000000000',\n '2002-08-16T12:00:00.000000000', ..., '2023-01-16T12:00:00.000000000',\n '2023-02-15T00:00:00.000000000', '2023-03-16T12:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (8)lwe_thickness(time, lat, lon)float64dask.array<chunksize=(219, 360, 720), meta=np.ndarray>units :cmlong_name :Liquid_Water_Equivalent_Thicknessstandard_name :Liquid_Water_Equivalent_Thicknessgrid_mapping :WGS84valid_min :-1986.9763606523888valid_max :965.4782725418918comment :Coastline Resolution Improvement (CRI) filter is applied\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n433.08 MiB\n433.08 MiB\n\n\nShape\n(219, 360, 720)\n(219, 360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360 219\n\n\n\n\nuncertainty(time, lat, lon)float64dask.array<chunksize=(219, 360, 720), meta=np.ndarray>units :cmlong_name :uncertaintystandard_name :uncertaintygrid_mapping :WGS84valid_min :0.15854006805783352valid_max :53.34469598560085comment :1-sigma uncertainty: not for each 0.5 degree grid cell, but for each 3-degree mascon estimate\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n433.08 MiB\n433.08 MiB\n\n\nShape\n(219, 360, 720)\n(219, 360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360 219\n\n\n\n\nlat_bounds(lat, bounds)float64dask.array<chunksize=(360, 2), meta=np.ndarray>long_name :latitude boundariesunits :degrees_northcomment :latitude values at the north and south bounds of each pixel\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n5.62 kiB\n5.62 kiB\n\n\nShape\n(360, 2)\n(360, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 360\n\n\n\n\nlon_bounds(lon, bounds)float64dask.array<chunksize=(720, 2), meta=np.ndarray>long_name :longitude boundariesunits :degrees_eastcomment :longitude values at the west and east bounds of each pixel\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n11.25 kiB\n11.25 kiB\n\n\nShape\n(720, 2)\n(720, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 2 720\n\n\n\n\ntime_bounds(time, bounds)datetime64[ns]dask.array<chunksize=(219, 2), meta=np.ndarray>long_name :time boundariescomment :time bounds for each time value, i.e. the first day and last day included in the monthly solution\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.42 kiB\n3.42 kiB\n\n\nShape\n(219, 2)\n(219, 2)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\ndatetime64[ns] numpy.ndarray\n\n\n\n\n 2 219\n\n\n\n\nland_mask(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :binarylong_name :Land_Maskstandard_name :Land_Maskdescription :Land Mask that was used with the CRI filter\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nscale_factor(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :dimensionlesslong_name :Scale_Factor_CRIstandard_name :Scale_Factor_CRIvalid_min :-99999.0valid_max :24.133988467789724description :Gridded scale factors to be used with mascon solution that has the CRI filter applied; based on CLM data from 2002-2009\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nmascon_ID(lat, lon)float64dask.array<chunksize=(360, 720), meta=np.ndarray>units :dimensionlesslong_name :Mascon_Identifierstandard_name :Mascon_IDvalid_min :1valid_max :4551description :Mascon identifier mapped to the grid\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.98 MiB\n1.98 MiB\n\n\nShape\n(360, 720)\n(360, 720)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 720 360\n\n\n\n\nIndexes: (3)lonPandasIndexPandasIndex(Index([ 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4.25,\n 4.75,\n ...\n 355.25, 355.75, 356.25, 356.75, 357.25, 357.75, 358.25, 358.75, 359.25,\n 359.75],\n dtype='float64', name='lon', length=720))latPandasIndexPandasIndex(Index([-89.75, -89.25, -88.75, -88.25, -87.75, -87.25, -86.75, -86.25, -85.75,\n -85.25,\n ...\n 85.25, 85.75, 86.25, 86.75, 87.25, 87.75, 88.25, 88.75, 89.25,\n 89.75],\n dtype='float64', name='lat', length=360))timePandasIndexPandasIndex(DatetimeIndex(['2002-04-17 12:00:00', '2002-05-10 12:00:00',\n '2002-08-16 12:00:00', '2002-09-16 00:00:00',\n '2002-10-16 12:00:00', '2002-11-16 00:00:00',\n '2002-12-16 12:00:00', '2003-01-16 12:00:00',\n '2003-02-15 00:00:00', '2003-03-16 12:00:00',\n ...\n '2022-06-16 00:00:00', '2022-07-16 12:00:00',\n '2022-08-16 12:00:00', '2022-09-16 00:00:00',\n '2022-10-16 12:00:00', '2022-11-16 00:00:00',\n '2022-12-16 12:00:00', '2023-01-16 12:00:00',\n '2023-02-15 00:00:00', '2023-03-16 12:00:00'],\n dtype='datetime64[ns]', name='time', length=219, freq=None))Attributes: (53)Conventions :CF-1.6, ACDD-1.3, ISO 8601Metadata_Conventions :Unidata Dataset Discovery v1.0standard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Convention-1.6title :JPL GRACE and GRACE-FO MASCON RL06.1Mv03 CRIsummary :Monthly gravity solutions from GRACE and GRACE-FO as determined from the JPL RL06.1Mv03 mascon solution - with CRI filter appliedkeywords :Solid Earth, Geodetics/Gravity, Gravity, liquid_water_equivalent_thicknesskeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsplatform :GRACE and GRACE-FOinstitution :NASA/JPLcreator_name :David Wiesecreator_email :grace@podaac.jpl.nasa.govcreator_url :https://grace.jpl.nasa.govcreator_type :groupcreator_institution :NASA/JPLpublisher_name :Physical Oceanography Distributed Active Archive Centerpublisher_email :podaac@jpl.nasa.govpublisher_url :https://podaac.jpl.nasa.govpublisher_type :grouppublisher_institution :NASA/JPLproject :NASA Gravity Recovery and Climate Experiment (GRACE) and NASA Gravity Recovery and Climate Experiment Follow-On (GRACE-FO)program :NASA Earth Science System Pathfinder and NASA Earth Systematic Missions Programid :10.5067/TEMSC-3JC62naming_authority :org.doi.dxsource :GRACE and GRACE-FO JPL RL06.1Mv03-CRIprocessing_level :2 and 3acknowledgement :GRACE is a joint mission of NASA (USA) and DLR (Germany). GRACE-FO is a joint mission of NASA (USA) and the German Research Center for Geosciences (GFZ). Use the digital object identifier provided in the id attribute when citing this data. See https://podaac.jpl.nasa.gov/CitingPODAAClicense :https://science.nasa.gov/earth-science/earth-science-data/data-information-policyproduct_version :v3.0time_epoch :2002-01-01T00:00:00Ztime_coverage_start :2002-04-16T00:00:00Ztime_coverage_end :2023-03-16T23:59:59Zgeospatial_lat_min :-89.75geospatial_lat_max :89.75geospatial_lat_units :degrees_northgeospatial_lat_resolution :0.5 degree grid; however the native resolution of the data is 3-degree equal-area masconsgeospatial_lon_min :0.25geospatial_lon_max :359.75geospatial_lon_units :degrees_eastgeospatial_lon_resolution :0.5 degree grid; however the native resolution of the data is 3-degree equal-area masconstime_mean_removed :2004.000 to 2009.999months_missing :2002-06;2002-07;2003-06;2011-01;2011-06;2012-05;2012-10;2013-03;2013-08;2013-09;2014-02;2014-07;2014-12;2015-06;2015-10;2015-11;2016-04;2016-09;2016-10;2017-02;2017-07;2017-08;2017-09;2017-10;2017-11;2017-12;2018-01;2018-02;2018-03;2018-04;2018-05;2018-08-2018-09postprocess_1 : OCEAN_ATMOSPHERE_DEALIAS_MODEL (GAD), MONTHLY_AVE, ADDED BACK TO OCEAN PIXELS ONLYpostprocess_2 :Water density used to convert to equivalent water height: 1000 kg/m^3postprocess_3 :Coastline Resolution Improvement (CRI) filter has been applied to separate land/ocean mass within mascons that span coastlinesGIA_removed :ICE6G-D; Peltier, W. R., D. F. Argus, and R. Drummond (2018) Comment on the paper by Purcell et al. 2016 entitled An assessment of ICE-6G_C (VM5a) glacial isostatic adjustment model, J. Geophys. Res. Solid Earth, 122.geocenter_correction :We use a version of TN-13 based on the JPL masconsC_20_substitution :TN-14; Loomis et al., 2019, Geophys. Res. Lett., doi:10.1029/2019GL082929C_30_substitution :TN-14; Loomis et al., 2019, Geophys. Res. Lett., doi:10.1029/2019GL082929. This substitution is made for all months after August 2016.user_note_1 :The accelerometer on the GRACE-B spacecraft was turned off after August 2016. After this date, the accelerometer on GRACE-A was used to derive the non-gravitational accelerations acting on GRACE-B using a transplant procedure. This has led to a subsequent degradation in the quality of the gravity fields derived. The uncertainties in this file have been scaled to accomodate this degradation.user_note_2 :The accelerometer on the GRACE-D spacecraft began performing sub-optimally after June 21, 2018. After this date, the accelerometer on GRACE-C is used to derive the non-gravitational accelerations acting on GRACE-D using a transplant procedure. The uncertainties in the file have been scaled to accomodate this degradation using the current best state of knowledge.journal_reference :Watkins, M. M., D. N. Wiese, D.-N. Yuan, C. Boening, and F. W. Landerer (2015) Improved methods for observing Earth's time variable mass distribution with GRACE using spherical cap mascons, J. Geophys. Res., 120, doi:10.1002/2014JB011547. CRI_filter_journal_reference :Wiese, D. N., F. W. Landerer, and M. M. Watkins (2016) Quantifying and reducing leakage errors in the JPL RL05M GRACE mascon solution, Water Resour. Res., 52, doi:10.1002/2016WR019344. date_created :2023-05-22T06:05:03Z\n\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data to plot with hvplot.\n\nlat_bnds, lon_bnds = [-18, 10], [275, 330] #degrees east for longitude\nds_GRACE_subset= ds_GRACE.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_GRACE_subset\n\nds_GRACE_subset.lwe_thickness.hvplot.image(y='lat', x='lon', cmap='bwr_r',).opts(clim=(-80,80))", - "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" - ] + "objectID": "notebooks/PODAAC_Data_Subscriber.html#setup-edl-credentials", + "href": "notebooks/PODAAC_Data_Subscriber.html#setup-edl-credentials", + "title": "PO.DAAC Data Subscriber", + "section": "2. Setup EDL credentials", + "text": "2. Setup EDL credentials\nThe netrc used within the script will allow Python scripts to log into any Earthdata Login without being prompted for credentials every time you run. The netrc file should be placed in your HOME directory. To find the location of your HOME directory\nOn UNIX you can use\necho $HOME\nOn Windows you can use\necho %HOMEDRIVE%%HOMEPATH%\nThe output location from the command above should be the location of the .netrc (_netrc on Windows) file.\nThe format of the netrc file is as follows:\nmachine urs.earthdata.nasa.gov\n login <your username>\n password <your password>\n \nfor example:\nmachine urs.earthdata.nasa.gov\n login podaacUser\n password podaacIsAwesome\nIf the script cannot find the netrc file, you will be prompted to enter the username and password and the script wont be able to generate the CMR token" }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#river-heights-pre-swot-measures", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#river-heights-pre-swot-measures", - "title": "Amazon Estuary Exploration:", - "section": "River heights (Pre-SWOT MEaSUREs)", - "text": "River heights (Pre-SWOT MEaSUREs)\nThe shortname for MEaSUREs is ‘PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2’ with the concept ID: C2036882359-POCLOUD. The guidebook explains the details of the Pre-SWOT MEaSUREs data.\nOur desired variable is height (meters above EGM2008 geoid) for this exercise, which can be subset by distance and time. Distance represents the distance from the river mouth, in this example, the Amazon estuary. Time is between April 8, 1993 and April 20, 2019.\nTo get the data for the exact area we need, we have set the boundaries of (-74.67188,-4.51279,-51.04688,0.19622) as reflected in our earthaccess data search.\nLet’s again access the netCDF file from an s3 bucket and look at the data structure.\n\n#earthaccess search using our established parameters to only find necessary granules\nMEaSUREs_results = earthaccess.search_data(short_name=\"PRESWOT_HYDRO_GRRATS_L2_DAILY_VIRTUAL_STATION_HEIGHTS_V2\", temporal = (\"1993-04-08\", \"2019-04-20\"), bounding_box=(-74.67188,-4.51279,-51.04688,0.19622))\n\nGranules found: 1\n\n\n\nds_MEaSUREs = xr.open_mfdataset(earthaccess.open([MEaSUREs_results[0]]), engine='h5netcdf')\nds_MEaSUREs\n\n Opening 1 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (X: 3311, Y: 3311, distance: 3311, time: 9469,\n charlength: 26)\nCoordinates:\n * time (time) datetime64[ns] 1993-04-08T15:20:40.665117184 ...\nDimensions without coordinates: X, Y, distance, charlength\nData variables:\n lon (X) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n lat (Y) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n FD (distance) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n height (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\n sat (charlength, time) |S1 dask.array<chunksize=(26, 9469), meta=np.ndarray>\n storage (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\n IceFlag (time) float64 dask.array<chunksize=(9469,), meta=np.ndarray>\n LakeFlag (distance) float64 dask.array<chunksize=(3311,), meta=np.ndarray>\n Storage_uncertainty (distance, time) float64 dask.array<chunksize=(3311, 9469), meta=np.ndarray>\nAttributes: (12/40)\n title: GRRATS (Global River Radar Altimetry Time ...\n Conventions: CF-1.6, ACDD-1.3\n institution: Ohio State University, School of Earth Sci...\n source: MEaSUREs OSU Storage toolbox 2018\n keywords: EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURF...\n keywords_vocabulary: Global Change Master Directory (GCMD)\n ... ...\n geospatial_lat_max: -0.6550700975069503\n geospatial_lat_units: degree_north\n geospatial_vertical_max: 92.7681246287056\n geospatial_vertical_min: -3.5634095181633763\n geospatial_vertical_units: m\n geospatial_vertical_positive: upxarray.DatasetDimensions:X: 3311Y: 3311distance: 3311time: 9469charlength: 26Coordinates: (1)time(time)datetime64[ns]1993-04-08T15:20:40.665117184 .....long_name :timestandard_name :timeaxis :Tarray(['1993-04-08T15:20:40.665117184', '1993-04-09T15:20:40.665117184',\n '1993-04-10T15:20:40.665117184', ..., '2019-04-18T03:39:13.243964928',\n '2019-04-19T03:39:13.243964928', '2019-04-20T03:39:13.243964928'],\n dtype='datetime64[ns]')Data variables: (9)lon(X)float64dask.array<chunksize=(3311,), meta=np.ndarray>units :degrees_eastlong_name :longitudestandard_name :longitudeaxis :X\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nlat(Y)float64dask.array<chunksize=(3311,), meta=np.ndarray>units :degrees_northlong_name :latitudestandard_name :latitudeaxis :Y\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nFD(distance)float64dask.array<chunksize=(3311,), meta=np.ndarray>long_name :distance_from_river_mouthunits :kmcomment :This is the distance along the river centerline from the river mouth to this VS.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nheight(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :mpositive :uplong_name :interpolated_heightsstandard_name :heightvalid_min :-3.5634095181633763valid_max :92.7681246287056comment :A time flow distance grid of river water heights with respect to the EGM08 Geoid).-9999 fill values are for missing data, while -9995 fill values are for lakes and reservoirs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nsat(charlength, time)|S1dask.array<chunksize=(26, 9469), meta=np.ndarray>long_name :satellitecomment :The satellite the measurement is derived from.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n240.42 kiB\n240.42 kiB\n\n\nShape\n(26, 9469)\n(26, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\n|S1 numpy.ndarray\n\n\n\n\n 9469 26\n\n\n\n\nstorage(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :km3positive :uplong_name :river_channel_storagecomment :A time flow distance grid of river channel storage values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nIceFlag(time)float64dask.array<chunksize=(9469,), meta=np.ndarray>long_name :Ice_Flagvalid_range :0, 1flag_masks :1flag_meaning :Time of ice covercomment : This is a flag for masking out times of Ice Cover.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n73.98 kiB\n73.98 kiB\n\n\nShape\n(9469,)\n(9469,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 1\n\n\n\n\nLakeFlag(distance)float64dask.array<chunksize=(3311,), meta=np.ndarray>long_name :Lake_Flagvalid_range :0, 1flag_masks :1flag_meaning :River sections that are lakes or reservoirscomment : This is a flag for masking out setions that are lakes or reservoirs.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n25.87 kiB\n25.87 kiB\n\n\nShape\n(3311,)\n(3311,)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 3311 1\n\n\n\n\nStorage_uncertainty(distance, time)float64dask.array<chunksize=(3311, 9469), meta=np.ndarray>units :km3positive :uplong_name :river_channel_storage_uncertaintycomment :A time flow distance grid of river channel storage uncertainty values.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n239.20 MiB\n239.20 MiB\n\n\nShape\n(3311, 9469)\n(3311, 9469)\n\n\nDask graph\n1 chunks in 2 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 9469 3311\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(DatetimeIndex(['1993-04-08 15:20:40.665117184',\n '1993-04-09 15:20:40.665117184',\n '1993-04-10 15:20:40.665117184',\n '1993-04-11 15:20:40.665117184',\n '1993-04-12 15:20:40.665117184',\n '1993-04-13 15:20:40.665117184',\n '1993-04-14 15:20:40.665117184',\n '1993-04-15 15:20:40.665117184',\n '1993-04-16 15:20:40.665117184',\n '1993-04-17 15:20:40.665117184',\n ...\n '2019-04-11 03:39:13.243964928',\n '2019-04-12 03:39:13.243964928',\n '2019-04-13 03:39:13.243964928',\n '2019-04-14 03:39:13.243964928',\n '2019-04-15 03:39:13.243964928',\n '2019-04-16 03:39:13.243964928',\n '2019-04-17 03:39:13.243964928',\n '2019-04-18 03:39:13.243964928',\n '2019-04-19 03:39:13.243964928',\n '2019-04-20 03:39:13.243964928'],\n dtype='datetime64[ns]', name='time', length=9469, freq=None))Attributes: (40)title :GRRATS (Global River Radar Altimetry Time Series)1km daily interpolation for the Amazon RiverConventions :CF-1.6, ACDD-1.3institution :Ohio State University, School of Earth Sciencessource :MEaSUREs OSU Storage toolbox 2018keywords :EARTH SCIENCE,TERRESTRIAL HYDROSPHERE,SURFACE WATER,SURFACE WATER PROCESSES/MEASUREMENTS,STAGE HEIGHTkeywords_vocabulary :Global Change Master Directory (GCMD)cdm_data_type :stationcreator_name :Coss,Stevecreator_email :Coss.31@osu.eduproject :MEaSUREs OSUprogram :NASA Earth Science Data Systems (ESDS)publisher_name :PO.DAAC (Physical Oceanography Distributed Active Archive Center)publisher_email :podaac@podaac.jpl.nasa.govpublisher_url :podaac.jpl.nasa.govpublisher_type :Institutionpublisher_institution :PO.DAACprocessing_level :L2doi :10.5067/PSGRA-DA2V2history :This GRRATS product adds data river surface height data from ERS1, ERS2, TOPEX/Poseidon and Jason-3 to expand the temporal coverage of the product. GRRATS1kd includes interpolated daily 1km resolution height measurements as well as river channel storage measurements. platform :ERS-1(L2),ERS-2(L2),TOPEX/POSEIDON(L2), Jason-1(L2),OSTM/Jason-2(L2),Jason-3(L2),Envisat(L2)platform_vocabulary :NASA/GCMD Platform Keywords. Version 8.6instrument :RA(L2),RA-2(L2),ALT(TOPEX)(L2),POSEIDON-2(L2),POSEIDON-3(L2),POSEIDON-3b(L2)instrument_vocabulary :NASA/GCMD Platform Keywords. Version 8.6references :in review :doi.org/10.5194/essd-2019-84id :GRRATS(Global River Radar Altimeter Time Series) 1km/dailysummary :The Global River Radar Altimeter Time Series (GRRATS) 1km/daily interpolations are river heights from ERS1, ERS2, TOPEX/Poseidon OSTM/Jason-2 Envisat and Jason-3 that are interpolated and processed to create a continuous heights for the study over the temporal range of the altimeters used. The purpose of these heights are to provide satellite altimetric river height data in a form that is more recognizable to the observational community and as a way to get users use to using satellite data for river hydrology.time_coverage_resolution :1 daydate_created :2021-06-30T08:03:41time_coverage_start :1992-04-08T15:20:40time_coverage_end :2018-04-20T03:39:13geospatial_lon_min :-73.35433106652545geospatial_lon_max :-51.0426448887506geospatial_lon_units :degree_eastgeospatial_lat_min :-4.3804275867636875geospatial_lat_max :-0.6550700975069503geospatial_lat_units :degree_northgeospatial_vertical_max :92.7681246287056geospatial_vertical_min :-3.5634095181633763geospatial_vertical_units :mgeospatial_vertical_positive :up\n\n\n\nPlot a subset of the data\nPlotting the river distances and associated heights on the map at time t=9069 (March 16, 2018) using plt.\n\nfig = plt.figure(figsize=[11,7]) \nax = plt.axes(projection=ccrs.PlateCarree())\nax.coastlines()\nax.set_extent([-85, -30, -20, 20])\nax.add_feature(cartopy.feature.RIVERS)\n\nplt.scatter(ds_MEaSUREs.lon, ds_MEaSUREs.lat, lw=1, c=ds_MEaSUREs.height[:,9069])\nplt.colorbar(label='Interpolated River Heights (m)')\nplt.clim(-10,100)\n\nplt.show()", - "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" - ] + "objectID": "notebooks/PODAAC_Data_Subscriber.html#data-downloader", + "href": "notebooks/PODAAC_Data_Subscriber.html#data-downloader", + "title": "PO.DAAC Data Subscriber", + "section": "3. Data Downloader", + "text": "3. Data Downloader\nThe PO.DAAC Data downloader is a python-based tool for bulk and one-off (or non-often) downloading of data from the PO.DAAC archive\nTo see the run options for the downloader, use the --help flag:\n\n! podaac-data-downloader --help\n\nDownload SWOT data between dates. The --dry-run flag can be used to preview the files that will be downloaded.\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-08T00:00:00Z -d ./data/SWOT_L2_NALT_IGDR_1.0 --dry-run \n\nIf we exclude the –dry-run flag, the data will actually be downloaded to the local machine:\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-06T00:00:00Z -d ./data/SWOT_L2_NALT_IGDR_1.0\n\nDownload granules that match wildcard:\n\n! podaac-data-downloader -c SWOT_L2_NALT_IGDR_1.0 -g \"SWOT_IPR_2PfP001_46*\" -d ./data/SWOT_L2_NALT_IGDR_1.0_wildcard\n\nDownload data in bbox:\n\n! podaac-data-downloader -c MODIS_A-JPL-L2P-v2019.0 -sd 2023-08-05T00:00:00Z -ed 2023-08-06T00:00:00Z -b=\"-180,-90,0,0\" -d ./data/MODIS_A-JPL-L2P-v2019.0\n\nDownload OPERA .tif files:\n\n! podaac-data-downloader -c OPERA_L3_DSWX-HLS_PROVISIONAL_V1 -sd 2023-08-04T00:00:00Z -ed 2023-08-04T00:17:00Z -e .tif -d ./data/OPERA_L3_DSWX-HLS_PROVISIONAL_V1\n\nDownload S6 data by cycle:\n\n! podaac-data-downloader -c JASON_CS_S6A_L2_ALT_HR_RED_OST_NRT_F --cycle 100 --limit 10 -d ./data/JASON_CS_S6A_L2_ALT_HR_RED_OST_NRT_F" }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-salinity-multi-mission-smap-aquarius-smos", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-salinity-multi-mission-smap-aquarius-smos", - "title": "Amazon Estuary Exploration:", - "section": "Sea Surface Salinity (Multi-mission: SMAP, Aquarius, SMOS)", - "text": "Sea Surface Salinity (Multi-mission: SMAP, Aquarius, SMOS)\nThe shortname for this dataset is ‘OISSS_L4_multimission_7day_v1’ with the concept ID: C2095055342-POCLOUD. This dataset contains hundreds of granules, so it would be impractical to search and copy all of the URLs in Earthdata Search. Using the shortname, we can access all the files at once in the cloud (1.1 GB data).\n\nsss_results = earthaccess.search_data(short_name=\"OISSS_L4_multimission_7day_v1\")\n\nGranules found: 998\n\n\nThe following cell may take up to around 10 minutes to run due to the size of the dataset\n\n#this line ignores warnings about large chunk sizes\ndask.config.set(**{'array.slicing.split_large_chunks': False})\n\nds_sss = xr.open_mfdataset(earthaccess.open(sss_results),\n combine='by_coords',\n mask_and_scale=True,\n decode_cf=True,\n chunks='auto',\n engine='h5netcdf')\nds_sss\n\n Opening 998 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 1440, latitude: 720, time: 998)\nCoordinates:\n * longitude (longitude) float32 -179.9 -179.6 ... 179.6 179.9\n * latitude (latitude) float32 -89.88 -89.62 ... 89.62 89.88\n * time (time) datetime64[ns] 2011-08-28 ... 2022-08-02\nData variables:\n sss (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\n sss_empirical_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 962), meta=np.ndarray>\n sss_uncertainty (latitude, longitude, time) float32 dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>\nAttributes: (12/42)\n Conventions: CF-1.8, ACDD-1.3\n standard_name_vocabulary: CF Standard Name Table v27\n Title: Multi-Mission Optimally Interpolated Sea S...\n Short_Name: OISSS_L4_multimission_7d_v1\n Version: V1.0\n Processing_Level: Level 4\n ... ...\n geospatial_lat_resolution: 0.25\n geospatial_lat_units: degrees_north\n geospatial_lon_min: -180.0\n geospatial_lon_max: 180.0\n geospatial_lon_resolution: 0.25\n geospatial_lon_units: degrees_eastxarray.DatasetDimensions:longitude: 1440latitude: 720time: 998Coordinates: (3)longitude(longitude)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudeunits :degrees_eastaxis :Xvalid_min :-180.0valid_max :180.0coverage_content_type :coordinatearray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)latitude(latitude)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudeunits :degrees_northaxis :Yvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)time(time)datetime64[ns]2011-08-28 ... 2022-08-02long_name :center day of a time period over which satellite Level 2 SSS data have been collected for OISSS analysisstandard_name :timeaxis :Tcoverage_content_type :coordinatearray(['2011-08-28T00:00:00.000000000', '2011-09-01T00:00:00.000000000',\n '2011-09-05T00:00:00.000000000', ..., '2022-07-25T00:00:00.000000000',\n '2022-07-29T00:00:00.000000000', '2022-08-02T00:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (3)sss(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :sea surface salinitystandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n150.29 MiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 38)\n\n\nDask graph\n961 chunks in 1939 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nsss_empirical_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 962), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSSunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n3.72 GiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 962)\n\n\nDask graph\n37 chunks in 86 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nsss_uncertainty(latitude, longitude, time)float32dask.array<chunksize=(720, 1440, 1), meta=np.ndarray>long_name :estimated empirical uncertainty of multi-mission OISSSunits :1e-3valid_min :0.0valid_max :45.0add_factor :0.0coordinates :time longitude latududecoverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n3.85 GiB\n150.29 MiB\n\n\nShape\n(720, 1440, 998)\n(720, 1440, 38)\n\n\nDask graph\n961 chunks in 1934 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 998 1440 720\n\n\n\n\nIndexes: (3)longitudePandasIndexPandasIndex(Index([-179.875, -179.625, -179.375, -179.125, -178.875, -178.625, -178.375,\n -178.125, -177.875, -177.625,\n ...\n 177.625, 177.875, 178.125, 178.375, 178.625, 178.875, 179.125,\n 179.375, 179.625, 179.875],\n dtype='float32', name='longitude', length=1440))latitudePandasIndexPandasIndex(Index([-89.875, -89.625, -89.375, -89.125, -88.875, -88.625, -88.375, -88.125,\n -87.875, -87.625,\n ...\n 87.625, 87.875, 88.125, 88.375, 88.625, 88.875, 89.125, 89.375,\n 89.625, 89.875],\n dtype='float32', name='latitude', length=720))timePandasIndexPandasIndex(DatetimeIndex(['2011-08-28', '2011-09-01', '2011-09-05', '2011-09-09',\n '2011-09-13', '2011-09-17', '2011-09-21', '2011-09-25',\n '2011-09-29', '2011-10-03',\n ...\n '2022-06-27', '2022-07-01', '2022-07-05', '2022-07-09',\n '2022-07-13', '2022-07-17', '2022-07-21', '2022-07-25',\n '2022-07-29', '2022-08-02'],\n dtype='datetime64[ns]', name='time', length=998, freq=None))Attributes: (42)Conventions :CF-1.8, ACDD-1.3standard_name_vocabulary :CF Standard Name Table v27Title :Multi-Mission Optimally Interpolated Sea Surface Salinity 7-Day Global Dataset V1.0Short_Name :OISSS_L4_multimission_7d_v1Version :V1.0Processing_Level :Level 4source :Aquarius V5.0 Level 2 SSS; SMAP RSS V4.0 Level 2 SSS_40km; SMOS Level 2 SSS L2OS version 662sourse_of_input_Aquarius_SSS :Aquarius Official Release Level 2 Sea Surface Salinity & Wind Speed Cal Data V5.0. Distributed by PO.DAAC at https://podaac.jpl.nasa.gov/dataset/AQUARIUS_L2_SSS_CAL_V5sourse_of_input_SMAP_SSS :Meissner, T., F. Wentz, A. Manaster, R. Lindsley, 2019. Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 4.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA, Available online at www.remss.com/missions/smap.sourse_of_input_SMOS_SSS :ESA SMOS online dissemination service at https://smos-diss.eo.esa.int/oads/accessplatform :Aquarius/SAC-D, SMAP, SMOSinstrument :Aquarius radiometer, SMAP radiometer, SMOS MIRASCreation_Date :2023-01-16T04:04:41ZCreator_Name :Oleg MelnichenkoCreator_Email :oleg@hawaii.eduCreator_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBProject :NASA Ocean SalinityKeywords :Sea Surface Salinity, SSS, Aquarius, SMAP, Optimum Interpolation, OISSSKeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science KeywordsInstitution :IPRC/SOEST, University of Hawaii, Honolulu, HI; Remote Sensing Systems (RSS), Santa Rosa, CAPublisher_Name :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzPublisher_Email :oleg@hawaii.edu.orgPublisher_URL :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLBDataset_Citation_Authors :Oleg Melnichenko, Peter Hacker, James Potemra, Thomas Meissner, Frank WentzDataset_Citation_Year :2021Dataset_Citation_Product :Aquarius/SMAP Sea Surface Salinity Optimum Interpolation AnalysisTechnical_Notes :http://iprc.soest.hawaii.edu/users/oleg/oisss/GLB/OISSS_Product_Notes.pdfyear_of_observation :2022month_of_observation :3day_of_observation :11time_coverage_start :2022-03-07T12:00:00Ztime_coverage_end :2022-03-15T12:00:00Ztime_coverage_resolution :P7Dcdm_data_type :gridgeospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lat_resolution :0.25geospatial_lat_units :degrees_northgeospatial_lon_min :-180.0geospatial_lon_max :180.0geospatial_lon_resolution :0.25geospatial_lon_units :degrees_east\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data at the outlet of the Amazon to plot at time t=0 (August 28, 2011) with hvplot.\n\nlat_bnds, lon_bnds = [-2, 6], [-52, -44] \nds_sss_subset = ds_sss.sel(latitude=slice(*lat_bnds), longitude=slice(*lon_bnds))\nds_sss_subset\n\nds_sss_subset.sss[:,:,0].hvplot()", - "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" - ] + "objectID": "notebooks/PODAAC_Data_Subscriber.html#data-subscriber", + "href": "notebooks/PODAAC_Data_Subscriber.html#data-subscriber", + "title": "PO.DAAC Data Subscriber", + "section": "3. Data Subscriber", + "text": "3. Data Subscriber\nThe subscriber is useful for users who need to continuously pull the latest data from the PO.DAAC archive. If you repeatedly run the script, you will only download the latest data.\n\n! podaac-data-subscriber -c MODIS_A-JPL-L2P-v2019.0 -sd 2023-08-09T12:00:00Z -d ./data/MODIS_A-JPL-L2P-v2019.0" }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-temperature-modis", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#sea-surface-temperature-modis", - "title": "Amazon Estuary Exploration:", - "section": "Sea Surface Temperature (MODIS)", - "text": "Sea Surface Temperature (MODIS)\nMODIS has SST data that coincides with the period used for SSS, 2011-present (943 MB), and has the short name: “MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0”. Let’s access this in the same method as before.\nGet a list of files so we can open them all at once, creating an xarray dataset using the open_mfdataset() function to “read in” all of the netCDF4 files in one call. MODIS does not have a built-in time variable like SSS, but it is subset by latitude and longitude coordinates. We need to combine the files using the nested format with a created ‘time’ dimension.\n\nmodis_results = earthaccess.search_data(short_name=\"MODIS_AQUA_L3_SST_MID-IR_MONTHLY_9KM_NIGHTTIME_V2019.0\", temporal = (\"2011-01-01\", \"2023-01-01\"))\n\nGranules found: 143\n\n\nMODIS did not come with a time variable, so it needs to be extracted from the file names and added in the file preprocessing so files can be successfully concatenated.\n\n#function for time dimension added to each netCDF file\ndef preprocessing(ds): \n file_name = ds.product_name\n file_date = basename(file_name).split(\"_\")[2][:6]\n file_date_c = datetime.strptime(file_date, \"%Y%m\")\n time_point = [file_date_c]\n ds.coords['time'] = ('time', time_point) #expand the dimensions to include time\n return ds\n\nds_MODIS = xr.open_mfdataset(earthaccess.open(modis_results), combine='by_coords', join='override', mask_and_scale=True, decode_cf=True, chunks='auto',preprocess = preprocessing)\nds_MODIS\n\n Opening 143 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 143, lat: 2160, lon: 4320, rgb: 3, eightbitcolor: 256)\nCoordinates:\n * lat (lat) float32 89.96 89.88 89.79 89.71 ... -89.79 -89.88 -89.96\n * lon (lon) float32 -180.0 -179.9 -179.8 -179.7 ... 179.8 179.9 180.0\n * time (time) datetime64[ns] 2011-01-01 2011-02-01 ... 2023-01-01\nDimensions without coordinates: rgb, eightbitcolor\nData variables:\n sst4 (time, lat, lon) float32 dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>\n qual_sst4 (time, lat, lon) float32 dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>\n palette (time, lon, lat, rgb, eightbitcolor) uint8 dask.array<chunksize=(1, 4320, 2160, 3, 256), meta=np.ndarray>\nAttributes: (12/59)\n product_name: AQUA_MODIS.20110101_20110131.L3m.MO.SST...\n instrument: MODIS\n title: MODISA Level-3 Standard Mapped Image\n project: Ocean Biology Processing Group (NASA/GS...\n platform: Aqua\n temporal_range: month\n ... ...\n publisher_url: https://oceandata.sci.gsfc.nasa.gov\n processing_level: L3 Mapped\n cdm_data_type: grid\n data_bins: 4834400\n data_minimum: -1.635\n data_maximum: 32.06999xarray.DatasetDimensions:time: 143lat: 2160lon: 4320rgb: 3eightbitcolor: 256Coordinates: (3)lat(lat)float3289.96 89.88 89.79 ... -89.88 -89.96long_name :Latitudeunits :degrees_northstandard_name :latitudevalid_min :-90.0valid_max :90.0array([ 89.958336, 89.875 , 89.79167 , ..., -89.791664, -89.87501 ,\n -89.958336], dtype=float32)lon(lon)float32-180.0 -179.9 ... 179.9 180.0long_name :Longitudeunits :degrees_eaststandard_name :longitudevalid_min :-180.0valid_max :180.0array([-179.95833, -179.875 , -179.79166, ..., 179.79167, 179.87502,\n 179.95836], dtype=float32)time(time)datetime64[ns]2011-01-01 ... 2023-01-01array(['2011-01-01T00:00:00.000000000', '2011-02-01T00:00:00.000000000',\n '2011-03-01T00:00:00.000000000', '2011-04-01T00:00:00.000000000',\n '2011-05-01T00:00:00.000000000', '2011-06-01T00:00:00.000000000',\n '2011-07-01T00:00:00.000000000', '2011-08-01T00:00:00.000000000',\n '2011-09-01T00:00:00.000000000', '2011-10-01T00:00:00.000000000',\n '2011-11-01T00:00:00.000000000', '2011-12-01T00:00:00.000000000',\n '2012-01-01T00:00:00.000000000', '2012-02-01T00:00:00.000000000',\n '2012-03-01T00:00:00.000000000', '2012-04-01T00:00:00.000000000',\n '2012-05-01T00:00:00.000000000', '2012-06-01T00:00:00.000000000',\n '2012-07-01T00:00:00.000000000', '2012-08-01T00:00:00.000000000',\n '2012-09-01T00:00:00.000000000', '2012-10-01T00:00:00.000000000',\n '2012-11-01T00:00:00.000000000', '2012-12-01T00:00:00.000000000',\n '2013-01-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',\n '2013-03-01T00:00:00.000000000', '2013-04-01T00:00:00.000000000',\n '2013-05-01T00:00:00.000000000', '2013-06-01T00:00:00.000000000',\n '2013-07-01T00:00:00.000000000', '2013-08-01T00:00:00.000000000',\n '2013-09-01T00:00:00.000000000', '2013-10-01T00:00:00.000000000',\n '2013-11-01T00:00:00.000000000', '2013-12-01T00:00:00.000000000',\n '2014-01-01T00:00:00.000000000', '2014-02-01T00:00:00.000000000',\n '2014-03-01T00:00:00.000000000', '2014-04-01T00:00:00.000000000',\n '2014-05-01T00:00:00.000000000', '2014-06-01T00:00:00.000000000',\n '2014-07-01T00:00:00.000000000', '2014-08-01T00:00:00.000000000',\n '2014-09-01T00:00:00.000000000', '2014-10-01T00:00:00.000000000',\n '2014-11-01T00:00:00.000000000', '2014-12-01T00:00:00.000000000',\n '2015-01-01T00:00:00.000000000', '2015-02-01T00:00:00.000000000',\n '2015-03-01T00:00:00.000000000', '2015-04-01T00:00:00.000000000',\n '2015-05-01T00:00:00.000000000', '2015-06-01T00:00:00.000000000',\n '2015-07-01T00:00:00.000000000', '2015-08-01T00:00:00.000000000',\n '2015-09-01T00:00:00.000000000', '2015-10-01T00:00:00.000000000',\n '2015-11-01T00:00:00.000000000', '2015-12-01T00:00:00.000000000',\n '2016-01-01T00:00:00.000000000', '2016-02-01T00:00:00.000000000',\n '2016-03-01T00:00:00.000000000', '2016-04-01T00:00:00.000000000',\n '2016-05-01T00:00:00.000000000', '2016-06-01T00:00:00.000000000',\n '2016-07-01T00:00:00.000000000', '2016-08-01T00:00:00.000000000',\n '2016-09-01T00:00:00.000000000', '2016-10-01T00:00:00.000000000',\n '2016-11-01T00:00:00.000000000', '2016-12-01T00:00:00.000000000',\n '2017-01-01T00:00:00.000000000', '2017-02-01T00:00:00.000000000',\n '2017-03-01T00:00:00.000000000', '2017-04-01T00:00:00.000000000',\n '2017-05-01T00:00:00.000000000', '2017-06-01T00:00:00.000000000',\n '2017-07-01T00:00:00.000000000', '2017-08-01T00:00:00.000000000',\n '2017-09-01T00:00:00.000000000', '2017-10-01T00:00:00.000000000',\n '2017-11-01T00:00:00.000000000', '2017-12-01T00:00:00.000000000',\n '2018-01-01T00:00:00.000000000', '2018-02-01T00:00:00.000000000',\n '2018-03-01T00:00:00.000000000', '2018-04-01T00:00:00.000000000',\n '2018-05-01T00:00:00.000000000', '2018-06-01T00:00:00.000000000',\n '2018-07-01T00:00:00.000000000', '2018-08-01T00:00:00.000000000',\n '2018-09-01T00:00:00.000000000', '2018-10-01T00:00:00.000000000',\n '2018-11-01T00:00:00.000000000', '2018-12-01T00:00:00.000000000',\n '2019-01-01T00:00:00.000000000', '2019-02-01T00:00:00.000000000',\n '2019-03-01T00:00:00.000000000', '2019-04-01T00:00:00.000000000',\n '2019-05-01T00:00:00.000000000', '2019-06-01T00:00:00.000000000',\n '2019-07-01T00:00:00.000000000', '2019-08-01T00:00:00.000000000',\n '2019-09-01T00:00:00.000000000', '2019-10-01T00:00:00.000000000',\n '2019-11-01T00:00:00.000000000', '2019-12-01T00:00:00.000000000',\n '2020-01-01T00:00:00.000000000', '2020-02-01T00:00:00.000000000',\n '2020-03-01T00:00:00.000000000', '2020-04-01T00:00:00.000000000',\n '2020-05-01T00:00:00.000000000', '2020-06-01T00:00:00.000000000',\n '2020-07-01T00:00:00.000000000', '2020-08-01T00:00:00.000000000',\n '2020-09-01T00:00:00.000000000', '2020-10-01T00:00:00.000000000',\n '2020-11-01T00:00:00.000000000', '2020-12-01T00:00:00.000000000',\n '2021-01-01T00:00:00.000000000', '2021-02-01T00:00:00.000000000',\n '2021-03-01T00:00:00.000000000', '2021-04-01T00:00:00.000000000',\n '2021-05-01T00:00:00.000000000', '2021-06-01T00:00:00.000000000',\n '2021-07-01T00:00:00.000000000', '2021-09-01T00:00:00.000000000',\n '2021-10-01T00:00:00.000000000', '2021-11-01T00:00:00.000000000',\n '2021-12-01T00:00:00.000000000', '2022-01-01T00:00:00.000000000',\n '2022-02-01T00:00:00.000000000', '2022-03-01T00:00:00.000000000',\n '2022-04-01T00:00:00.000000000', '2022-05-01T00:00:00.000000000',\n '2022-06-01T00:00:00.000000000', '2022-07-01T00:00:00.000000000',\n '2022-08-01T00:00:00.000000000', '2022-09-01T00:00:00.000000000',\n '2022-10-01T00:00:00.000000000', '2022-11-01T00:00:00.000000000',\n '2023-01-01T00:00:00.000000000'], dtype='datetime64[ns]')Data variables: (3)sst4(time, lat, lon)float32dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>long_name :4um Sea Surface Temperatureunits :degree_Cstandard_name :sea_surface_temperaturevalid_min :-1000valid_max :10000display_scale :lineardisplay_min :-2.0display_max :45.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.97 GiB\n35.60 MiB\n\n\nShape\n(143, 2160, 4320)\n(1, 2160, 4320)\n\n\nDask graph\n143 chunks in 430 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4320 2160 143\n\n\n\n\nqual_sst4(time, lat, lon)float32dask.array<chunksize=(1, 2160, 4320), meta=np.ndarray>long_name :Quality Levels, Sea Surface Temperaturevalid_min :0valid_max :5\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n4.97 GiB\n35.60 MiB\n\n\nShape\n(143, 2160, 4320)\n(1, 2160, 4320)\n\n\nDask graph\n143 chunks in 430 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 4320 2160 143\n\n\n\n\npalette(time, lon, lat, rgb, eightbitcolor)uint8dask.array<chunksize=(1, 4320, 2160, 3, 256), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n0.93 TiB\n6.67 GiB\n\n\nShape\n(143, 4320, 2160, 3, 256)\n(1, 4320, 2160, 3, 256)\n\n\nDask graph\n143 chunks in 716 graph layers\n\n\nData type\nuint8 numpy.ndarray\n\n\n\n\n 4320 143 256 3 2160\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Index([ 89.95833587646484, 89.875, 89.79167175292969,\n 89.70833587646484, 89.625, 89.54167175292969,\n 89.45833587646484, 89.375, 89.29167175292969,\n 89.20833587646484,\n ...\n -89.20833587646484, -89.29166412353516, -89.37500762939453,\n -89.45833587646484, -89.54166412353516, -89.62500762939453,\n -89.70833587646484, -89.79166412353516, -89.87500762939453,\n -89.95833587646484],\n dtype='float32', name='lat', length=2160))lonPandasIndexPandasIndex(Index([ -179.9583282470703, -179.875, -179.79165649414062,\n -179.7083282470703, -179.625, -179.54165649414062,\n -179.4583282470703, -179.375, -179.29165649414062,\n -179.2083282470703,\n ...\n 179.20835876464844, 179.2916717529297, 179.37501525878906,\n 179.45835876464844, 179.5416717529297, 179.62501525878906,\n 179.70835876464844, 179.7916717529297, 179.87501525878906,\n 179.95835876464844],\n dtype='float32', name='lon', length=4320))timePandasIndexPandasIndex(DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01', '2011-04-01',\n '2011-05-01', '2011-06-01', '2011-07-01', '2011-08-01',\n '2011-09-01', '2011-10-01',\n ...\n '2022-03-01', '2022-04-01', '2022-05-01', '2022-06-01',\n '2022-07-01', '2022-08-01', '2022-09-01', '2022-10-01',\n '2022-11-01', '2023-01-01'],\n dtype='datetime64[ns]', name='time', length=143, freq=None))Attributes: (59)product_name :AQUA_MODIS.20110101_20110131.L3m.MO.SST4.sst4.9km.ncinstrument :MODIStitle :MODISA Level-3 Standard Mapped Imageproject :Ocean Biology Processing Group (NASA/GSFC/OBPG)platform :Aquatemporal_range :monthprocessing_version :R2019.0date_created :2019-12-17T18:28:57.000Zhistory :l3mapgen par=AQUA_MODIS.20110101_20110131.L3m.MO.SST4.sst4.9km.nc.param l2_flag_names :LAND,~HISOLZENtime_coverage_start :2010-12-31T12:10:01.000Ztime_coverage_end :2011-01-31T14:29:59.000Zstart_orbit_number :46065end_orbit_number :46518map_projection :Equidistant Cylindricallatitude_units :degrees_northlongitude_units :degrees_eastnorthernmost_latitude :90.0southernmost_latitude :-90.0westernmost_longitude :-180.0easternmost_longitude :180.0geospatial_lat_max :90.0geospatial_lat_min :-90.0geospatial_lon_max :180.0geospatial_lon_min :-180.0latitude_step :0.083333336longitude_step :0.083333336sw_point_latitude :-89.958336sw_point_longitude :-179.95833spatialResolution :9.28 kmgeospatial_lon_resolution :0.083333336geospatial_lat_resolution :0.083333336geospatial_lat_units :degrees_northgeospatial_lon_units :degrees_eastnumber_of_lines :2160number_of_columns :4320measure :Meansuggested_image_scaling_minimum :-2.0suggested_image_scaling_maximum :45.0suggested_image_scaling_type :LINEARsuggested_image_scaling_applied :No_lastModified :2019-12-17T18:28:57.000ZConventions :CF-1.6 ACDD-1.3institution :NASA Goddard Space Flight Center, Ocean Ecology Laboratory, Ocean Biology Processing Groupstandard_name_vocabulary :CF Standard Name Table v36naming_authority :gov.nasa.gsfc.sci.oceandataid :AQUA_MODIS.20110101_20110131.L3b.MO.SST4.nc/L3/AQUA_MODIS.20110101_20110131.L3b.MO.SST4.nclicense :https://science.nasa.gov/earth-science/earth-science-data/data-information-policy/creator_name :NASA/GSFC/OBPGpublisher_name :NASA/GSFC/OBPGcreator_email :data@oceancolor.gsfc.nasa.govpublisher_email :data@oceancolor.gsfc.nasa.govcreator_url :https://oceandata.sci.gsfc.nasa.govpublisher_url :https://oceandata.sci.gsfc.nasa.govprocessing_level :L3 Mappedcdm_data_type :griddata_bins :4834400data_minimum :-1.635data_maximum :32.06999\n\n\n\nPlot a subset of the data\nUse the function xarray.DataSet.sel to select a subset of the data at the outlet of the Amazon to plot with hvplot.\n\nlat_bnds, lon_bnds = [6,-2], [-52, -44] \nds_MODIS_subset = ds_MODIS.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_MODIS_subset\n\nds_MODIS_subset.sst4.hvplot.image(y='lat', x='lon', cmap='viridis').opts(clim=(22,30))", + "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#prerequisite-steps-set-up-aws-infrastructure", + "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#prerequisite-steps-set-up-aws-infrastructure", + "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", + "section": "Prerequisite Steps: Set up AWS infrastructure", + "text": "Prerequisite Steps: Set up AWS infrastructure\nThis tutorial takes advantage of numerous AWS Services including Lambda, Parameter Store, Elastic Compute Cloud (EC2), Elastic Container Registry (ECR), and Simple Storage Service (S3).\nAfter setting up and deploying all of the services as described in the documentation, this notebook must be run in an EC2 instance to invoke the functions and plot the results.\n\nConnect to EC2 instance to run this notebook\nThis notebook cannot be run on a local computer, as it heavily depends on direct in-cloud access. To run this notebook in AWS, connect to an EC2 instance running in the us-west-2 region, following the instructions in this tutorial. Once you have connected to the EC2 instance, you can clone this repository into that environment, install the required packages, and run this notebook.", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" + "Advanced Cloud", + "AWS Lambda", + "Notebook" ] }, { - "objectID": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#time-series-comparison", - "href": "notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html#time-series-comparison", - "title": "Amazon Estuary Exploration:", - "section": "Time Series Comparison", - "text": "Time Series Comparison\nPlot each dataset for the time period 2011-2019.\nFirst, we need to average all pixels in the subset lat/lon per time for sea surface salinity and sea surface temperature to set up for the graphs.\n\nsss_mean = []\nfor t in np.arange(len(ds_sss_subset.time)):\n sss_mean.append(np.nanmean(ds_sss_subset.sss[:,:,t].values))\n\n#sss_mean\n\n\n#MODIS\nsst_MODIS_mean = []\nfor t in np.arange(len(ds_MODIS_subset.time)):\n sst_MODIS_mean.append(np.nanmean(ds_MODIS_subset.sst4[t,:,:].values))\n \n#sst_MODIS_mean\n\n\nCombined timeseries plot of river height and LWE thickness\nBoth datasets are mapped for the outlet of the Amazon River into the estuary.\n\n#plot river height and land water equivalent thickness\nfig, ax1 = plt.subplots(figsize=[12,7])\n\n#plot river height\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\n\n#plot LWE thickness on secondary axis\nax2 = ax1.twinx()\nax2.plot(ds_GRACE_subset.time[107:179], ds_GRACE_subset.lwe_thickness[107:179,34,69], color = 'darkorange')\n\nax1.set_xlabel('Date')\nax2.set_ylabel('Land Water Equivalent Thickness (cm)', color='darkorange')\nax1.set_ylabel('River Height (m)', color='darkblue')\nax2.legend(['GRACE-FO'], loc='upper right')\nax1.legend(['Pre-SWOT MEaSUREs'], loc='lower right')\n\nplt.title('Amazon Estuary, 2011-2019 Lat, Lon = (-0.7, -50)')\nax1.grid()\nplt.show()\n\n\n\n\n\n\n\n\nLWE thickness captures the seasonality of Pre-SWOT MEaSUREs river heights well, and so LWE thickness can be compared to all other variables as a representative of the seasonality of both measurements for the purpose of this notebook.\n\n\nCombined timeseries plots of salinity and LWE thickness, followed by temperature\n\n#Combined Subplots\nfig = plt.figure(figsize=(10,10))\n\nax1 = fig.add_subplot(211)\nplt.title('Amazon Estuary, 2011-2019')\nax2 = ax1.twinx()\nax3 = plt.subplot(212)\nax4 = ax3.twinx()\n\n#lwe thickness\nax1.plot(ds_GRACE_subset.time[107:179], ds_GRACE_subset.lwe_thickness[107:179,34,69], color = 'darkorange')\nax1.set_ylabel('LWE Thickness (cm)', color='darkorange')\nax1.grid()\n\n#sea surface salinity\nax2.plot(ds_sss_subset.time[0:750], sss_mean[0:750], 'g')\nax2.set_ylabel('SSS (psu)', color='g')\n\n#sea surface temperature\nax3.plot(ds_MODIS_subset.time[7:108], sst_MODIS_mean[7:108], 'darkred')\nax3.set_ylabel('SST (deg C)', color='darkred')\nax3.grid()\n\n#river height at outlet\nds_MEaSUREs.height[16,6689:9469].plot(color='darkblue')\nax4.set_ylabel('River Height (m)', color='darkblue')\n\nText(0, 0.5, 'River Height (m)')\n\n\n\n\n\n\n\n\n\nMeasurements of LWE thickness and SSS follow expected patterns. When lwe thickness is at its lowest, indicating less water is flowing through during the drought, salinity is at its highest. Without high volume of water pouring into the estuary, salinity increases. We can see that temperature is shifted a bit in time from river height as well at the outlet, a relationship that could be further explored.", + "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-1-log-in-to-earthdata", + "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-1-log-in-to-earthdata", + "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", + "section": "Step 1: Log in to Earthdata", + "text": "Step 1: Log in to Earthdata\nWe use the earthaccess Python library to handle Earthdata authentication for the initial query to find the granules of interest.\n\nimport earthaccess\nimport json\nimport boto3\nimport s3fs\nimport xarray as xr\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\n\n\nauth = earthaccess.login()\n\nEARTHDATA_USERNAME and EARTHDATA_PASSWORD are not set in the current environment, try setting them or use a different strategy (netrc, interactive)\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 06/16/2023\nUsing .netrc file for EDL\n\n\n\ngranules = earthaccess.search_data(\n short_name='MUR25-JPL-L4-GLOB-v04.2',\n cloud_hosted=True,\n temporal=(\"2022-01-01\", \"2023-01-01\")\n)\n\nGranules found: 365\n\n\n\ngranule_paths = [g.data_links(access='direct')[0] for g in granules]\n\n\nfor path in granule_paths:\n print(path)\n break\n\ns3://podaac-ops-cumulus-protected/MUR25-JPL-L4-GLOB-v04.2/20220101090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Estuary Example", - "Cloud" + "Advanced Cloud", + "AWS Lambda", + "Notebook" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#accessing-and-visualizing-swot-simulated-datasets", - "href": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#accessing-and-visualizing-swot-simulated-datasets", - "title": "This is an old version of the notebook, see the latest here.", - "section": "Accessing and Visualizing SWOT Simulated Datasets", - "text": "Accessing and Visualizing SWOT Simulated Datasets\n\nRequirement:\nThis tutorial can only be run in an AWS cloud instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via earthaccess python library; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\nLearning Objectives:\n\nAccess all 5 products of SWOT HR sample data (archived in NASA Earthdata Cloud) within the AWS cloud, without downloading to local machine\nVisualize accessed data\n\n\n\nSWOT Simulated Level 2 North America Continent KaRIn High Rate Version 1 Datasets:\n\nRiver Vector Shapefile - SWOT_SIMULATED_NA_CONTINENT_L2_HR_RIVERSP_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2RSP1\n\n\nLake Vector Shapefile - SWOT_SIMULATED_NA_CONTINENT_L2_HR_LAKESP_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2LSP1\n\n\nWater Mask Pixel Cloud NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXC_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2PIX1\n\n\nWater Mask Pixel Cloud Vector Attribute NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXCVEC_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2PXV1\n\n\nRaster NetCDF - SWOT_SIMULATED_NA_CONTINENT_L2_HR_RASTER_V1\n\n\nDOI: https://doi.org/10.5067/KARIN-2RAS1\n\nNotebook Author: Cassie Nickles, NASA PO.DAAC (Aug 2022)\n\n\nLibraries Needed\n\nimport glob\nimport os\nimport requests\nimport s3fs\nimport fiona\nimport netCDF4 as nc\nimport h5netcdf\nimport xarray as xr\nimport pandas as pd\nimport geopandas as gpd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport hvplot.xarray\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\n#auth = earthaccess.login(strategy=\"interactive\", persist=True) #if you do not have a netrc created, this line will do so with your credentials\nauth = earthaccess.login(strategy=\"netrc\")\n\n\nSet up an s3fs session for Direct Access\ns3fs sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information.\n\nfs_s3 = earthaccess.get_s3fs_session(daac='PODAAC', provider='POCLOUD')" - }, - { - "objectID": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#single-file-access", - "href": "notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html#single-file-access", - "title": "This is an old version of the notebook, see the latest here.", - "section": "Single File Access", - "text": "Single File Access\nThe s3 access link can be found using earthaccess data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the ‘Reach’ title in the data link.\nAlternatively, Earthdata Search (see tutorial) can be used to manually search for a single file.\n1. River Vector Shapefiles\n\n#retrieves granule from the day we want\nriver_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_RIVERSP_V1', temporal = ('2022-08-22 19:24:41', '2022-08-22 19:30:37'))\n\n\n#finds the s3 link of the one granule we want (The collection contains both Reaches and Nodes, but here we want only the Reach)\nriver_data_urls = []\nfor g in river_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"Reach\" in l:\n river_data_urls.append(l)\nprint(river_data_urls[0])\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the shp files. If we don’t do this, the alternative would be to download the data to the cloud environment and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nriver_shp_url = f\"zip+{river_data_urls[0]}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp1 = gpd.read_file(river_shp_url) \n\n#view the attribute table\nSWOT_HR_shp1 \n\n\nfig, ax = plt.subplots(figsize=(11,7))\nSWOT_HR_shp1.plot(ax=ax, color='black')\n\n2. Lake Vector Shapefiles\nThe lake vector shapefiles can be accessed in the same way as the river shapefiles above.\n\nlake_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_LAKESP_V1', temporal = ('2022-08-22 19:24:18', '2022-08-22 19:30:50'))\n\n\n#find the s3 link of the desired granule (This collection has three options: Obs, Unassigned, and Prior - we want Obs)\nlake_data_urls = []\nfor g in lake_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"Obs\" in l:\n lake_data_urls.append(l)\nprint(lake_data_urls[0])\n\nThe native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the shp files. If we don’t do this, the alternative would be to download the data to the cloud environment and extract the .zip file there.\n\nfiona_session=fiona.session.AWSSession(\n aws_access_key_id=fs_s3.storage_options[\"key\"],\n aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n aws_session_token=fs_s3.storage_options[\"token\"]\n )\n\n\n# We use the zip+ prefix so fiona knows that we are operating on a zip file\nlake_shp_url = f\"zip+{lake_data_urls[0]}\"\n\nwith fiona.Env(session=fiona_session):\n SWOT_HR_shp2 = gpd.read_file(lake_shp_url) \n\n#view the attribute table\nSWOT_HR_shp2\n\n\nfig, ax = plt.subplots(figsize=(7,12))\nSWOT_HR_shp2.plot(ax=ax, color='black')\n\n3. Water Mask Pixel Cloud NetCDF\nAccessing the remaining files is different than the shp files above. We do not need to unzip the files because they are stored in native netCDF files in the cloud. For the rest of the products, we will open via xarray.\n\nwatermask_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXC_V1', temporal = ('2022-08-22 19:29:00', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\nThe pixel cloud netCDF files are formatted with three groups titled, “pixel cloud”, “tvp”, or “noise” (more detail here). In order to access the coordinates and variables within the file, a group must be specified when calling xarray open_dataset.\n\nds_PIXC = xr.open_mfdataset(earthaccess.open([watermask_results[0]]), group = 'pixel_cloud', engine='h5netcdf')\nds_PIXC\n\n\nplt.scatter(x=ds_PIXC.longitude, y=ds_PIXC.latitude, c=ds_PIXC.height)\nplt.colorbar().set_label('Height (m)')\n\n4. Water Mask Pixel Cloud Vector Attribute NetCDF\n\nvector_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_PIXCVEC_V1', temporal = ('2022-08-22 19:29:00', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\n\nds_PIXCVEC = xr.open_mfdataset(earthaccess.open([vector_results[0]]), decode_cf=False, engine='h5netcdf')\nds_PIXCVEC\n\n\npixcvec_htvals = ds_PIXCVEC.height_vectorproc.compute()\npixcvec_latvals = ds_PIXCVEC.latitude_vectorproc.compute()\npixcvec_lonvals = ds_PIXCVEC.longitude_vectorproc.compute()\n\n#Before plotting, we set all fill values to nan so that the graph shows up better spatially\npixcvec_htvals[pixcvec_htvals > 15000] = np.nan\npixcvec_latvals[pixcvec_latvals > 80] = np.nan\npixcvec_lonvals[pixcvec_lonvals > 180] = np.nan\n\n\nplt.scatter(x=pixcvec_lonvals, y=pixcvec_latvals, c=pixcvec_htvals)\nplt.colorbar().set_label('Height (m)')\n\n5. Raster NetCDF\n\nraster_results = earthaccess.search_data(short_name = 'SWOT_SIMULATED_NA_CONTINENT_L2_HR_RASTER_V1', temporal = ('2022-08-22 19:28:50', '2022-08-22 19:29:11'), point = ('-90', '35'))\n\n\n#this collection has 100m and 250m granules, but we only want 100m\nraster_data = []\nfor g in raster_results:\n for l in earthaccess.results.DataGranule.data_links(g, access='direct'):\n if \"100m\" in l:\n raster_data.append(l)\nprint(raster_data)\n\n\nds_raster = xr.open_mfdataset(earthaccess.open([raster_data[0]], provider = 'POCLOUD'), engine='h5netcdf')\nds_raster\n\nIt’s easy to analyze and plot the data with packages such as hvplot!\n\nds_raster.wse.hvplot.image(y='y', x='x')" - }, - { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#initiate-data-search", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#initiate-data-search", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Initiate Data Search", - "text": "Initiate Data Search\n\nSTAC_URL = 'https://cmr.earthdata.nasa.gov/stac'\nprovider_cat = Client.open(STAC_URL)\ncatalog = Client.open(f'{STAC_URL}/LPCLOUD/')\n#collections = ['HLSL30.v2.0', 'HLSS30.v2.0']\ncollections = ['HLSL30.v2.0']", + "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-2-invoke-the-lambda-function", + "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-2-invoke-the-lambda-function", + "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", + "section": "Step 2: Invoke the Lambda function", + "text": "Step 2: Invoke the Lambda function\nSet up a boto3 session to connect to your AWS instance and invoke the Lambda function\n\nsession = boto3.Session(profile_name='saml-pub')\n\nlambda_client = session.client('lambda', region_name='us-west-2')\n\ns3_results_bucket = \"podaac-sst\"\n\nfor granule in granule_paths:\n lambda_payload = {\"input_granule_s3path\": granule, \"output_granule_s3bucket\": s3_results_bucket, \"prefix\":\"podaac\"}\n\n lambda_client.invoke(\n FunctionName=\"podaac-sst\",\n InvocationType=\"Event\",\n Payload=json.dumps(lambda_payload)\n )", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda", + "Notebook" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#define-date-range-and-region-of-interest", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#define-date-range-and-region-of-interest", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Define Date Range and Region of Interest", - "text": "Define Date Range and Region of Interest\n\ndate_range = \"2021-01/2022-01\"\nroi = {\n \"type\": \"Feature\",\n \"properties\": {},\n \"geometry\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -121.60835266113281,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.49874248613119\n ],\n [\n -121.26983642578124,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.756824261131406\n ],\n [\n -121.60835266113281,\n 39.49874248613119\n ]\n ]\n ]\n }\n }['geometry']\nbase = gv.tile_sources.EsriImagery.opts(width=650, height=500)\nReservoir = gv.Polygons(roi['coordinates']).opts(line_color='yellow', line_width=10, color=None)\nReservoir * base", + "objectID": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-3-plot-results-as-timeseries", + "href": "notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html#step-3-plot-results-as-timeseries", + "title": "Scale Scientific Analysis in the Cloud with AWS Lambda", + "section": "Step 3: Plot results as timeseries", + "text": "Step 3: Plot results as timeseries\nOpen the resulting global mean files in xarray:\n\n# set up the connection to the S3 bucket holding the results\ns3_results = s3fs.S3FileSystem(\n anon=False,\n profile='saml-pub'\n)\n\ns3_files = s3_results.glob(\"s3://\" + s3_results_bucket + \"/MUR25/*\")\n\n\n# iterate through s3 files to create a fileset\nfileset = [s3_results.open(file) for file in s3_files]\n\n\n\n# open all files as an xarray dataset\ndata = xr.open_mfdataset(fileset, combine='by_coords', engine='scipy')\n\n\ndata\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 365)\nCoordinates:\n * time (time) datetime64[ns] 2022-01-01T09:00:00 ... 2023-01-01T09...\nData variables:\n analysed_sst (time) float64 dask.array<chunksize=(1,), meta=np.ndarray>xarray.DatasetDimensions:time: 365Coordinates: (1)time(time)datetime64[ns]2022-01-01T09:00:00 ... 2023-01-...array(['2022-01-01T09:00:00.000000000', '2022-01-02T09:00:00.000000000',\n '2022-01-03T09:00:00.000000000', ..., '2022-12-30T09:00:00.000000000',\n '2022-12-31T09:00:00.000000000', '2023-01-01T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (1)analysed_sst(time)float64dask.array<chunksize=(1,), meta=np.ndarray>description :Area-weighted global mean sea surface temperature calculated using AWS Lambdaunits :celciusdate_created :Jun-06-2023\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.85 kiB\n8 B\n\n\nShape\n(365,)\n(1,)\n\n\nDask graph\n365 chunks in 731 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 365 1\n\n\n\n\nIndexes: (1)timePandasIndexPandasIndex(DatetimeIndex(['2022-01-01 09:00:00', '2022-01-02 09:00:00',\n '2022-01-03 09:00:00', '2022-01-04 09:00:00',\n '2022-01-05 09:00:00', '2022-01-06 09:00:00',\n '2022-01-07 09:00:00', '2022-01-08 09:00:00',\n '2022-01-09 09:00:00', '2022-01-10 09:00:00',\n ...\n '2022-12-23 09:00:00', '2022-12-24 09:00:00',\n '2022-12-25 09:00:00', '2022-12-26 09:00:00',\n '2022-12-27 09:00:00', '2022-12-28 09:00:00',\n '2022-12-29 09:00:00', '2022-12-30 09:00:00',\n '2022-12-31 09:00:00', '2023-01-01 09:00:00'],\n dtype='datetime64[ns]', name='time', length=365, freq=None))Attributes: (0)\n\n\nPlot the data using matplotlib:\n\nmpl.rcParams.update({'font.size': 22})\n\n# set up the figure\nfig = plt.Figure(figsize=(20,5))\n\n# plot the data\nplt.plot(data.time, data.analysed_sst, linewidth='3')\nplt.title('Global Mean Sea Surface Temperature' + '\\n' + '2022, MUR25')\n\nplt.ylabel('degrees C')\nplt.xlabel('Date')\n\nText(0.5, 0, 'Date')", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda", + "Notebook" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#search-for-hls-imagery-matching-search-criteria", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#search-for-hls-imagery-matching-search-criteria", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Search for HLS imagery matching search criteria", - "text": "Search for HLS imagery matching search criteria\n\nsearch = catalog.search(\n collections=collections,\n intersects=roi,\n datetime=date_range,\n limit=100\n)\n\nitem_collection = search.get_all_items()\nsearch.matched()", + "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#scale-scientific-analysis-in-the-cloud-with-aws-lambda", + "href": "notebooks/aws_lambda_sst/docs/documentation.html#scale-scientific-analysis-in-the-cloud-with-aws-lambda", + "title": "AWS Lambda", + "section": "Scale Scientific Analysis in the Cloud with AWS Lambda", + "text": "Scale Scientific Analysis in the Cloud with AWS Lambda\n\nUser Guide for Deploying AWS Services in end-user Amazon accounts\n\n\nIntroduction\n\nAudience\nMotivation\nGlobal Mean Sea Surface Temperature\nCost Estimates\n\n\n\nArchitecture\n\nDiagram\nRepository Structure\n\n\n\nDeployment Instructions\n\nCreate an AWS Account\nDeploy AWS Services\n\nDeploy using Terraform (recommended)\nDeploy using AWS Console (manual setup)\n\nCreate the Lambda function\nTest the Lambda function in the AWS Console\nLaunch an EC2 instance\nClone this repository to the EC2 instance\nLog in to JPL AWS from the EC2 terminal\nRun the Notebook\nModify Lambda function and update Docker Container\n\n\n\nResources\n\nAWS Services\n\nLambda\nIAM\nS3\nSystems Manager Parameter Store\nEC2\nECR\n\n\n\nOther Services\n\nDocker\nTerraform\nJupyter Notebook", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#filter-imagery-for-low-cloud-images-and-identify-image-bands-needed-for-water-classification", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Filter imagery for low cloud images and identify image bands needed for water classification", - "text": "Filter imagery for low cloud images and identify image bands needed for water classification\n\ns30_bands = ['B8A', 'B03'] # S30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \nl30_bands = ['B05', 'B03'] # L30 bands for NDWI calculation and quality filtering -> NIR, GREEN, Quality \ncloudcover = 10\n\n\nndwi_band_links = []\n\nfor i in item_collection:\n if i.properties['eo:cloud_cover'] <= cloudcover:\n if i.collection_id == 'HLSS30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = s30_bands\n elif i.collection_id == 'HLSL30.v2.0':\n #print(i.properties['eo:cloud_cover'])\n ndwi_bands = l30_bands\n\n for a in i.assets:\n if any(b==a for b in ndwi_bands):\n ndwi_band_links.append(i.assets[a].href)\n\n\nndwi_band_links[:10]\n\n\ntile_dicts = defaultdict(list) \n\n\nfor l in ndwi_band_links:\n tile = l.split('.')[-6]\n tile_dicts[tile].append(l)\n\n\ntile_dicts.keys()\n\n\ntile_links = tile_dicts['T10SFJ']\n\n\nbands_dicts = defaultdict(list)\nfor b in tile_links:\n band = b.split('.')[-2]\n bands_dicts[band].append(b)\nfor i in bands_dicts:\n print(i)", + "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#introduction-1", + "href": "notebooks/aws_lambda_sst/docs/documentation.html#introduction-1", + "title": "AWS Lambda", + "section": "Introduction", + "text": "Introduction\n\nAudience\nThis guide is intended for novice cloud users who do not have experience using Amazon Web Services (AWS).\nThis guide assumes intermediate knowledge of the following topics:\n\nRunning python scripts on a server\nFamiliarity with the command line\nJupyter notebooks\n\nThis guide assumes conceptual understanding of the following topics:\n\nOrganizing code into functions\nIdentity management (administering users/roles)\nVirtual machines\n\nUsers who have less experience with these topics may need support from their institution’s IT department to configure these services.\n\n\nMotivation\nPO.DAAC has recently migrated all data products to the NASA Earthdata Amazon Web Services (AWS) Cloud. This move has enabled improvements to PO.DAAC’s internal processes and infrastructure to better scale ingest, archive, publication, and distribution of mission data.\nMoving data to the cloud also opens up new cloud-computing workflows and capabilities for end-users to do scientific research and analysis. However, many end-users continue to download data to analyze locally. This tutorial demonstrates one pathway for using AWS cloud computing services to perform data analysis on large oceanography datasets.\n\n\nGlobal Mean Sea Surface Temperature\nMany scientific workflows begin with reducing the data in some way. Here we calculate the global mean sea surface temperature for the GHRSST Level 4 MUR 0.25deg Global Foundation Sea Surface Temperature Analysis (v4.2) dataset as an example of the type of analysis that can be done using AWS Lambda.\n\n\nCost Estimates\nAWS provides a calculator to estimate the cost of running using cloud services. Using the cost estimator, running this tutorial one time as-configured to create a one year time series may result in a charge of $0.72 USD.\nScaling up to create a 10-year time series one time would increase the cost to $7.22 USD.\nRunning a seasonal analysis where you create a time series of the past 3 months, and repeat every month, is estimated to cost $0.18 USD per month, or $2.16 USD per year.\nNote that costs will vary depending on the services you set up and how often you run them.\nThe AWS Free Tier includes access to a number of services for free/trial usage, but it works by charging you when you exceed the allotted free resources, rather than stopping services and access after the free credits have been used. This makes it relatively common to be charged for unexpected usage costs. Students especially are urged to work with an organizational AWS account where guardrails and costs are covered by the institution.\nAWS has guides on avoiding unexpected charges, and tracking your free tier usage.\nPO.DAAC is not liable for any costs incurred by users running this tutorial.", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#download-identified-images-to-local-computer", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#download-identified-images-to-local-computer", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Download identified images to local computer", - "text": "Download identified images to local computer\n\nos.makedirs(\"downloads\", exist_ok=True)\n\n\ndef download(url: str, fname: str):\n resp = requests.get(url, stream=True)\n total = int(resp.headers.get('content-length', 0))\n with open(fname, 'wb') as file, tqdm(\n desc=fname,\n ncols=110,\n total=total,\n unit='iB',\n unit_scale=True,\n unit_divisor=1024,\n ) as bar:\n for data in resp.iter_content(chunk_size=1024):\n size = file.write(data)\n bar.update(size)\n\n\npath_dicts = defaultdict(list)\nprint('Begin Downloading Imagery')\nstart_time = time.time()\nfor key in bands_dicts:\n url = bands_dicts[key]\n for u in url:\n filename = u.split('/')[-1]\n path = './downloads/' + filename\n download(u,path)\n path_dicts[key].append(path)\nprint('Download Complete')\nprint(\"--- %s seconds ---\" % (time.time() - start_time))", + "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#architecture-1", + "href": "notebooks/aws_lambda_sst/docs/documentation.html#architecture-1", + "title": "AWS Lambda", + "section": "Architecture", + "text": "Architecture\n\nDiagram\nThe architecture diagram in Figure 1 demonstrates how all of the components used in this tutorial fit together.\n\n\n\nFigure - Architecture\n\n\nFigure 1. Deployment architecture for required AWS services and supporting infrastructure.\n\n\nRepository Structure\nThe code files for this tutorial are available on GitHub in the PO.DAAC Tutorials repository under /notebooks/aws_lambda_sst/\nFiles:\nsst.py : the code to be run by AWS Lambda. This gets packaged in a Docker container to be deployed to AWS.\nsst-global-mean-exploratory.ipynb : a notebook that explores the MUR25 dataset and runs through the global mean calculation offline. This notebook can be run locally outside of AWS to trial run the code deployed to Lambda in sst.py\npodaac-lambda-invoke-sst-global-mean.ipynb : the main notebook to invoke the Lambda code. Finds the files in Earthdata cloud, invokes Lambda on each, and plots the results as a timeseries. This notebook must be run from inside an AWS EC2 instance in the us-west-2 region.\nDockerfile : the instructions for Docker to build the container image with to deploy to AWS Lambda\nrequirements.txt : the required python packages to include in the Dockerfile. Note that these may be different than the packages required to run the notebooks\nterraform : terraform deploys AWS infrastructure. This folder contains the terraform configuration files:\n\nterraform.tfvars\nmain.tf\nsst-lambda.tf\nvariables.tf", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#load-images-and-visualize", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#load-images-and-visualize", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Load images and visualize", - "text": "Load images and visualize\n\ndef time_index_from_filenames(file_links):\n return [datetime.strptime(f.split('.')[-5], '%Y%jT%H%M%S') for f in file_links]\n\n\ntime = xr.Variable('time', time_index_from_filenames(path_dicts['B03']))\nchunks=dict(band=1, x=512, y=512)\nhls_ts_da_LB3 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B03']], dim=time)\nhls_ts_da_LB5 = xr.concat([rioxarray.open_rasterio(f, chunks=chunks).squeeze('band', drop=True) for f in path_dicts['B05']], dim=time)\nhls_ts_da_LB3 = hls_ts_da_LB3.rio.reproject(\"epsg:4326\")\nhls_ts_da_LB5 = hls_ts_da_LB5.rio.reproject(\"epsg:4326\")\n\n\nhls_ts_da_data_LB3 = hls_ts_da_LB3.load()\nhls_ts_da_data_LB5 = hls_ts_da_LB5.load()\nhls_ts_da_data_LB3 = hls_ts_da_data_LB3.rio.clip([roi])\nhls_ts_da_data_LB5 = hls_ts_da_data_LB5.rio.clip([roi])\n\n\nhls_ts_da_data_LB5.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='gray').opts(clim=(0,2000))", + "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#deployment-instructions-1", + "href": "notebooks/aws_lambda_sst/docs/documentation.html#deployment-instructions-1", + "title": "AWS Lambda", + "section": "Deployment Instructions", + "text": "Deployment Instructions\n\n1. Create an AWS Account\nIf you are a member of an institution that has an Enterprise AWS Instance, contact your institution to have an account set up. We strongly recommend students use an institutional account to avoid unexpected charges.\nAlternatively, you can also use this tutorial with an AWS Free Tier account. This article describes the steps to create a new AWS account for an individual user.\nSee Cost Estimates for more information on using the AWS Free Tier, tracking usage, and estimating charges.\n\n\n2. Deploy AWS Services\nAWS Services can be set up using Terraform, or via the AWS Console. Using Terraform is recommended as it automates the deployment and makes it easier to reproduce. The AWS Console instructions are useful to better understand what Terraform is configuring in your account.\nStart by installing the AWS Command Line Interface (CLI) on your local system. Note that AWS recommends setting up IAM credentials to run the AWS CLI (see prerequisites). Configure the AWS CLI to set your access keys and session token in the ~/.aws/credentials file, which will be used by Terraform to set up the AWS Services. If you choose to set up a profile, note the name you choose.\n\nA. Deploy using Terraform (recommended)\nTerraform is a program that can automate setting up and managing cloud services.\n\nInstall Terraform on your local system\nFork the https://github.com/podaac/tutorials repository, clone to your local machine. Navigate to /notebooks/aws_lambda_sst/terraform/ in a terminal.\nInitialize Terraform\nEdit terraform.tfvars with the names you want to give the AWS Elastic Container Registry (ecr_repo), the AWS Lambda role (lambda_role), the prefix to use for the Earthdata login parameters, and your user profile if you set one up when configuring the AWS CLI:\n ecr_repo = \"podaac-sst\"\n lambda_role = \"podaac-sst-lambda-role\"\n prefix = \"podaac\"\n profile = \"\"\nRun the following command to initialize the terraform configuration files\n terraform init\nRun terraform plan to check infrastructure state:\n terraform plan -out=tfplan\nIf there are no modifications to the infrastructure required and everything looks correct, apply the plan:\n terraform apply tfplan\n\n\n\nB. Deploy using AWS Console (manual setup)\nAn alternative to using the included Terraform configuration is to manually configure each service in the AWS Console:\n\nCreate an S3 bucket\nIf your Lambda function produces output, it will need to be saved somewhere. S3 is a convenient starting place for object storage. Give your bucket a unique name, and ensure it is in the us-west-2 region if you will be accessing NASA Earthdata in the cloud. In this example the output bucket is named “podaac-sst”.\nSet up Earthdata login credentials in the AWS Systems Manager Parameter Store.\nIf your Lambda function will read data directly from the Earthdata cloud, it is convenient to set up your EDL credentials as parameters. This avoids the complication and security implications of hardcoding EDL credentials in the Lambda function or setting up a .netrc file in a Docker container. One consideration is that the Lambda function will access Earthdata via the same set of credentials every time, regardless of the end user.\nAn alternative pattern to consider in cases where the Lambda function is going to be run frequently, is to store the AWS session tokens and access keys in the AWS Parameter store instead of the EDL username and password. The Lambda code would need to be changed to read those parameters instead, and a script could be set up to periodically refresh the tokens before they expire.\nSet up the Elastic Container Registry (ECR)\nIf using a Docker container to deploy your Lambda, the Docker image can be deployed to the AWS ECR service so that the AWS Lambda service can reach it. Select a repository name (in this example we use “podaac-sst”). We recommend keeping tag immutability disabled so if you update the Docker image in the future it will overwrite the current version.\nCreate an IAM role for your Lambda function to run as\nSet various policies depending on the other AWS services the Lambda needs access to:\n\nIf you plan to read or write to an S3 bucket, the role needs read/write permission to S3. In this example we call the role podaac-sst-lambda-role, but it could be named anything.\nIf you store Earthdata login (EDL) credentials for the Lambda function in AWS Parameter Store, you need to set an ‘AllowGetPutParameter’ policy for the role.\nWe suggest also setting a Cloudwatch policy for the role to create logs.\nMore information on IAM policies, the JSON syntax to use and formatting conventions can be found in the AWS IAM documentation.\n\n\n\n\n\nFigure - Access Policy\n\n\nFigure 2. An example access policy that allows read (get) and write (put) access to the podaac-sst S3 bucket.\n\n\n\n3. Create the Lambda function\nThe Lambda function used in this tutorial contains large Python packages, so it is deployed using a Docker container. If you use different code that requires smaller package dependencies, you could package it as a zip file instead, or copy it directly into the Lambda function in the AWS Console. See this article for more information.\nThis tutorial contains a Dockerfile, which is a text file containing the instructions to build a Docker Image. This Dockerfile will create a Docker Image based on the AWS Lambda Python base image that contains the packages listed in the requirements.txt file, and will run the lambda_handler function from the sst.py code file.\n\nInstall Docker on your local system and make sure it is running.\nIn your terminal, navigate to /notebooks/aws_lambda_sst/\nBuild the container image by running the following command:\n docker build -t podaac-sst .\nLogin to the AWS ECR service you set up earlier from the command line\n docker login -u AWS https://<accountID>.dkr.ecr.us-west-2.amazonaws.com -p $(aws ecr get-login-password --region us-west-2)\nPush the Docker container to the ECR repository\n docker push <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst\nCreate the Lambda function by running the following command:\n aws lambda create-function \\\n --function-name podaac-sst \\\n --package-type Image \\\n --code ImageUri=<accountID>.dkr.ecr.us-east-1.amazonaws.com/podaac-sst:latest \\\n --role arn:aws:iam::<accountID>:role/podaac-sst-lambda-role\n\n\n\n4. Test the Lambda function in the AWS Console\nOpen the AWS Console in your web browser, and navigate to the Lambda service. You should see your function listed. Click on the name of your function, which should open a page similar to the one shown in Figure 3.\n\n\n\nFigure - Lambda console\n\n\nFigure 3. The podaac-sst Lambda function in the AWS Console.\nUnder Function Overview, click on the Test tab. Create a new event, and input the event JSON below. Change the values if you selected a different bucket name during setup.\n {\n \"input_granule_s3path\": \"s3://podaac-ops-cumulus-protected/MUR25-JPL-L4-GLOB-v04.2/20221201090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc\",\n \"output_granule_s3bucket\": \"podaac-sst\",\n \"prefix\": \"podaac\"\n }\nClick the orange Test button to test the Lambda function. After a few seconds, you should see a message stating Executing function: succeeded (Figure 4). You can expand this section to see more details of the successful test. If the test fails, expand the message to troubleshoot.\n\n\n\nFigure - Lambda test\n\n\nFigure 4. A successful test of the podaac-sst Lambda function in the AWS Console.\n\n\n5. Launch an EC2 instance\nThere are instructions on setting up and connecting to an EC2 instance in this tutorial if you have not done this before. Connect to the EC2 instance via SSH, and start Jupyter Lab.\n\n\n6. Clone this repository to the EC2 instance\nCreate a fork of the https://github.com/podaac/tutorials repository, and clone it to your EC2 instance. Open the /notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.ipynb notebook.\n\n\n7. Log in to AWS from the EC2 terminal\nLog in to your AWS account from your EC2 terminal. See this article on configuring your credentials in the AWS CLI if you have not done so. This will set your access keys and session token in the ~/.aws/credentials file in your EC2 instance, which will be used to set up a boto3 session later in the workflow to read the resulting data from the S3 output bucket. You may need to refresh these credentials if it’s been more than 4 hours since you last set them.\n\n\n8. Run the Notebook\nOpen the /notebooks/aws_lambda_sst/podaac-lambda-example-sst-global-mean.ipynb notebook in Jupyter Lab in your EC-2 instance. You may need to install the Python packages listed in the import statements in the first cell. We recommend using conda-forge to install these packages to a new conda environment to avoid version conflicts.\nStep through the cells to query for granules from the MUR SST collection and invoke the Lambda function. You may need to check the number of output files in the S3 results bucket in the AWS Console to determine when Step 2 completes before moving to Step 3. Depending on the number of granules you are searching, this may take a few seconds to a few minutes.\nContinue through Step 3 of the notebook to plot the data.\nCongratulations! You configured, deployed, and ran an AWS Lambda function to generate a timeseries of global mean sea surface temperatures over time.\n\n\n9. Modify Lambda function and update Docker Container (Optional)\nTo make modifications to the Lambda function after it has been deployed:\n\nInstall Docker on your local system, and make sure it is running.\nModify the code in sst.py, and test your changes.\nBuild the Docker container:\ndocker build -t <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst .\nLog into JPL AWS ECR:\ndocker login -u AWS https://<accountID>.dkr.ecr.us-west-2.amazonaws.com -p $(aws ecr get-login-password –region us-west-2)\nPush most recent build (and modifications) to AWS ECR:\ndocker push <accountID>.dkr.ecr.us-west-2.amazonaws.com/podaac-sst\nNavigate to the podaac-sst lambda function in the web console.\nClick on the “Image” tab.\nClick the “Deploy new image” button.\nMake sure the correct container image is selected (it usually is by default) and click the “Save” button.\nWait for the image to be deployed to the lambda function.\nTest as in Step 4.", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-normalized-difference-water-index-ndwi-and-classify-innundated-areas", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas", - "text": "Caclulate Normalized Difference Water Index (NDWI) and Classify Innundated Areas\n\nLB3 = hls_ts_da_data_LB3 \nLB5 = hls_ts_da_data_LB5\nNDWI = (LB3-LB5)/(LB3+LB5)\nNDWI.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='coolwarm').opts(clim=(-0.5,0.5))\n\n\nwater = NDWI>0\nwater.hvplot.image(x='x', y='y', rasterize=True, width=600, height=400, colorbar=True, cmap='PuOr').opts(clim=(0,1))", + "objectID": "notebooks/aws_lambda_sst/docs/documentation.html#additional-resources", + "href": "notebooks/aws_lambda_sst/docs/documentation.html#additional-resources", + "title": "AWS Lambda", + "section": "Additional Resources", + "text": "Additional Resources\n\nAWS Services\n\nLambda : Serverless computing service\n\nLambda Getting Started Guide\nLambda Developer Guide\nLambda API Reference\n\n\n\nIAM : Identity and Access Management\n\nIAM User Guide\nIAM API Reference\nSetting IAM policies and permissions\n\n\n\nS3 : Simple Storage Service\n\nS3 Getting Started Guide\nS3 User Guide\n\n\n\nSystems Manager Parameter Store\n\nParameter Store User Guide\n\n\n\nEC2 : Elastic Compute Cloud\n\nEC2 User Guide for Linux\nEC2 API Reference\nEC2 Command Line Reference\n\n\n\nECR : Elastic Container Registry\n\nECR User Guide\nECR API Reference\n\n\n\n\nOther Services\n\nDocker\n\nGetting Started Guide\n\n\n\nTerraform\n\nIntro to Terraform\nTerraform Tutorial Library\n\n\n\nJupyter Notebook\n\nGet started with Project Jupyter\nJupyter Lab Documentation", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Advanced Cloud", + "AWS Lambda" ] }, { - "objectID": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-surface-area-of-reservoir-and-plot-time-series", - "href": "notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html#caclulate-surface-area-of-reservoir-and-plot-time-series", - "title": "Estimating Reservoir Surface Area From Harmonized Landsat-Sentinel (HLS) Imagery – Local Machine Version", - "section": "Caclulate surface area of reservoir and plot time series", - "text": "Caclulate surface area of reservoir and plot time series\n\nif water.variable.max() == True:\n water_real = water*30*30\nwater_area = water_real.sum(axis=(1,2))\n\n%matplotlib inline\n\nfig, ax = plt.subplots()\n(water_area[:]/1000000).plot(ax=ax, linewidth=2, linestyle = '-', marker='o')\nax.set_title(\"Surface area of waterbody in km2\")\nax.set_ylabel('Area [km^2]')", + "objectID": "quarto_text/Workshops.html", + "href": "quarto_text/Workshops.html", + "title": "Workshops", + "section": "", + "text": "We develop tutorials for teaching events that each have their own e-book. We often do this in collaboration with NASA OpenScapes. Tutorials are developed to teach open science and Cloud workflows for specific audiences. They are a snapshot in time as workflows with NASA Earthdata Cloud emerge and evolve.", "crumbs": [ - "Tutorials", - "Cloud vs. Local Workflows", - "Reservoir Example", - "Local" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#summary", - "href": "notebooks/meetings_workshops/arctic_2019.html#summary", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "Summary", - "text": "Summary\nHere, we compare salinity from the SMAP satellite and Saildrone in-situ measurements. Both datasets are located within the cloud.\n\nFollow along with the Data in Action story:\nBy the end of this notebook, you will have recreated a similar plot to the one featured in this Data-in-Action story:\nhttps://podaac.jpl.nasa.gov/DataAction-2021-10-05-Monitoring-Changes-in-the-Arctic-Using-Saildrone-SMAP-Satellite-and-Ocean-Models-Data\n\n\nShortnames of datasets used here:\nSMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5: https://podaac.jpl.nasa.gov/dataset/SMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5\nSAILDRONE_ARCTIC: https://podaac.jpl.nasa.gov/dataset/SAILDRONE_ARCTIC", + "objectID": "quarto_text/Workshops.html#swot-early-career-researcher-workshop-using-binder", + "href": "quarto_text/Workshops.html#swot-early-career-researcher-workshop-using-binder", + "title": "Workshops", + "section": "2024 SWOT Early Career Researcher Workshop Using Binder", + "text": "2024 SWOT Early Career Researcher Workshop Using Binder\nhttps://github.com/podaac/2024-SWOT-ECR-Workshop\nExplore SWOT data on a Binder virtual environment or local machine. This material was presented at the 9th Global Energy and Water Exchanges (GEWEX) Open Science Conference and the Hacking Limnology 2024 Virtual Summit Remote Sensing Day.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#requirements", - "href": "notebooks/meetings_workshops/arctic_2019.html#requirements", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\nThis tutorial can only be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region.\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. netrc File\nYou will need a .netrc file containing your NASA Earthdata Login credentials in order to execute the notebooks. A .netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata tutorial.\n\n\nImport Libraries\n\n# To access dataset using Earthaccess\nimport earthaccess\n\n# To access dataset without Earthaccess\nimport os\nimport s3fs\nimport requests\nimport glob\n\n# To open dataset\nimport xarray as xr\n\n# For plotting\nimport matplotlib.pyplot as plt\nimport cartopy\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER", + "objectID": "quarto_text/Workshops.html#swot-data-access-workshop", + "href": "quarto_text/Workshops.html#swot-data-access-workshop", + "title": "Workshops", + "section": "2024 SWOT Data Access Workshop", + "text": "2024 SWOT Data Access Workshop\nhttps://podaac.github.io/2024-SWOT-Hydro-Workshop/\nThe Surface Water and Ocean Topography (SWOT) satellite, a joint NASA-CNES venture, provides unprecedented measurements of surface water extents and elevations for hydrologic science and applications. This workshop focuses on the SWOT Hydrology datasets including river and lake vector data in shapefiles, and raster, pixel cloud, and pixel vector data in netCDF. In this pre-meeting workshop for the AGU Chapman: Remote Sensing of the Water Cycle Conference, participants are introduced to SWOT and the various ways to access and utilize its data products, including via cloud computing, local download, and data transformation tools.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#smap-dataset", - "href": "notebooks/meetings_workshops/arctic_2019.html#smap-dataset", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "SMAP dataset", - "text": "SMAP dataset\nSearch for and open this dataset as an example of using Earthaccess\n\nauth = earthaccess.login(strategy=\"netrc\")\n\nYou're now authenticated with NASA Earthdata Login\nUsing token with expiration date: 06/18/2023\nUsing .netrc file for EDL\n\n\n\nshort_name=\"SMAP_RSS_L3_SSS_SMI_8DAY-RUNNINGMEAN_V5\"\n\nresults = earthaccess.search_data(\n short_name=short_name,\n cloud_hosted=True,\n temporal=(\"2019-05-01T00:00:00\", \"2019-10-01T00:00:00\"),\n bounding_box=(-170,65,-160,71) # (west, south, east, north)\n)\n\nGranules found: 122\n\n\n\nds_sss = xr.open_mfdataset(earthaccess.open(results))\n\n Opening 122 granules, approx size: 0.0 GB\n\n\n\n\n\n\n\n\n\n\n\n\nplot_west = -170\nplot_east = -160\nplot_south = 60\nplot_north = 75\n\nlat_bnds, lon_bnds = [plot_south, plot_north], [plot_west+360, plot_east+360] # Turn the longitudes in (-180,0) to (0,360)\nds_sss_subset_0 = ds_sss.sel(lat=slice(*lat_bnds), lon=slice(*lon_bnds))\nds_sss_subset_0['latitude'] = ds_sss_subset_0.lat\nds_sss_subset_0['longitude'] = ds_sss_subset_0.lon-360\nds_sss_subset = ds_sss_subset_0.swap_dims({'lat':'latitude', 'lon':'longitude'})\nds_sss_subset\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (longitude: 40, latitude: 60, time: 122,\n uncertainty_components: 9, iceflag_components: 3)\nCoordinates:\n lon (longitude) float32 190.1 190.4 ... 199.6 199.9\n lat (latitude) float32 60.12 60.38 60.62 ... 74.62 74.88\n * time (time) datetime64[ns] 2019-04-27T12:00:00 ... 201...\n * latitude (latitude) float32 60.12 60.38 60.62 ... 74.62 74.88\n * longitude (longitude) float32 -169.9 -169.6 ... -160.4 -160.1\nDimensions without coordinates: uncertainty_components, iceflag_components\nData variables: (12/19)\n nobs (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n nobs_RF (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n nobs_40km (time, latitude, longitude) float64 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap_RF (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sss_smap_unc (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n ... ...\n fland (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n gice_est (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n surtep (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n winspd (time, latitude, longitude) float32 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n sea_ice_zones (time, latitude, longitude) int8 dask.array<chunksize=(1, 60, 40), meta=np.ndarray>\n anc_sea_ice_flag (time, latitude, longitude, iceflag_components) int8 dask.array<chunksize=(1, 60, 40, 3), meta=np.ndarray>\nAttributes: (12/65)\n Conventions: CF-1.7, ACDD-1.3\n title: SMAP ocean surfac...\n version: V5.0 Validated Re...\n summary: The dataset conta...\n acknowledgement: Funded under Subc...\n processing_level: L3\n ... ...\n Source_of_SMAP_SSS_retrievals: T. Meissner, F. W...\n Source_of_ancillary_SST: Canada Meteorolog...\n Source_of_ancillary_CCMP_wind_speed: Mears, C. et al.,...\n Source_of_ancillary_AMSR2_sea_ice_flag_and_correction: Meissner, T. and ...\n Source_of_ancillary_land_mask: 1 km land/water m...\n Source_of_ancillary_reference_SSS_from_HYCOM: Hybrid Coordinate...xarray.DatasetDimensions:longitude: 40latitude: 60time: 122uncertainty_components: 9iceflag_components: 3Coordinates: (5)lon(longitude)float32190.1 190.4 190.6 ... 199.6 199.9standard_name :longitudeaxis :Xlong_name :center longitude of grid cellunits :degrees_eastvalid_min :0.0valid_max :360.0coverage_content_type :coordinatearray([190.125, 190.375, 190.625, 190.875, 191.125, 191.375, 191.625, 191.875,\n 192.125, 192.375, 192.625, 192.875, 193.125, 193.375, 193.625, 193.875,\n 194.125, 194.375, 194.625, 194.875, 195.125, 195.375, 195.625, 195.875,\n 196.125, 196.375, 196.625, 196.875, 197.125, 197.375, 197.625, 197.875,\n 198.125, 198.375, 198.625, 198.875, 199.125, 199.375, 199.625, 199.875],\n dtype=float32)lat(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)time(time)datetime64[ns]2019-04-27T12:00:00 ... 2019-10-...standard_name :timeaxis :Tlong_name :reference time of analyzed variable field corresponding to center of the product time intervalcoverage_content_type :coordinatearray(['2019-04-27T12:00:00.000000000', '2019-04-28T12:00:00.000000000',\n '2019-04-29T12:00:00.000000000', '2019-04-30T12:00:00.000000000',\n '2019-05-01T12:00:00.000000000', '2019-05-02T12:00:00.000000000',\n '2019-05-03T12:00:00.000000000', '2019-05-04T12:00:00.000000000',\n '2019-05-05T12:00:00.000000000', '2019-05-06T12:00:00.000000000',\n '2019-05-07T12:00:00.000000000', '2019-05-08T12:00:00.000000000',\n '2019-05-09T12:00:00.000000000', '2019-05-10T12:00:00.000000000',\n '2019-05-11T12:00:00.000000000', '2019-05-12T12:00:00.000000000',\n '2019-05-13T12:00:00.000000000', '2019-05-14T12:00:00.000000000',\n '2019-05-15T12:00:00.000000000', '2019-05-16T12:00:00.000000000',\n '2019-05-17T12:00:00.000000000', '2019-05-18T12:00:00.000000000',\n '2019-05-19T12:00:00.000000000', '2019-05-20T12:00:00.000000000',\n '2019-05-21T12:00:00.000000000', '2019-05-22T12:00:00.000000000',\n '2019-05-23T12:00:00.000000000', '2019-05-24T12:00:00.000000000',\n '2019-05-25T12:00:00.000000000', '2019-05-26T12:00:00.000000000',\n '2019-05-27T12:00:00.000000000', '2019-05-28T12:00:00.000000000',\n '2019-05-29T12:00:00.000000000', '2019-05-30T12:00:00.000000000',\n '2019-05-31T12:00:00.000000000', '2019-06-01T12:00:00.000000000',\n '2019-06-02T12:00:00.000000000', '2019-06-03T12:00:00.000000000',\n '2019-06-04T12:00:00.000000000', '2019-06-05T12:00:00.000000000',\n '2019-06-06T12:00:00.000000000', '2019-06-07T12:00:00.000000000',\n '2019-06-08T12:00:00.000000000', '2019-06-09T12:00:00.000000000',\n '2019-06-10T12:00:00.000000000', '2019-06-11T12:00:00.000000000',\n '2019-06-12T12:00:00.000000000', '2019-06-13T12:00:00.000000000',\n '2019-06-14T12:00:00.000000000', '2019-06-15T12:00:00.000000000',\n '2019-06-16T12:00:00.000000000', '2019-07-26T12:00:00.000000000',\n '2019-07-27T12:00:00.000000000', '2019-07-28T12:00:00.000000000',\n '2019-07-29T12:00:00.000000000', '2019-07-30T12:00:00.000000000',\n '2019-07-31T12:00:00.000000000', '2019-08-01T12:00:00.000000000',\n '2019-08-02T12:00:00.000000000', '2019-08-03T12:00:00.000000000',\n '2019-08-04T12:00:00.000000000', '2019-08-05T12:00:00.000000000',\n '2019-08-06T12:00:00.000000000', '2019-08-07T12:00:00.000000000',\n '2019-08-08T12:00:00.000000000', '2019-08-09T12:00:00.000000000',\n '2019-08-10T12:00:00.000000000', '2019-08-11T12:00:00.000000000',\n '2019-08-12T12:00:00.000000000', '2019-08-13T12:00:00.000000000',\n '2019-08-14T12:00:00.000000000', '2019-08-15T12:00:00.000000000',\n '2019-08-16T12:00:00.000000000', '2019-08-17T12:00:00.000000000',\n '2019-08-18T12:00:00.000000000', '2019-08-19T12:00:00.000000000',\n '2019-08-20T12:00:00.000000000', '2019-08-21T12:00:00.000000000',\n '2019-08-22T12:00:00.000000000', '2019-08-23T12:00:00.000000000',\n '2019-08-24T12:00:00.000000000', '2019-08-25T12:00:00.000000000',\n '2019-08-26T12:00:00.000000000', '2019-08-27T12:00:00.000000000',\n '2019-08-28T12:00:00.000000000', '2019-08-29T12:00:00.000000000',\n '2019-08-30T12:00:00.000000000', '2019-08-31T12:00:00.000000000',\n '2019-09-01T12:00:00.000000000', '2019-09-02T12:00:00.000000000',\n '2019-09-03T12:00:00.000000000', '2019-09-04T12:00:00.000000000',\n '2019-09-05T12:00:00.000000000', '2019-09-06T12:00:00.000000000',\n '2019-09-07T12:00:00.000000000', '2019-09-08T12:00:00.000000000',\n '2019-09-09T12:00:00.000000000', '2019-09-10T12:00:00.000000000',\n '2019-09-11T12:00:00.000000000', '2019-09-12T12:00:00.000000000',\n '2019-09-13T12:00:00.000000000', '2019-09-14T12:00:00.000000000',\n '2019-09-15T12:00:00.000000000', '2019-09-16T12:00:00.000000000',\n '2019-09-17T12:00:00.000000000', '2019-09-18T12:00:00.000000000',\n '2019-09-19T12:00:00.000000000', '2019-09-20T12:00:00.000000000',\n '2019-09-21T12:00:00.000000000', '2019-09-22T12:00:00.000000000',\n '2019-09-23T12:00:00.000000000', '2019-09-24T12:00:00.000000000',\n '2019-09-25T12:00:00.000000000', '2019-09-26T12:00:00.000000000',\n '2019-09-27T12:00:00.000000000', '2019-09-28T12:00:00.000000000',\n '2019-09-29T12:00:00.000000000', '2019-09-30T12:00:00.000000000',\n '2019-10-01T12:00:00.000000000', '2019-10-02T12:00:00.000000000',\n '2019-10-03T12:00:00.000000000', '2019-10-04T12:00:00.000000000'],\n dtype='datetime64[ns]')latitude(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)longitude(longitude)float32-169.9 -169.6 ... -160.4 -160.1array([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125], dtype=float32)Data variables: (19)nobs(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of SSS smoothed to approx 70km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nnobs_RF(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of rain filtered SSS smoothed to approx 70km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nnobs_40km(time, latitude, longitude)float64dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Number of observations for L3 average of SSS at 40km resolutionstandard_name :number_of_observationsunits :1valid_min :1valid_max :480coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n2.23 MiB\n18.75 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat64 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_RF(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Rain filtered SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_RF_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of rain filtered SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_unc_comp(time, uncertainty_components, latitude, longitude)float32dask.array<chunksize=(1, 9, 60, 40), meta=np.ndarray>long_name :formal uncertainty components of SMAP sea surface salinity smoothed to approx 70km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformationcomponents :1: ancillary wind speed random. 2: NEDT v-pol. 3: NEDT h-pol. 4: ancillary SST. 5: ancillary wind direction. 6: reflected galaxy. 7: land contamination. 8: sea ice contamination. 9: ancillary wind speed systematic.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.05 MiB\n84.38 kiB\n\n\nShape\n(122, 9, 60, 40)\n(1, 9, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 122 1 40 60 9\n\n\n\n\nsss_smap_40km(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :physicalMeasurement\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_40km_unc(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :total formal uncertainty estimate of SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsss_smap_40km_unc_comp(time, uncertainty_components, latitude, longitude)float32dask.array<chunksize=(1, 9, 60, 40), meta=np.ndarray>long_name :formal uncertainty components of SMAP sea surface salinity at original 40km resolutionstandard_name :sea_surface_salinity standard_errorunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :qualityInformationcomponents :1: ancillary wind speed random. 2: NEDT v-pol. 3: NEDT h-pol. 4: ancillary SST. 5: ancillary wind direction. 6: reflected galaxy. 7: land contamination. 8: sea ice contamination. 9: ancillary wind speed systematic.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n10.05 MiB\n84.38 kiB\n\n\nShape\n(122, 9, 60, 40)\n(1, 9, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 122 1 40 60 9\n\n\n\n\nsss_ref(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :Reference sea surface salinity from HYCOMstandard_name :sea_surface_salinityunits :1e-3valid_min :0.0valid_max :45.0coverage_content_type :referenceInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\ngland(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :average land fraction weighted by antenna gainstandard_name :land_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nfland(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :average land fraction within 3dB contourstandard_name :land_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\ngice_est(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :estimated sea ice fraction weighted by antenna gainstandard_name :sea_ice_area_fractionunits :1valid_min :0.0valid_max :1.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsurtep(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>standard_name :sea_surface_temperaturelong_name :Ancillary sea surface temperature (from CMC)units :Kelvinvalid_min :0.0valid_max :313.15coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nwinspd(time, latitude, longitude)float32dask.array<chunksize=(1, 60, 40), meta=np.ndarray>standard_name :wind_speedlong_name :Ancillary sea surface wind speed from CCMP NRT that is used in surface roughness correctionunits :m s-1valid_min :0.0valid_max :100.0coverage_content_type :auxiliaryInformation\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n1.12 MiB\n9.38 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nsea_ice_zones(time, latitude, longitude)int8dask.array<chunksize=(1, 60, 40), meta=np.ndarray>long_name :sea-ice contamination zones at center daystandard_name :quality_flagunits :1coverage_content_type :qualityInformationflag_meaning :0: open ocean scene. no sea-ice contamination. 1: likely sea-ice contamination in SMAP antenna sidelobes. SSS retrieved. 2: likely sea-ice contamination in SMAP antenna sidelobes. SSS retrieved. 3: likely sea-ice contamination in SMAP antenna mainlobe. SSS retrieved. 4: likely sea-ice contamination in SMAP antenna mainlobe. SSS retrieved. 5: likely sea-ice contamination in SMAP antenna mainlobe. no SSS retrieved. 6: AMSR2 50-km footprint contains land. sea-ice check not reliable. no SSS retrieved if AMSR-2 AS-ECV V8.2 sea-ice flag set. 7: no or invalid AMSR2 observation. sea-ice check not possible. no SSS retrieved if climatological sea-ice flag set.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n285.94 kiB\n2.34 kiB\n\n\nShape\n(122, 60, 40)\n(1, 60, 40)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 40 60 122\n\n\n\n\nanc_sea_ice_flag(time, latitude, longitude, iceflag_components)int8dask.array<chunksize=(1, 60, 40, 3), meta=np.ndarray>long_name :ancillary sea-ice detection indicator at center daystandard_name :quality_flagunits :1coverage_content_type :qualityInformationflag_meaning :component 1 of anc_sea_ice_flag: climatological sea-ice flag. component 2 of anc_sea_ice_flag: sea-ice flag from AMSR2 RSS AS-ECV V8.2 3-day map. component 3 of anc_sea_ice_flag: sea-ice flag from Meissner and Manaster.\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n857.81 kiB\n7.03 kiB\n\n\nShape\n(122, 60, 40, 3)\n(1, 60, 40, 3)\n\n\nDask graph\n122 chunks in 368 graph layers\n\n\nData type\nint8 numpy.ndarray\n\n\n\n\n 122 1 3 40 60\n\n\n\n\nIndexes: (3)timePandasIndexPandasIndex(DatetimeIndex(['2019-04-27 12:00:00', '2019-04-28 12:00:00',\n '2019-04-29 12:00:00', '2019-04-30 12:00:00',\n '2019-05-01 12:00:00', '2019-05-02 12:00:00',\n '2019-05-03 12:00:00', '2019-05-04 12:00:00',\n '2019-05-05 12:00:00', '2019-05-06 12:00:00',\n ...\n '2019-09-25 12:00:00', '2019-09-26 12:00:00',\n '2019-09-27 12:00:00', '2019-09-28 12:00:00',\n '2019-09-29 12:00:00', '2019-09-30 12:00:00',\n '2019-10-01 12:00:00', '2019-10-02 12:00:00',\n '2019-10-03 12:00:00', '2019-10-04 12:00:00'],\n dtype='datetime64[ns]', name='time', length=122, freq=None))latitudePandasIndexPandasIndex(Index([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875],\n dtype='float32', name='latitude'))longitudePandasIndexPandasIndex(Index([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125],\n dtype='float32', name='longitude'))Attributes: (65)Conventions :CF-1.7, ACDD-1.3title :SMAP ocean surface salinityversion :V5.0 Validated Releasesummary :The dataset contains the Level 3 8-day running averages of the NASA/RSS Version 5.0 SMAP Salinity Retrieval Algorithm. It includes all necessary ancillary data and the results of all intermediate steps. The data are gridded on a regular 0.25 deg Earth grid. For details see the Release Notes at https://www.remss.com/missions/smap/salinity/.acknowledgement :Funded under Subcontract No.1664013 between JPL and RSS: Production System for NASA Ocean Salinity Science Team (OSST).processing_level :L3resolution :Spatial resolution: approx 70kmhistory :created by T. Meissnerdate_created :2022-03-29 T12:02:30-0700date_modified :2022-03-29 T12:02:30-0700date_issued :2022-03-29 T12:02:30-0700date_metadata_modified :2022-03-29 T12:02:30-0700institution :Remote Sensing Systems, Santa Rosa, CA, USAsource :RSS SMAP-SSS v5.0 algorithmplatform :SMAPinstrument :SMAP radiometerproject :Production System for NASA Ocean Salinity Science Team (OSST)keywords :SURFACE SALINITY, SALINITY, SMAP, NASA, RSSkeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :CF Standard Name Table v78license :Nonecreator_name :Thomas Meissner, Remote Sensing Systemscreator_email :meissner@remss.comcreator_url :http://www.remss.com/missions/smappublisher_name :Thomas Meissner, Frank Wentz, Andrew Manaster, Richard Lindsley, Marty Brewer, Michael Densberger, Remote Sensing Systemspublisher_email :meissner@remss.compublisher_url :http://www.remss.com/missions/smapid :10.5067/SMP50-3SPCSnaming_authority :gov.nasa.earthdatadataset_citation_authors :T. Meissner, F. Wentz, A. Manaster, R. Lindsley, M. Brewer, M. Densbergerdataset_citation_year :2022dataset_citation_product :Remote Sensing Systems SMAP Level 3 Sea Surface Salinity Standard Mapped Image 8day runningdataset_citation_version :V5.0 Validated Releasedataset_citation_institution :Remote Sensing Systems, Santa Rosa, CA, USAdataset_citation_url :Available online at www.remss.com/missions/smapnetCDF_version_id :4comment :Major changes in V5.0: 1. sea-ice flag: based on AMSR-2 surface emissivties and discriminant analysis. 2. sea-ice correction included. 3. formal uncertainty estimates added.references :1. V5.0 Release Notes at https://www.remss.com/missions/smap/salinity/ 2. Meissner, T.; Wentz, F.J.; Le Vine, D.M. The Salinity Retrieval Algorithms for the NASA Aquarius Version 5 and SMAP Version 3 Releases. Remote Sens. 2018, 10, 1121. https://doi.org/10.3390/rs10071121 3. Meissner, T.; Manaster, A. SMAP Salinity Retrievals near the Sea-Ice Edge Using Multi-Channel AMSR2 Brightness Temperatures. Remote Sens. 2021, 13, 5120. https://doi.org/10.3390/rs13245120year_of_observation :2019center_day_of_observation :117first_orbit :22566last_orbit :22682time_coverage_start :2019-04-23T12:00:00Ztime_coverage_end :2019-05-01T12:00:00Ztime_coverage_duration :P8Dtime_coverage_resolution :P8Dcdm_data_type :gridgeospatial_bounds :2Dgeospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lat_resolution :0.25geospatial_lat_units :degrees_northgeospatial_lon_min :0.0geospatial_lon_max :360.0geospatial_lon_resolution :0.25geospatial_lon_units :degrees_eastgeospatial_bounds_vertical_crs :EPSG:5831geospatial_vertical_min :0geospatial_vertical_max :0Source_of_SMAP_SSS_retrievals :T. Meissner, F. Wentz, A. Manaster, R. Lindsley, M. Brewer, M. Densberger, Remote Sensing Systems SMAP L2C Sea Surface Salinity, Version 5.0 Validated Release, Remote Sensing Systems, Santa Rosa, CA, USA doi: 10.5067/SMP50-2SOCS www.remss.com/missions/smap.Source_of_ancillary_SST :Canada Meteorological Center. 2016.GHRSST Level 4 CMC0.1deg Global Foundation Sea Surface Temperature Analysis (GDS version 2). Ver.3.3.doi: 10.5067/GHCMC-4FM03 http://dx.doi.org/10.5067/GHCMC-4FM03.Source_of_ancillary_CCMP_wind_speed :Mears, C. et al., 2018.Remote Sensing Systems CCMP NRT V2.0 wind speed and direction. Remote Sensing Systems, Santa Rosa, CA.Source_of_ancillary_AMSR2_sea_ice_flag_and_correction :Meissner, T. and A. Manaster, 2021. SMAP Salinity Retrievals near the Sea-Ice Edge Using Multi-Channel AMSR2 Brightness Temperatures. Remote Sens. 2021, 13, 5120. https://doi.org/10.3390/rs13245120.Source_of_ancillary_land_mask :1 km land/water mask from OCEAN DISCIPLINE PROCESSING SYSTEM (ODPS) based on World Vector Shoreline (WVS)database and World Data Bank. courtesy of Fred Patt, Goddard Space Flight Center, frederick.s.patt@nasa.gov.Source_of_ancillary_reference_SSS_from_HYCOM :Hybrid Coordinate Ocean Model, GLBa0.08/expt_90.9, Top layer salinity. Available at www.hycom.org.\n\n\n\nsubset_mean_values = ds_sss_subset.sss_smap.mean(dim = 'time', skipna = True)\nsubset_mean_values\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'sss_smap' (latitude: 60, longitude: 40)>\ndask.array<mean_agg-aggregate, shape=(60, 40), dtype=float32, chunksize=(60, 40), chunktype=numpy.ndarray>\nCoordinates:\n lon (longitude) float32 190.1 190.4 190.6 190.9 ... 199.4 199.6 199.9\n lat (latitude) float32 60.12 60.38 60.62 60.88 ... 74.38 74.62 74.88\n * latitude (latitude) float32 60.12 60.38 60.62 60.88 ... 74.38 74.62 74.88\n * longitude (longitude) float32 -169.9 -169.6 -169.4 ... -160.6 -160.4 -160.1xarray.DataArray'sss_smap'latitude: 60longitude: 40dask.array<chunksize=(60, 40), meta=np.ndarray>\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.38 kiB\n9.38 kiB\n\n\nShape\n(60, 40)\n(60, 40)\n\n\nDask graph\n1 chunks in 373 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 40 60\n\n\n\n\nCoordinates: (4)lon(longitude)float32190.1 190.4 190.6 ... 199.6 199.9standard_name :longitudeaxis :Xlong_name :center longitude of grid cellunits :degrees_eastvalid_min :0.0valid_max :360.0coverage_content_type :coordinatearray([190.125, 190.375, 190.625, 190.875, 191.125, 191.375, 191.625, 191.875,\n 192.125, 192.375, 192.625, 192.875, 193.125, 193.375, 193.625, 193.875,\n 194.125, 194.375, 194.625, 194.875, 195.125, 195.375, 195.625, 195.875,\n 196.125, 196.375, 196.625, 196.875, 197.125, 197.375, 197.625, 197.875,\n 198.125, 198.375, 198.625, 198.875, 199.125, 199.375, 199.625, 199.875],\n dtype=float32)lat(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)latitude(latitude)float3260.12 60.38 60.62 ... 74.62 74.88standard_name :latitudeaxis :Ylong_name :center latitude of grid cellunits :degrees_northvalid_min :-90.0valid_max :90.0coverage_content_type :coordinatearray([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875], dtype=float32)longitude(longitude)float32-169.9 -169.6 ... -160.4 -160.1array([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125], dtype=float32)Indexes: (2)latitudePandasIndexPandasIndex(Index([60.125, 60.375, 60.625, 60.875, 61.125, 61.375, 61.625, 61.875, 62.125,\n 62.375, 62.625, 62.875, 63.125, 63.375, 63.625, 63.875, 64.125, 64.375,\n 64.625, 64.875, 65.125, 65.375, 65.625, 65.875, 66.125, 66.375, 66.625,\n 66.875, 67.125, 67.375, 67.625, 67.875, 68.125, 68.375, 68.625, 68.875,\n 69.125, 69.375, 69.625, 69.875, 70.125, 70.375, 70.625, 70.875, 71.125,\n 71.375, 71.625, 71.875, 72.125, 72.375, 72.625, 72.875, 73.125, 73.375,\n 73.625, 73.875, 74.125, 74.375, 74.625, 74.875],\n dtype='float32', name='latitude'))longitudePandasIndexPandasIndex(Index([-169.875, -169.625, -169.375, -169.125, -168.875, -168.625, -168.375,\n -168.125, -167.875, -167.625, -167.375, -167.125, -166.875, -166.625,\n -166.375, -166.125, -165.875, -165.625, -165.375, -165.125, -164.875,\n -164.625, -164.375, -164.125, -163.875, -163.625, -163.375, -163.125,\n -162.875, -162.625, -162.375, -162.125, -161.875, -161.625, -161.375,\n -161.125, -160.875, -160.625, -160.375, -160.125],\n dtype='float32', name='longitude'))Attributes: (0)", + "objectID": "quarto_text/Workshops.html#agu-cloud-workshop", + "href": "quarto_text/Workshops.html#agu-cloud-workshop", + "title": "Workshops", + "section": "2023 AGU Cloud Workshop", + "text": "2023 AGU Cloud Workshop\nhttps://nasa-openscapes.github.io/2023-Cloud-Workshop-AGU/\nIn this workshop, NASA Openscapes Mentors from NASA’s Earth Observing System Data and Information System (EOSDIS) DAACs (data centers) teach the foundations of an open science mindset and apply these concepts to work in the cloud with NASA Earthdata. Participants take part in hands-on tutorials using a JupyterHub managed by 2i2c in AWS. The goal is to teach participants how to leverage data and services from NASA Earthdata Cloud within their work across a variety of disciplines and data types, as well as how to apply the concepts of open science as a daily practice.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#saildrone-dataset", - "href": "notebooks/meetings_workshops/arctic_2019.html#saildrone-dataset", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "Saildrone dataset", - "text": "Saildrone dataset\nAccessing this dataset as an example of using s3fs\n\ns3_cred_endpoint = 'https://archive.podaac.earthdata.nasa.gov/s3credentials'\n\n\ndef get_temp_creds():\n temp_creds_url = s3_cred_endpoint\n return requests.get(temp_creds_url).json()\n\n\ntemp_creds_req = get_temp_creds()\n#temp_creds_req # !!! BEWARE, removing the # on this line will print your temporary S3 credentials.\n\n\nfs_s3 = s3fs.S3FileSystem(anon=False, \n key=temp_creds_req['accessKeyId'], \n secret=temp_creds_req['secretAccessKey'], \n token=temp_creds_req['sessionToken'],\n client_kwargs={'region_name':'us-west-2'})\n\n\nbucket = os.path.join('podaac-ops-cumulus-protected/','SAILDRONE_ARCTIC','saildrone-*-1_minutes-*.nc')\nsd_files = fs_s3.glob(bucket)\nsaildrone_files= [fs_s3.open(file) for file in sorted(sd_files)]\nlen(saildrone_files)\n\n2\n\n\n\nsd6 = xr.open_dataset(saildrone_files[0])\nsd7 = xr.open_dataset(saildrone_files[1])\nsd7\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (trajectory: 1, obs: 215731)\nCoordinates:\n latitude (trajectory, obs) float64 ...\n longitude (trajectory, obs) float64 ...\n time (trajectory, obs) datetime64[ns] ...\n * trajectory (trajectory) float32 1.037e+03\nDimensions without coordinates: obs\nData variables: (12/79)\n SOG (trajectory, obs) float64 ...\n SOG_FILTERED_MEAN (trajectory, obs) float64 ...\n SOG_FILTERED_STDDEV (trajectory, obs) float64 ...\n SOG_FILTERED_MAX (trajectory, obs) float64 ...\n SOG_FILTERED_MIN (trajectory, obs) float64 ...\n COG (trajectory, obs) float64 ...\n ... ...\n TEMP_O2_RBR_MEAN (trajectory, obs) float64 ...\n TEMP_O2_RBR_STDDEV (trajectory, obs) float64 ...\n CHLOR_WETLABS_MEAN (trajectory, obs) float64 ...\n CHLOR_WETLABS_STDDEV (trajectory, obs) float64 ...\n CHLOR_RBR_MEAN (trajectory, obs) float64 ...\n CHLOR_RBR_STDDEV (trajectory, obs) float64 ...\nAttributes: (12/45)\n title: Arctic NASA MISST 2019 Mission\n summary: Saildrone surface observational data for the N...\n ncei_template_version: NCEI_NetCDF_Trajectory_Template_v2.0\n Conventions: CF-1.6, ACDD-1.3\n netcdf_version: 4.6.3\n featureType: trajectory\n ... ...\n keywords_vocabulary: NASA/GCMD\n publisher_name: Saildrone\n publisher_url: www.saildrone.com\n publisher_email: support@saildrone.com\n acknowledgment: Saildrone. 2019. Saildrone Arctic field campai...\n processing_level: Level 2xarray.DatasetDimensions:trajectory: 1obs: 215731Coordinates: (4)latitude(trajectory, obs)float64...standard_name :latitudelong_name :Latitudeunits :degrees_northaxis :Yinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]longitude(trajectory, obs)float64...standard_name :longitudelong_name :Longitudeunits :degrees_eastaxis :Xinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]time(trajectory, obs)datetime64[ns]...standard_name :timelong_name :time in secondsaxis :T[215731 values with dtype=datetime64[ns]]trajectory(trajectory)float321.037e+03long_name :Trajectory/Drone IDcf_role :trajectory_idcomment :A trajectory is a single deployment of a dronearray([1037.], dtype=float32)Data variables: (79)SOG(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over groundunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute meanunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute stddevunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MAX(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute maxunits :m s-1[215731 values with dtype=float64]SOG_FILTERED_MIN(trajectory, obs)float64...standard_name :platform_speed_wrt_groundlong_name :Speed over ground one minute minunits :m s-1[215731 values with dtype=float64]COG(trajectory, obs)float64...standard_name :platform_courselong_name :Course over groundunits :degree[215731 values with dtype=float64]COG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_courselong_name :Course over ground one minute meanunits :degree[215731 values with dtype=float64]COG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_courselong_name :Course over ground one minute stddevunits :degree[215731 values with dtype=float64]HDG(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle headingunits :degree[215731 values with dtype=float64]HDG_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle heading one minute meanunits :degree[215731 values with dtype=float64]HDG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_yaw_anglelong_name :Vehicle heading one minute stddevunits :degree[215731 values with dtype=float64]ROLL_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute meanunits :degree[215731 values with dtype=float64]ROLL_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute stddevunits :degree[215731 values with dtype=float64]ROLL_FILTERED_PEAK(trajectory, obs)float64...standard_name :platform_roll_anglelong_name :Vehicle roll one minute peakunits :degree[215731 values with dtype=float64]PITCH_FILTERED_MEAN(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute meanunits :degree[215731 values with dtype=float64]PITCH_FILTERED_STDDEV(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute stddevunits :degree[215731 values with dtype=float64]PITCH_FILTERED_PEAK(trajectory, obs)float64...standard_name :platform_pitch_anglelong_name :Vehicle pitch one minute peakunits :degree[215731 values with dtype=float64]HDG_WING(trajectory, obs)float64...standard_name :wing_yawlong_name :Wing headingunits :degree[215731 values with dtype=float64]WING_HDG_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_yaw_minute_meanlong_name :Wing heading one minute meanunits :degree[215731 values with dtype=float64]WING_HDG_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_yaw_minute_rmslong_name :Wing heading one minute stddevunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_roll_minute_meanlong_name :Wing roll one minute meanunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_roll_minute_rmslong_name :Wing roll one minute stddevunits :degree[215731 values with dtype=float64]WING_ROLL_FILTERED_PEAK(trajectory, obs)float64...standard_name :wing_roll_minute_maxlong_name :Wing roll one minute peakunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_MEAN(trajectory, obs)float64...standard_name :wing_pitch_minute_meanlong_name :Wing pitch one minute meanunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_STDDEV(trajectory, obs)float64...standard_name :wing_pitch_minute_rmslong_name :Wing pitch one minute stddevunits :degree[215731 values with dtype=float64]WING_PITCH_FILTERED_PEAK(trajectory, obs)float64...standard_name :wing_pitch_minute_maxlong_name :Wing pitch one minute peakunits :degree[215731 values with dtype=float64]WING_ANGLE(trajectory, obs)float64...standard_name :wing_anglelong_name :Wing angleunits :degree[215731 values with dtype=float64]UWND_MEAN(trajectory, obs)float64...standard_name :eastward_windlong_name :Eastward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]UWND_STDDEV(trajectory, obs)float64...standard_name :eastward_windlong_name :Eastward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]VWND_MEAN(trajectory, obs)float64...standard_name :northward_windlong_name :Northward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]VWND_STDDEV(trajectory, obs)float64...standard_name :northward_windlong_name :Northward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WWND_MEAN(trajectory, obs)float64...standard_name :downward_air_velocitylong_name :Downward wind speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WWND_STDDEV(trajectory, obs)float64...standard_name :downward_air_velocitylong_name :Downward wind speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]GUST_WND_MEAN(trajectory, obs)float64...standard_name :wind_speed_of_gustlong_name :Wind gust speedunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]GUST_WND_STDDEV(trajectory, obs)float64...standard_name :wind_speed_of_gustlong_name :Wind gust speed SDunits :m s-1installed_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WIND_HEIGHT_MEAN(trajectory, obs)float64...standard_name :wind_measurement_height_filteredlong_name :Wind measurement heightunits :minstalled_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]WIND_HEIGHT_STDDEV(trajectory, obs)float64...standard_name :wind_measurement_height_rmslong_name :Wind measurement height SDunits :minstalled_date :2019-04-10T00:46:53.168598Zdevice_name :Gill Anemometer (W182203)serial_number :W182203last_calibrated :2018-05-31installed_height :5.2vendor_name :Gillmodel_name :1590-PK-020model_product_page :http://gillinstruments.com/products/anemometer/windmaster.htmnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :50.0[215731 values with dtype=float64]TEMP_AIR_MEAN(trajectory, obs)float64...standard_name :air_temperaturelong_name :Air temperatureunits :degrees_cinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_AIR_STDDEV(trajectory, obs)float64...standard_name :air_temperaturelong_name :Air temperature SDunits :degrees_cinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]RH_MEAN(trajectory, obs)float64...standard_name :relative_humiditylong_name :Relative humidityunits :percentinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]RH_STDDEV(trajectory, obs)float64...standard_name :relative_humiditylong_name :Relative humidity SDunits :percentinstalled_date :2019-04-09T18:21:02.735703Zdevice_name :Rotronic AT/RH (0020208767)serial_number :0020208767last_calibrated :2017-05-10installed_height :2.3vendor_name :Rotronicmodel_name :HC2-S3nominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]BARO_PRES_MEAN(trajectory, obs)float64...standard_name :air_pressurelong_name :Air pressureunits :hPainstalled_date :2019-04-09T22:03:51.977028Zdevice_name :Vaisala Barometer (5240536)serial_number :5240536last_calibrated :2018-01-03installed_height :0.2vendor_name :Vaisalamodel_name :PTB210model_product_page :http://www.vaisala.com/en/products/pressure/Pages/PTB210.aspxnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]BARO_PRES_STDDEV(trajectory, obs)float64...standard_name :air_pressurelong_name :Air pressure SDunits :hPainstalled_date :2019-04-09T22:03:51.977028Zdevice_name :Vaisala Barometer (5240536)serial_number :5240536last_calibrated :2018-01-03installed_height :0.2vendor_name :Vaisalamodel_name :PTB210model_product_page :http://www.vaisala.com/en/products/pressure/Pages/PTB210.aspxnominal_sampling_schedule :60s on, 240s off, centered at :00update_period :1000.0[215731 values with dtype=float64]PAR_AIR_MEAN(trajectory, obs)float64...standard_name :surface_downwelling_photosynthetic_photon_flux_in_airlong_name :Photosynthetically active radiation in airunits :micromol s-1 m-2installed_date :2019-04-09T18:07:44.339577Zdevice_name :LI-COR PAR (9658)serial_number :9658last_calibrated :2018-02-27installed_height :2.6vendor_name :LI-CORmodel_name :LI-192SAmodel_product_page :https://www.licor.com/env/products/light/quantum_underwater.htmlnominal_sampling_schedule :Always onupdate_period :1000.0[215731 values with dtype=float64]PAR_AIR_STDDEV(trajectory, obs)float64...standard_name :surface_downwelling_photosynthetic_photon_flux_in_airlong_name :Photosynthetically active radiation in air SDunits :micromol s-1 m-2installed_date :2019-04-09T18:07:44.339577Zdevice_name :LI-COR PAR (9658)serial_number :9658last_calibrated :2018-02-27installed_height :2.6vendor_name :LI-CORmodel_name :LI-192SAmodel_product_page :https://www.licor.com/env/products/light/quantum_underwater.htmlnominal_sampling_schedule :Always onupdate_period :1000.0[215731 values with dtype=float64]TEMP_IR_SKY_HULL_MEAN(trajectory, obs)float64...standard_name :sky_ir_thermo_temperature_filteredlong_name :Hull Sky IR Temperatureunits :degrees_cinstalled_date :2019-05-14T22:18:38.355856Zdevice_name :Heitronics Sky IR Pyrometer (02413)serial_number :02413installed_height :0.6vendor_name :Heitronicsmodel_name :CT09.10model_product_page :https://www.heitronics.com/en/infrarot-messtechnik/produkte/radiation-thermometers/compact-series/ct09-series/nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SKY_HULL_STDDEV(trajectory, obs)float64...standard_name :sky_ir_thermo_temperature_rmslong_name :Hull Sky IR Temperature SDunits :degrees_cinstalled_date :2019-05-14T22:18:38.355856Zdevice_name :Heitronics Sky IR Pyrometer (02413)serial_number :02413installed_height :0.6vendor_name :Heitronicsmodel_name :CT09.10model_product_page :https://www.heitronics.com/en/infrarot-messtechnik/produkte/radiation-thermometers/compact-series/ct09-series/nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_HULL_UNCOMP_MEAN(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Hull Sea IR Temperatureunits :degrees_cinstalled_date :2019-05-14T22:18:43.869843Zdevice_name :Heitronics Hull IR Pyrometer (12693)serial_number :12693last_calibrated :2018-05-16installed_height :0.6vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_HULL_UNCOMP_STDDEV(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Hull Sea IR Temperature SDunits :degrees_cinstalled_date :2019-05-14T22:18:43.869843Zdevice_name :Heitronics Hull IR Pyrometer (12693)serial_number :12693last_calibrated :2018-05-16installed_height :0.6vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_WING_UNCOMP_MEAN(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Wing Sea IR Temperatureunits :degrees_cinstalled_date :2019-04-09T18:19:51.135128Zdevice_name :Heitronics Wing IR Pyrometer (12605)serial_number :12605last_calibrated :2018-03-12installed_height :2.25vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_IR_SEA_WING_UNCOMP_STDDEV(trajectory, obs)float64...standard_name :sea_surface_skin_temperaturelong_name :Wing Sea IR Temperature SDunits :degrees_cinstalled_date :2019-04-09T18:19:51.135128Zdevice_name :Heitronics Wing IR Pyrometer (12605)serial_number :12605last_calibrated :2018-03-12installed_height :2.25vendor_name :Heitronicsmodel_name :CT15.10nominal_sampling_schedule :30s on, 270s off, centered at :00update_period :1000.0[215731 values with dtype=float64]WAVE_DOMINANT_PERIOD(trajectory, obs)float64...standard_name :sea_surface_wave_period_at_variance_spectral_density_maximumlong_name :Dominant wave periodunits :sinstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]WAVE_SIGNIFICANT_HEIGHT(trajectory, obs)float64...standard_name :sea_surface_wave_significant_heightlong_name :Significant wave heightunits :minstalled_date :2019-04-09T18:18:23.573574Zdevice_name :VectorNav Hull IMU (100035683)serial_number :100035683installed_height :0.34vendor_name :VectorNavmodel_name :VN-300model_product_page :https://www.vectornav.com/products/vn-300nominal_sampling_schedule :Always onupdate_period :50.0[215731 values with dtype=float64]TEMP_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]SAL_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinityunits :1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]SAL_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinity SDunits :1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]COND_SBE37_MEAN(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivityunits :mS cm-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]COND_SBE37_STDDEV(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivity SDunits :mS cm-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]TEMP_CTD_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_CTD_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]SAL_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinityunits :1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]SAL_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_practical_salinitylong_name :Seawater salinity SDunits :1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]COND_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivityunits :mS cm-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]COND_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_electrical_conductivitylong_name :Seawater conductivity SDunits :mS cm-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_CONC_SBE37_MEAN(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentrationunits :micromol L-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_CONC_SBE37_STDDEV(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentration SDunits :micromol L-1installed_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_SAT_SBE37_MEAN(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturationunits :percentinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_SAT_SBE37_STDDEV(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturation SDunits :percentinstalled_date :2019-04-19T17:14:55.229566Zdevice_name :Sea-Bird Conductivity/Temp/ODO (20729)serial_number :20729last_calibrated :2019-04-13installed_height :-0.5vendor_name :Sea-Birdmodel_name :SBE37-SMP-ODO Microcatnominal_sampling_schedule :12s on, 588s off, centered at :00update_period :1000.0[215731 values with dtype=float64]O2_CONC_RBR_MEAN(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentrationunits :micromol L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_CONC_RBR_STDDEV(trajectory, obs)float64...standard_name :mole_concentration_of_dissolved_molecular_oxygen_in_sea_waterlong_name :Oxygen concentration SDunits :micromol L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_SAT_RBR_MEAN(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturationunits :percentinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]O2_SAT_RBR_STDDEV(trajectory, obs)float64...standard_name :fractional_saturation_of_oxygen_in_sea_waterlong_name :Oxygen saturation SDunits :percentinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_O2_RBR_MEAN(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperatureunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]TEMP_O2_RBR_STDDEV(trajectory, obs)float64...standard_name :sea_water_temperaturelong_name :Seawater temperature SDunits :degrees_cinstalled_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]CHLOR_WETLABS_MEAN(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentrationunits :microgram L-1installed_date :2019-04-19T17:16:02.129225Zdevice_name :WET Labs Fluorometer (5599)serial_number :5599last_calibrated :2019-04-02installed_height :-0.5vendor_name :WET Labsmodel_name :FLSmodel_product_page :http://www.seabird.com/eco-flnominal_sampling_schedule :12s on, 48s off, centered at :00update_period :1000.0[215731 values with dtype=float64]CHLOR_WETLABS_STDDEV(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentration SDunits :microgram L-1installed_date :2019-04-19T17:16:02.129225Zdevice_name :WET Labs Fluorometer (5599)serial_number :5599last_calibrated :2019-04-02installed_height :-0.5vendor_name :WET Labsmodel_name :FLSmodel_product_page :http://www.seabird.com/eco-flnominal_sampling_schedule :12s on, 48s off, centered at :00update_period :1000.0[215731 values with dtype=float64]CHLOR_RBR_MEAN(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentrationunits :microgram L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]CHLOR_RBR_STDDEV(trajectory, obs)float64...standard_name :mass_concentration_of_chlorophyll_in_sea_waterlong_name :Chlorophyll concentration SDunits :microgram L-1installed_date :2019-04-09T18:00:36.867996Zdevice_name :RBR CTD/ODO/Chl-A (040821)serial_number :040821last_calibrated :2018-05-16installed_height :-0.53vendor_name :RBRmodel_name :Saildrone^3nominal_sampling_schedule :12s on, 48s off, centered at :00update_period :500.0[215731 values with dtype=float64]Indexes: (1)trajectoryPandasIndexPandasIndex(Index([1037.0], dtype='float32', name='trajectory'))Attributes: (45)title :Arctic NASA MISST 2019 Missionsummary :Saildrone surface observational data for the NOPP NASA-funded Arctic MSST campaign, 5/14/2019-10/11/2019ncei_template_version :NCEI_NetCDF_Trajectory_Template_v2.0Conventions :CF-1.6, ACDD-1.3netcdf_version :4.6.3featureType :trajectorycdm_data_type :Trajectorystandard_name_vocabulary :CF Standard Name Table v58description :Saildrone NetCDF Formatcreator_name :Saildroneplatform :Saildroneinstitution :Saildronecreator_email :support@saildrone.comcreator_url :https://saildrone.com/date_created :2019-12-04T19:13:20.502874Ztime_coverage_start :2019-05-14T23:00:00.000Ztime_coverage_end :2019-10-11T18:30:00.000Ztime_coverage_resolution :PT1Mtime_coverage_duration :P149DT19H30M0Sarea :Bering and Chukchi Seasdata_mode :delayed-modedrone_id :1037id :75156naming_authority :saildrone.comuuid :9f27a3ef-b53a-4dac-af8c-f87677a2c28fproject :NASA Multi-Sensor Improved Sea Surface Temperature Projectsource :Saildronelicense :2019 CC-BY SAILDRONE Inc. All Rights Reserved. These Data and any resultant Product are the property of SAILDRONE. At SAILDRONE’s sole discretion, these Data may be used for research or educational activities only. You may not use, share or sell the Data for any other purpose including for commercial purposes, or alternatively, have any unauthorized third party use or sell the Data, either for any research, educational and/or commercial purpose(s), without the express prior consent of SAILDRONE.nodc_template_version :NODC_NetCDF_Trajectory_Template_v2.0wmo_id :4803915geospatial_lat_min :53.8444032geospatial_lat_max :75.4970304geospatial_lat_units :degrees_northgeospatial_lon_min :-168.7037952geospatial_lon_max :-146.129856geospatial_lon_units :degrees_easthistory :created post-cruise 1/2020product_version :v01.0keywords :Temperature, Salinity, Wind Vectors, Air Temperature, Humidity, Current Velocity, Saildrone, Arctic, Berring Sea, Chukchi Sea, NASA, NOAAkeywords_vocabulary :NASA/GCMDpublisher_name :Saildronepublisher_url :www.saildrone.compublisher_email :support@saildrone.comacknowledgment :Saildrone. 2019. Saildrone Arctic field campaign surface and ADCP measurements. Ver. 01.0. PO.DAAC, CA, USA. Dataset accessed [YYYY-MM-DD] at https://doi.org/10.5067/SDRON-NOPP0processing_level :Level 2", + "objectID": "quarto_text/Workshops.html#s-mode-open-data-workshop", + "href": "quarto_text/Workshops.html#s-mode-open-data-workshop", + "title": "Workshops", + "section": "2022 S-MODE Open Data Workshop", + "text": "2022 S-MODE Open Data Workshop\nhttps://espo.nasa.gov/s-mode/content/S-MODE_2022_Open_Data_Workshop - Recordings and Presentations - Github tutorials\nThe Submesoscale Ocean Dynamics and Vertical Transport Experiment (S-MODE) science team is hosted a virtual Open Data Workshop on 1 December 2022 from 11:00am – 1:00pm ET to share about the S-MODE mission, to learn about its instrumentation, and find out how to access and use its data products.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1036", - "href": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1036", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1036", - "text": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1036\n\nfig = plt.figure(figsize= (16,10))\n\nrows = 1\ncolumns = 2\nax = fig.add_subplot(rows, columns, 1, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns = subset_mean_values.plot.pcolormesh(add_colorbar = False)\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True) \nplt.title('SMAP, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\n\nax = fig.add_subplot(rows, columns, 2, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns6 = plt.scatter(sd6.longitude, sd6.latitude, s = 0.5, c = sd6.SAL_SBE37_MEAN, vmin = 25, vmax = 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True)\nplt.title('Saildrone vehicle 1036, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\nplt.savefig('salinity_comparison_sd1036.png')", + "objectID": "quarto_text/Workshops.html#swot-ocean-cloud-workshop", + "href": "quarto_text/Workshops.html#swot-ocean-cloud-workshop", + "title": "Workshops", + "section": "2022 SWOT Ocean Cloud Workshop", + "text": "2022 SWOT Ocean Cloud Workshop\nhttps://podaac.github.io/2022-SWOT-Ocean-Cloud-Workshop/\nThe goal of the workshop is to get ready for Surface Water and Ocean Topography (SWOT) and enable the (oceanography) science team to be ready for processing and handling the large volumes of SWOT SSH data in the cloud. Learning objectives focus on how to access the simulated SWOT L2 SSH data from Earthdata Cloud either by downloading or accessing the data on the cloud. PO.DAAC is the NASA archive for the SWOT mission, and once launched will be making data available via the NASA Earthdata Cloud, hosted in AWS.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1037", - "href": "notebooks/meetings_workshops/arctic_2019.html#plot-salinity-side-by-side-from-smap-and-from-saildrone-vehicle-1037", - "title": "Ocean Satellite and In-situ Comparison in the Cloud", - "section": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1037", - "text": "Plot salinity side-by-side from SMAP and from Saildrone vehicle 1037\n\nfig = plt.figure(figsize= (16,10))\n\nrows = 1\ncolumns = 2\nax = fig.add_subplot(rows, columns, 1, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns = subset_mean_values.plot.pcolormesh(add_colorbar=False)\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True) \nplt.title('SMAP, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\n\nax = fig.add_subplot(rows, columns, 2, projection=ccrs.PlateCarree())\nax.add_feature(cartopy.feature.RIVERS)\nax.coastlines()\nax.set_extent([plot_west, plot_east, plot_south, plot_north])\ns6 = plt.scatter(sd7.longitude, sd7.latitude, s = 0.5, c = sd7.SAL_SBE37_MEAN, vmin = 25, vmax = 35, cmap = 'rainbow', transform = ccrs.PlateCarree())\ngl = ax.gridlines(color='gray',alpha=0.6,draw_labels=True)\nplt.title('Saildrone vehicle 1037, May-Oct 2019')\ngl.top_labels = False\ngl.left_labels = True\ngl.right_labels = False\ngl.xformatter = LONGITUDE_FORMATTER\ngl.yformatter = LATITUDE_FORMATTER\ncb = plt.colorbar(s, ax = ax)\ncb.set_label('Salinity (PSU)')\nplt.savefig('salinity_comparison_sd1037.png')", + "objectID": "quarto_text/Workshops.html#cloud-agu-workshop", + "href": "quarto_text/Workshops.html#cloud-agu-workshop", + "title": "Workshops", + "section": "2021 Cloud AGU Workshop", + "text": "2021 Cloud AGU Workshop\nhttps://nasa-openscapes.github.io/2021-Cloud-Workshop-AGU\nThe 2021 Cloud Workshop at AGU: Enabling Analysis in the Cloud Using NASA Earth Science Data is a virtual half-day collaborative open science learning experience aimed at exploring, learning, and promoting effective cloud-based science and applications workflows using NASA Earthdata Cloud data, tools, and services (among others), in support of Earth science data processing and analysis in the era of big data.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "SSS Changes in the Arctic" + "Workshops" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#summary", - "href": "notebooks/DataStories/eof_example_ersst.html#summary", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "Summary", - "text": "Summary\nThis demo replicates part of an empirical orthogonal function (EOF) analysis on century-long, global sea surface temperatures (SSTs) published in Journal of Climate (Messie and Chavez, 2011): https://doi.org/10.1175/2011JCLI3941.1, and can be run entirely in the cloud. In this analysis, the first 6 EOF modes of global SST are investigated once signals from long term warming and the seasonal cycle are removed.\nThe EOFs are computed on Smith and Reynolds Extended Reconstructed SST dataset in netCDF4 format (available on NASA’s PO.DAAC, https://doi.org/10.5067/ERSST-L4N50), which provides monthly mean SST data gridded over the globe between 65 degrees N/S at 2 degree x 2 degree resolution. A subset of the data are taken for the period 1910 to 2008. As in Messie and Chavez (2011), the first 6 EOF’s and principal components (PC’s) are plotted (their Figures 4 and 5 respectively). We also reproduce their global map of SST variance at each gridpoint (their Fig. 2a).\nData are accessed using the earthaccess package, then loaded and preprocessed (e.g. linear trend and seasonal cycle removed) using Xarray built in functions. The EOF decomposition uses the xeofs package (https://xeofs.readthedocs.io/en/latest/).", + "objectID": "quarto_text/Workshops.html#cloud-hackathon", + "href": "quarto_text/Workshops.html#cloud-hackathon", + "title": "Workshops", + "section": "2021 Cloud Hackathon", + "text": "2021 Cloud Hackathon\nhttps://nasa-openscapes.github.io/2021-Cloud-Hackathon\nThe Cloud Hackathon: Transitioning Earthdata Workflows to the Cloud is a virtual 5-day (4 hours per day) collaborative open science learning experience aimed at exploring, creating, and promoting effective cloud-based science and applications workflows using NASA Earthdata Cloud data, tools, and services (among others), in support of Earth science data processing and analysis in the era of big data. Its goals are to:\n\nIntroduce Earth science data users to NASA Earthdata cloud-based data products, tools and services in order to increase awareness and support transition to cloud-based science and applications workflows.\nEnable science and applications workflows in the cloud that leverage NASA Earth Observations and capabilities (services) from within the NASA Earthdata Cloud, hosted in Amazon Web Services (AWS) cloud, thus increasing NASA Earthdata data utility and meaningfulness for science and applications use cases.\nFoster community engagement utilizing Earthdata cloud tools and services in support of open science and open data.", "crumbs": [ - "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Workshops" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#requirements", - "href": "notebooks/DataStories/eof_example_ersst.html#requirements", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "Requirements", - "text": "Requirements\n\ni. Compute Environment\nThis tutorial can be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine. However, accessing and loading >1000 files into local memory will take a long time, in comparison to running this notebook from AWS.\n\n\nii. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\niii. Additional Requirements\n\nIt is recommended that you have some basic familiarity with the Xarray package in Python.", + "objectID": "quarto_text/OPERA.html#background", + "href": "quarto_text/OPERA.html#background", + "title": "OPERA", + "section": "Background", + "text": "Background\nThe Observational Products for End-Users from Remote Sensing Analysis (OPERA) product suite is designed to collect data from satellite radar and optical instruments to generate three products:\n\na near-global Dynamic Surface Water Extent (DSWx) product suite\na near-global land-surface Disturbance (DIST) product suite\na North America land-surface Displacement (DISP) product suite\n\nOnly DSWx products will be distributed through PO.DAAC. More information can be found on PO.DAAC’s OPERA webpage.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "OPERA" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#learning-objectives", - "href": "notebooks/DataStories/eof_example_ersst.html#learning-objectives", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "Learning objectives", - "text": "Learning objectives\n\nReplicate results from published researched fully in the cloud.\nUse a data access workflow with the earthaccess package that can be used both locally and in the cloud.\nLoad and preprocess (e.g. linear trend and seasonal cycle removed) using Xarray built in functions.\nPerform an EOF decomposition using the xeofs package.", + "objectID": "quarto_text/OPERA.html#data-resources-tutorials", + "href": "quarto_text/OPERA.html#data-resources-tutorials", + "title": "OPERA", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nImagery Exploration\nSurface Water Extent Worldview StoryMap\nSOTO by Worldview - explore OPERA imagery in a GUI\nVideo Tutorial: Exploring OPERA Surface Water Extent Data in NASA Worldview\n\n\nSearch & Download\nVia Graphical User Interface:\nFind/download OPERA data on Earthdata Search\nVia Command Line - PO.DAAC subscriber/downloader example:\npodaac-data-subscriber -c OPERA_L3_DSWX-HLS_V1 -d ./data/OPERA_L3_DSWX-HLS_V1 --start-date 2023-04-04T00:00:00Z -e .tif\n\nSee how to Download/Subscribe for more information on how to use the PO.DAAC subscriber/downloader.\n\n\n\nWorkflow tutorials: Access & Visualization\nAWS Cloud: OPERA Dynamic Surface Water Extent (DSWx) Data - How to search for, access, visualize, and mosaic OPERA data over lake Powell while working in the cloud.\nLocal Machine: OPERA Dynamic Surface Water Extent (DSWx) Data - How to search for, download, visualize, and mosaic OPERA data over lake Powell while working on a local machine.\n\n\nGIS workflows\nStoryMap: Exploring Water Surface Extent with Satellite Data\nOPERA ArcGIS Toolbox - GitHub repository with three geoprocessing tools: OPERA Granule Download, OPERA Granule Filter, and OPERA Raster Mosaic", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "OPERA" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#additional-references", - "href": "notebooks/DataStories/eof_example_ersst.html#additional-references", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "Additional References", - "text": "Additional References\n\nThis reference was used as inspiration for implementing the analysis in Python: https://github.com/royalosyin/Python-Practical-Application-on-Climate-Variability-Studies/blob/master/ex18-EOF%20analysis%20global%20SST.ipynb\nGithub issue with information on scaling the output from the xeofs package in different ways (for example the scale of the initial EOF and PC output by xeofs do not match those of the publication, but could be recomputed to do so): https://github.com/nicrie/xeofs/issues/81", + "objectID": "quarto_text/OPERA.html#additional-resources", + "href": "quarto_text/OPERA.html#additional-resources", + "title": "OPERA", + "section": "Additional Resources", + "text": "Additional Resources\nOPERA Applications GitHub Notebooks - check out the leafmap examples!\nNASA Mission Page", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "OPERA" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#import-packages", - "href": "notebooks/DataStories/eof_example_ersst.html#import-packages", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "Import Packages", - "text": "Import Packages\nIn addition to the packages imported below, the following are also needed: * The cftime package is required to decode the dataset’s timestamps using Xarray. * The h5netcdf package should be installed as a backend for Xarray to open the data.\n\n## Version numbers listed next to each package:\n\n# Data location and access packages:\nimport earthaccess # 0.6.1\n\n# Analysis packages:\nimport xarray as xr # 2023.9.0\nimport numpy as np # 1.26.0\nimport xeofs as xe # 1.1.0\n\n# Visualization packages:\nimport matplotlib.pyplot as plt # 3.8.0\nfrom cartopy.crs import EqualEarth, PlateCarree # 0.22.0\n\n%matplotlib inline\n\n\nlibgomp: Invalid value for environment variable OMP_NUM_THREADS", + "objectID": "quarto_text/Sentinel6MF.html#background", + "href": "quarto_text/Sentinel6MF.html#background", + "title": "Sentinel-6 Michael Freilich", + "section": "Background", + "text": "Background\nThe Sentinel-6 Michael Freilich satellite measures the height of the ocean. In addition, an instrument on board the satellite uses the Global Navigation Satellite System Radio-Occultation sounding technique, which analyses changes in signals from international global navigation system satellites to determine atmospheric temperature and humidity. More information can be found on PO.DAAC’s Sentinel-6 Michael Freilich webpage.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "Sentinel-6 Michael Freilich" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#authenticate", - "href": "notebooks/DataStories/eof_example_ersst.html#authenticate", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "1.1 Authenticate", - "text": "1.1 Authenticate\n\nearthaccess.login() # Login with your credentials\n\n<earthaccess.auth.Auth at 0x7ffa83386810>", + "objectID": "quarto_text/Sentinel6MF.html#data-resources-tutorials", + "href": "quarto_text/Sentinel6MF.html#data-resources-tutorials", + "title": "Sentinel-6 Michael Freilich", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nData Access\n\nAccess in Cloud\n\nAccess by Cycle/Pass\n\nAccess Near Real-Time Data\n\nOPeNDAP Access", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "Sentinel-6 Michael Freilich" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#locate-data-files", - "href": "notebooks/DataStories/eof_example_ersst.html#locate-data-files", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "1.2 Locate data files", - "text": "1.2 Locate data files\nThe earthaccess package is used to login to locate file path endpoints and wrap them in “file-like objects” readable by Xarray, without downloading the files.\nAlthough the above study uses the time period 1910 to 2009, we instead use 1910 to 2008, since the data providers of the dataset changed the time format from 2008 onward and xarray doesn’t like trying to concatinate data files with different time formats.\n\n# Locate data file information, which includes endpoints, on Earthdata Cloud:\ndatainfo = earthaccess.search_data(\n short_name=\"REYNOLDS_NCDC_L4_MONTHLY_V5\",\n cloud_hosted=True,\n temporal=(\"1910-01-01\", \"2008-02-01\"), # We only want till end of 2007, but this ending date was required to obtain that.\n )\n\nGranules found: 1178\n\n\n\n# Generate file objects from the endpoints which are compatible with Xarray:\nfileobjs = earthaccess.open(datainfo[1:]) # The month prior to 1910-01-01 is included in the returned endpoints (bug?), so start the list at the 2nd element.\n\n Opening 1177 granules, approx size: 0.12 GB\nusing endpoint: https://archive.podaac.earthdata.nasa.gov/s3credentials\n\n\n\n\n\n\n\n\nWarning: This collection contains more than one file per granule. earthaccess will only open the first data link, try filtering the links before opening them.\n\n\n\n\n\nRemoval of one of the file objects which returned a bad result\nThese lines of code are not typically needed for other datasets, but unexpectedly earthaccess returns one endpoint for a file which does not exist. Remove this element from the file objects list:\n\n# Print the bad result just for reference:\nfileobjs_bad = [f for f in fileobjs if type(f) == FileNotFoundError]\nprint(fileobjs_bad)\n\n# Remove this bad result from the list:\nfileobjs = [f for f in fileobjs if type(f) != FileNotFoundError]\n\n[FileNotFoundError('podaac-ops-cumulus-protected/REYNOLDS_NCDC_L4_MONTHLY_V5/ersst.v5.195908.nc.1')]", + "objectID": "quarto_text/Sentinel6MF.html#additional-resources", + "href": "quarto_text/Sentinel6MF.html#additional-resources", + "title": "Sentinel-6 Michael Freilich", + "section": "Additional Resources", + "text": "Additional Resources\nNASA Mission Page", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "Sentinel-6 Michael Freilich" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#load-data", - "href": "notebooks/DataStories/eof_example_ersst.html#load-data", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "1.3 Load data", - "text": "1.3 Load data\nIf working in the cloud, loading and combining all files for this analysis into a single dataset object will take 2-4 minutes. This can be sped up using e.g. kerchunk or parallelization with remote clusters, but to simplify this notebook those methods are not implemented.\nSince we are using Xarray’s open_mfdataset() the returned object includes Dask arrays instead of NumPy arrays. The SST data is small enough that we can load it all into memory, which we will do so that we can proceed even if you are not familiar with Dask arrays (all you need to know is that we have not actually loaded the data into memory yet, so we need one more step after loading the data).\n\n%%time\n\n# Load data:\nsstdata = xr.open_mfdataset(fileobjs)\nsstdata = sstdata.squeeze() # Remove the unnecessary 'lev' dimension (size 1)\nsstdata\n\nCPU times: user 36.2 s, sys: 426 ms, total: 36.6 s\nWall time: 2min 48s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (lat: 89, lon: 180, time: 1176)\nCoordinates:\n * lat (lat) float64 -88.0 -86.0 -84.0 -82.0 -80.0 ... 82.0 84.0 86.0 88.0\n lev float64 0.0\n * lon (lon) float64 0.0 2.0 4.0 6.0 8.0 ... 350.0 352.0 354.0 356.0 358.0\n * time (time) object 1910-01-01 00:00:00 ... 2007-12-01 00:00:00\nData variables:\n sst (time, lat, lon) float32 dask.array<chunksize=(1, 89, 180), meta=np.ndarray>\n ssta (time, lat, lon) float32 dask.array<chunksize=(1, 89, 180), meta=np.ndarray>\nAttributes: (12/38)\n Conventions: CF-1.6, ACDD-1.3\n metadata_link: https://doi.org/10.7289/V5T72FNM\n id: ersst.v5.191001\n naming_authority: gov.noaa.ncei\n title: NOAA ERSSTv5 (in situ only)\n summary: ERSST.v5 is developped based on v4 after revi...\n ... ...\n platform: Ship and Buoy SSTs from ICOADS R3.0 and NCEP GTS\n instrument: Conventional thermometers\n source: In situ data: ICOADS R3.0 before 2015, NCEP i...\n comment: SSTs were observed by conventional thermomete...\n references: Huang et al, 2017: Extended Reconstructed Sea...\n climatology: Climatology is based on 1971-2000 SST, Xue, Y...xarray.DatasetDimensions:lat: 89lon: 180time: 1176Coordinates: (4)lat(lat)float64-88.0 -86.0 -84.0 ... 86.0 88.0units :degrees_northlong_name :Latitudestandard_name :latitudeaxis :Ycomment :Uniform grid from -88 to 88 by 2array([-88., -86., -84., -82., -80., -78., -76., -74., -72., -70., -68., -66.,\n -64., -62., -60., -58., -56., -54., -52., -50., -48., -46., -44., -42.,\n -40., -38., -36., -34., -32., -30., -28., -26., -24., -22., -20., -18.,\n -16., -14., -12., -10., -8., -6., -4., -2., 0., 2., 4., 6.,\n 8., 10., 12., 14., 16., 18., 20., 22., 24., 26., 28., 30.,\n 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., 52., 54.,\n 56., 58., 60., 62., 64., 66., 68., 70., 72., 74., 76., 78.,\n 80., 82., 84., 86., 88.])lev()float640.0units :meterslong_name :Depth of sea surface temperature measurementsstandard_name :depthaxis :Zpositive :down_CoordinateAxisType :Heightcomment :Actual measurement depth of in situ sea surface temperature varies from 0.2 to 10 m, but corrected to the nominal depth of buoy at 0.2 marray(0.)lon(lon)float640.0 2.0 4.0 ... 354.0 356.0 358.0units :degrees_eastlong_name :Longitudestandard_name :longitudeaxis :Xcomment :Uniform grid from 0 to 358 by 2array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20., 22.,\n 24., 26., 28., 30., 32., 34., 36., 38., 40., 42., 44., 46.,\n 48., 50., 52., 54., 56., 58., 60., 62., 64., 66., 68., 70.,\n 72., 74., 76., 78., 80., 82., 84., 86., 88., 90., 92., 94.,\n 96., 98., 100., 102., 104., 106., 108., 110., 112., 114., 116., 118.,\n 120., 122., 124., 126., 128., 130., 132., 134., 136., 138., 140., 142.,\n 144., 146., 148., 150., 152., 154., 156., 158., 160., 162., 164., 166.,\n 168., 170., 172., 174., 176., 178., 180., 182., 184., 186., 188., 190.,\n 192., 194., 196., 198., 200., 202., 204., 206., 208., 210., 212., 214.,\n 216., 218., 220., 222., 224., 226., 228., 230., 232., 234., 236., 238.,\n 240., 242., 244., 246., 248., 250., 252., 254., 256., 258., 260., 262.,\n 264., 266., 268., 270., 272., 274., 276., 278., 280., 282., 284., 286.,\n 288., 290., 292., 294., 296., 298., 300., 302., 304., 306., 308., 310.,\n 312., 314., 316., 318., 320., 322., 324., 326., 328., 330., 332., 334.,\n 336., 338., 340., 342., 344., 346., 348., 350., 352., 354., 356., 358.])time(time)object1910-01-01 00:00:00 ... 2007-12-...long_name :Start time of monthstandard_name :timeaxis :Tdelta_t :0000-01-00avg_period :0000-01-00array([cftime.Datetime360Day(1910, 1, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(1910, 2, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(1910, 3, 1, 0, 0, 0, 0, has_year_zero=True), ...,\n cftime.Datetime360Day(2007, 10, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(2007, 11, 1, 0, 0, 0, 0, has_year_zero=True),\n cftime.Datetime360Day(2007, 12, 1, 0, 0, 0, 0, has_year_zero=True)],\n dtype=object)Data variables: (2)sst(time, lat, lon)float32dask.array<chunksize=(1, 89, 180), meta=np.ndarray>long_name :Extended reconstructed sea surface temperaturestandard_name :sea_surface_temperatureunits :degree_Cvalid_min :-3.0valid_max :45.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n71.87 MiB\n62.58 kiB\n\n\nShape\n(1176, 89, 180)\n(1, 89, 180)\n\n\nDask graph\n1176 chunks in 2354 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 180 89 1176\n\n\n\n\nssta(time, lat, lon)float32dask.array<chunksize=(1, 89, 180), meta=np.ndarray>long_name :Extended reconstructed SST anomaliesunits :degree_Cvalid_min :-12.0valid_max :12.0\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n71.87 MiB\n62.58 kiB\n\n\nShape\n(1176, 89, 180)\n(1, 89, 180)\n\n\nDask graph\n1176 chunks in 2354 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 180 89 1176\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Index([-88.0, -86.0, -84.0, -82.0, -80.0, -78.0, -76.0, -74.0, -72.0, -70.0,\n -68.0, -66.0, -64.0, -62.0, -60.0, -58.0, -56.0, -54.0, -52.0, -50.0,\n -48.0, -46.0, -44.0, -42.0, -40.0, -38.0, -36.0, -34.0, -32.0, -30.0,\n -28.0, -26.0, -24.0, -22.0, -20.0, -18.0, -16.0, -14.0, -12.0, -10.0,\n -8.0, -6.0, -4.0, -2.0, 0.0, 2.0, 4.0, 6.0, 8.0, 10.0,\n 12.0, 14.0, 16.0, 18.0, 20.0, 22.0, 24.0, 26.0, 28.0, 30.0,\n 32.0, 34.0, 36.0, 38.0, 40.0, 42.0, 44.0, 46.0, 48.0, 50.0,\n 52.0, 54.0, 56.0, 58.0, 60.0, 62.0, 64.0, 66.0, 68.0, 70.0,\n 72.0, 74.0, 76.0, 78.0, 80.0, 82.0, 84.0, 86.0, 88.0],\n dtype='float64', name='lat'))lonPandasIndexPandasIndex(Index([ 0.0, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0,\n ...\n 340.0, 342.0, 344.0, 346.0, 348.0, 350.0, 352.0, 354.0, 356.0, 358.0],\n dtype='float64', name='lon', length=180))timePandasIndexPandasIndex(CFTimeIndex([1910-01-01 00:00:00, 1910-02-01 00:00:00, 1910-03-01 00:00:00,\n 1910-04-01 00:00:00, 1910-05-01 00:00:00, 1910-06-01 00:00:00,\n 1910-07-01 00:00:00, 1910-08-01 00:00:00, 1910-09-01 00:00:00,\n 1910-10-01 00:00:00,\n ...\n 2007-03-01 00:00:00, 2007-04-01 00:00:00, 2007-05-01 00:00:00,\n 2007-06-01 00:00:00, 2007-07-01 00:00:00, 2007-08-01 00:00:00,\n 2007-09-01 00:00:00, 2007-10-01 00:00:00, 2007-11-01 00:00:00,\n 2007-12-01 00:00:00],\n dtype='object', length=1176, calendar='360_day', freq='MS'))Attributes: (38)Conventions :CF-1.6, ACDD-1.3metadata_link :https://doi.org/10.7289/V5T72FNMid :ersst.v5.191001naming_authority :gov.noaa.nceititle :NOAA ERSSTv5 (in situ only)summary :ERSST.v5 is developped based on v4 after revisions of 8 parameters using updated data sets and advanced knowledge of ERSST analysisinstitution :NOAA/NESDIS/NCEI/CCOGcreator_name :Boyin Huangcreator_email :boyin.huang@noaa.govdate_created :2017-06-30T12:18:00Zdate_modified :2017-06-30T12:18:00Zproduct_version :Version 5history :Fri Jun 30 12:26:49 2017: ncatted -O -a _FillValue,ssta,o,f,-999.0 ssta.nc\nVersion 5 based on Version 4creator_url :https://www.ncei.noaa.govlicense :No constraints on data access or usetime_coverage_start :1910-01-01T00:00:00Ztime_coverage_end :1910-02-01T00:00:00Zgeospatial_lon_min :-1.0geospatial_lon_max :359.0geospatial_lat_min :-89.0geospatial_lat_max :89.0geospatial_lat_units :degrees_northgeospatial_lat_resolution :2.0geospatial_lon_units :degrees_eastgeospatial_lon_resolution :2.0spatial_resolution :2.0 degree gridcdm_data_type :Gridprocessing_level :NOAA Level 4standard_name_vocabulary :CF Standard Name Table (v40, 25 January 2017)keywords :Earth Science > Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsproject :NOAA Extended Reconstructed Sea Surface Temperature (ERSST)platform :Ship and Buoy SSTs from ICOADS R3.0 and NCEP GTSinstrument :Conventional thermometerssource :In situ data: ICOADS R3.0 before 2015, NCEP in situ GTS from 2016 to present, and Argo SST from 1999 to present. Ice data: HadISST2 ice before 2015, and NCEP ice after 2015.comment :SSTs were observed by conventional thermometers in Buckets (in sulated or un-insulated canvas and wooded buckets), Engine Room Intakers, or floats and driftersreferences :Huang et al, 2017: Extended Reconstructed Sea Surface Temperatures Version 5 (ERSSTv5): Upgrades, Validations, and Intercomparisons. Journal of Climate, https://doi.org/10.1175/JCLI-D-16-0836.1climatology :Climatology is based on 1971-2000 SST, Xue, Y., T. M. Smith, and R. W. Reynolds, 2003: Interdecadal changes of 30-yr SST normals during 1871.2000. Journal of Climate, 16, 1601-1612.\n\n\n\n# Load the SST variable into a DataArry object containing a NumPy array:\nsst = sstdata['sst'].load()", + "objectID": "quarto_text/GHRSST.html#background", + "href": "quarto_text/GHRSST.html#background", + "title": "GHRSST", + "section": "Background", + "text": "Background\nThe Group for High Resolution Sea Surface Temperature (GHRSST) was established in 2002 to foster an international focus and coordination for the development of a new generation of global, multi-sensor, high-resolution near real time SST datasets. It brings together international space agencies, research institutes, universities, and government agencies to collectively address the scientific, logistical and managerial challenges posed by creating the SST datasets and services within the Project. The overall aim of the GHRSST is to provide the best quality sea surface temperature data for applications in short, medium and decadal/climate time scales in the most cost effective and efficient manner through international collaboration and scientific innovation. More information can be found on PO.DAAC’s GHRSST webpage.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "GHRSST" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#proprocessing", - "href": "notebooks/DataStories/eof_example_ersst.html#proprocessing", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "2.1 Proprocessing", - "text": "2.1 Proprocessing\n\n# Before proceeding, remove data poleward of 65 degress lat (as in the publication):\nsst = sst.sel(lat=slice(-65, 65))", + "objectID": "quarto_text/GHRSST.html#data-resources-tutorials", + "href": "quarto_text/GHRSST.html#data-resources-tutorials", + "title": "GHRSST", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nMapping Sea Surface Temperature Anomalies to Observe Potential El Niño Conditions - Utilizes the PO.DAAC Data Downloader to download SSTA from the GHRSST MUR climatology dataset and plot on a local machine.\n\n\nParallelizing MUR Computations with Dask in the Cloud - covers the basics of using Dask for parallel computing with the MUR dataset completely in the cloud\n\n\nQGIS - Mapping Sea Surface Temperature Anomalies - how to visualize and project SSTA in QGIS.\n\n\nUsing OPeNDAP to Access the MUR Sea Surface Temperature dataset - opening and visualizing the GHRSST MUR SST dataset using OPeNDAP.\n\n\nMUR Sea Surface Temperature Analysis of Washington State - Using earthaccess to open GHRSST MUR SST dataset in the cloud over Washington State.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "GHRSST" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#linear-detrend", - "href": "notebooks/DataStories/eof_example_ersst.html#linear-detrend", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "2.2 Linear Detrend", - "text": "2.2 Linear Detrend\nCompute and remove linear trend\n\np = sst.polyfit(dim='time', deg=1) # Degree 1 polynomial fit coefficients over time for each lat, lon.\nfit = xr.polyval(sst['time'], p.polyfit_coefficients) # Compute linear trend time series at each lat, lon.\nsst_detrend = (sst - fit) # xarray is smart enough to subtract along the time dim only.\n\nTest plot of detrend results at a few locations on the globe\n\n# Find lats, lons in the dataset that are closest to a few chosen values.\ntestpoints = sst.sel(lat=[0, -30, 30, 45], lon=[0, 90, 190, 220], method='nearest')\nlat_testpoints = testpoints['lat'].data\nlon_testpoints = testpoints['lon'].data\n\n\n# Plot before, after, and detrend fit for first 200 timestamps:\nn_ts = 200\n\nfig1, axes1 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes1.flatten(), lat_testpoints, lon_testpoints):\n ax.plot(sst.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'b-', linewidth=1, label='original SST')\n ax.plot(fit.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'k--', label='linear fit')\n ax.plot(sst_detrend.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'm-', linewidth=1, label='SST detrended')\n\nfig1.text(0.5, 0.025, \"n month since \" + str(sst['time'].data[0]), ha='center', va='center', fontsize=12)\nfig1.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\naxes1[0,0].legend(fontsize=8)", + "objectID": "quarto_text/GHRSST.html#additional-resources", + "href": "quarto_text/GHRSST.html#additional-resources", + "title": "GHRSST", + "section": "Additional Resources", + "text": "Additional Resources\nGHRSST Project Page", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "GHRSST" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#remove-seasonal-cycle", - "href": "notebooks/DataStories/eof_example_ersst.html#remove-seasonal-cycle", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "2.3 Remove Seasonal Cycle", - "text": "2.3 Remove Seasonal Cycle\nComputation\n\n# Very easy to remove a daily/monthly/yearly/etc cycle using Xarray built-in function:\nseasonal_cycle = sst_detrend.groupby(\"time.month\").mean(\"time\")\nsst_nocycle = sst_detrend.groupby(\"time.month\") - seasonal_cycle\n\nCreate some confirmation plots at same test points as in Section 2.1\n\n# Mean seasonal cycle overlaid on data for first 10 years:\nfig2, axes2 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes2.flatten(), lat_testpoints, lon_testpoints):\n for i in np.arange(1,11):\n ax.plot(seasonal_cycle['month'], sst_detrend.isel(time=range(12*(i-1), 12*i)).sel(lat=lat, lon=lon), '.')\n ax.plot(seasonal_cycle['month'], seasonal_cycle.sel(lat=lat, lon=lon), 'kx-', linewidth=1)\n\nxticks = [0, 3, 6, 9, 12]\nfor ax in axes2.flatten():\n ax.set_xticks(xticks)\n ax.set_xticklabels([str(xt) for xt in xticks])\nfig2.text(0.5, 0.025, \"n month of year\", ha='center', va='center', fontsize=12)\nfig2.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\n\nText(0.05, 0.5, 'SST (K)')\n\n\n\n\n\n\n\n\n\n\n# Plot before and after cycle removal, for first 200 timestamps:\nfig3, axes3 = plt.subplots(2, 2)\nfor ax, lat, lon in zip(axes3.flatten(), lat_testpoints, lon_testpoints):\n ax.plot(sst_detrend.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'm-', linewidth=1, label='SST detrended')\n ax.plot(sst_nocycle.isel(time=range(n_ts)).sel(lat=lat, lon=lon), 'k-', linewidth=1, label='SST seasonal cycle removed')\n\nfig3.text(0.5, 0.025, \"n month since \" + str(sst['time'].data[0]), ha='center', va='center', fontsize=12)\nfig3.text(0.05, 0.5, \"SST (K)\", ha='center', va='center', fontsize=12, rotation=90)\naxes3[0,0].legend(fontsize=8)", + "objectID": "quarto_text/CloudOptimizedExamples.html", + "href": "quarto_text/CloudOptimizedExamples.html", + "title": "Cloud Optimized Examples", + "section": "", + "text": "Tutorials highlighting Cloud Optimized Formats.\n\nExample: Zarr Access for NetCDF4 Files\nThis tutorial teaches about the Zarr format and library for accessing data in the cloud, building on prior knowledge from CMR and Earthdata Login tutorials, working through an example of using the EOSDIS Zarr Store to access data using XArray.\nZarr Hackathon Tutorial\n\n\nExample: Zarr Dataset\nThis tutorial opens PO.DAAC MUR dataset in a zarr format.\nZarr-eosdid-store Library\n\n\nExample: Opening NetCDF’s in Zarr Format\nThis tutorial leverages the Zarr reformatter service (available through Harmony API) to access ocean bottom pressure (OBP) data from ECCO V4r4 in Zarr format (instead of native netCDF4 file format).\nZarr2netCDF Example", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Cloud Optimized Examples" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#variance-map", - "href": "notebooks/DataStories/eof_example_ersst.html#variance-map", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "3.1 Variance map", - "text": "3.1 Variance map\nPlot a variance map as a sanity check.\n\nsstvar = sst_nocycle.var(dim=['time'], skipna=True)\n\n/opt/coiled/env/lib/python3.11/site-packages/xarray/core/nputils.py:183: RuntimeWarning: Degrees of freedom <= 0 for slice.\n result = getattr(npmodule, name)(values, axis=axis, **kwargs)\n\n\n\nproj = EqualEarth(central_longitude=180)\nfigvar = plt.figure(figsize=(8, 4))\naxvar = plt.axes(projection=proj)\n\n\nsstvar.plot(\n vmin=0, vmax=1, # vmax of 1 used since there are a few points with anomolously high values.\n transform=PlateCarree(), \n cmap='Spectral_r', cbar_kwargs={'label': \"(\"+r\"$^\\circ$\"+\"C)$^2$\"}\n )\naxvar.coastlines(color='.5')\naxvar.set_title(\"Variance of SST anomalies\", fontsize=12)\n\nText(0.5, 1.0, 'Variance of SST anomalies')\n\n\n\n\n\n\n\n\n\n\nsst_nocycle = sst_nocycle.where(sstvar < 2, drop=False) # Remove a few points with anomolously high variances.", + "objectID": "quarto_text/ECCO.html#background", + "href": "quarto_text/ECCO.html#background", + "title": "ECCO", + "section": "Background", + "text": "Background\nThe Estimating the Circulation and Climate of the Ocean (ECCO) project makes the best possible estimates of ocean circulation and its role in climate. ECCO combines state-of-the-art ocean circulation models with global ocean data sets. More information can be found on PO.DAAC’s ECCO webpage.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "ECCO" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#fit-eof-model-and-compute-pcs-eofs-and-explained-variances", - "href": "notebooks/DataStories/eof_example_ersst.html#fit-eof-model-and-compute-pcs-eofs-and-explained-variances", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "3.2 Fit EOF model and compute PCs, EOFs, and explained variances", - "text": "3.2 Fit EOF model and compute PCs, EOFs, and explained variances\nWe fit the EOF model and compute explain variance ratios, PC’s (or as xeofs calls them “scores”), and EOF’s (xeofs calls them “components”).\n\nModel fit\n\nwgts = np.cos(np.deg2rad(sst_nocycle['lat']))**0.5 # Common practice to weight by latitude\n\n\nmodel = xe.models.EOF(\n n_modes=6,\n use_weights=True,\n standardize=False\n )\nmodel.fit(sst_nocycle, dim='time', weights=wgts)\n\n\n\nCompute PCs (scores), EOFs (components), and explained variances\n\nexpvar = model.explained_variance_ratio()\nexpvar.values\n\narray([0.15566093, 0.04830667, 0.03850468, 0.0346849 , 0.03283792,\n 0.02758786])\n\n\n\n# PC's (\"scores\"):\n# The package automatically normalizes the returned PC's. We back out the raw PC's as well (following https://github.com/nicrie/xeofs/issues/81):\nscores_normed = model.scores()\nsvals = model.singular_values()\nscores = scores_normed * svals\n\n\n# EOFs (\"components\"):\ncomponents = model.components()\n\n\n\nRescale PCs and EOFs to match publication\nSince mode=EOF*PC, we can divide a factor of c from PC if we multiply EOF by that same c. We do this here so that our amplitudes resemble those of Messie and Chavez (2011). Turns out we get the right scaling if c=50 for mode 1 and c=25 for the remaining modes.\n\ncomponents_scaled = xr.where(components['mode']==1, components*50, components*25)\nscores_scaled = xr.where(scores['mode']==1, scores/50, scores/25)", + "objectID": "quarto_text/ECCO.html#data-resources-tutorials", + "href": "quarto_text/ECCO.html#data-resources-tutorials", + "title": "ECCO", + "section": "Data Resources & Tutorials", + "text": "Data Resources & Tutorials\n\nData Access\n\nIn-cloud - Direct Access to ECCO V4r4 Datasets in the Cloud\nIn this notebook, you will learn to 1) identify Amazon Web Services (AWS) S3 endpoints corresponding to two ECCO datasets of interest, 2) retrieve your AWS credentials which provide access to PO.DAAC data in AWS, 3) load the target netCDF files into two multi-file datasets with xarray, and 4) slice and plot the datasets as animated time series using matplotlib and cartopy. The notebook finishes by writing the animations to disk as MP4 files. The two variables analyzed in this example are global monthly sea surface height (SSH) data and monthly ocean temperature flux (TFLUX) data over the Gulf of Mexico.\n\n\nLocal Machine Download - Access to ECCO V4r4 Datasets on a Local Machine\nThis is a modified version of the In-cloud Access python notebook above to batch download ECCO data on a local machine.\n\n\n\nUse Case Demo\n\nECCO Science Use Case Jupyter Notebook Demonstration\nThis tutorial will use data from the ECCO model to derive spatial correlations between sea surface temperature anomaly and sea surface height anomaly through time for two regions of the Indian Ocean. The goal is to investigate the correlative characteristics of the Indian Ocean Dipole and how the east and west regions behave differently.", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "ECCO" ] }, { - "objectID": "notebooks/DataStories/eof_example_ersst.html#plot-eofs-and-pcs", - "href": "notebooks/DataStories/eof_example_ersst.html#plot-eofs-and-pcs", - "title": "EOF decomposition of global monthly SST data using the xeofs package", - "section": "3.3 Plot EOFs and PC’s", - "text": "3.3 Plot EOFs and PC’s\n\n## EOFs\n\nfig4 = plt.figure(figsize=(12, 8))\naxes4 = []\nproj = EqualEarth(central_longitude=180)\nfor i in range(1, 7):\n axes4.append(plt.subplot(3, 2, i, projection=proj))\n\n\nfor ax in axes4:\n ax.coastlines(color='.5')\n\n\nfor i, ax in zip(range(1,7), axes4):\n components_scaled.sel(mode=i).plot(\n ax=ax, vmin=-2, vmax=2, add_labels=False,\n transform=PlateCarree(), \n cmap='seismic', cbar_kwargs={'label': \"(\"+r\"$^\\circ$\"+\"C)\"}\n \n )\n ax.set_title(\"Mode \"+str(i)+\": \"+str(round(expvar.values[i-1]*100, 1))+\"%\", fontsize=12)\n\n\n\n\n\n\n\n\n\n## PC's\n\n# The format of the ERSST timestamps cannot be read by matplotlib without additional packages.\n# Instead, convert them to numpy.datetime64:\ntimestamps_np = [np.datetime64(str(t)) for t in sst['time'].data]\n\nfig5, axes5 = plt.subplots(6, 1, figsize=(10,10))\n\nzeroline = np.zeros(len(timestamps_np)) # For use with matplotlib's fill_between()\nfor i, ax in zip(range(1, 7), axes5):\n scores_i = scores_scaled.sel(mode=i).values\n pos_score = scores_i > 0\n ax.fill_between(timestamps_np, scores_i, zeroline, where=pos_score, facecolor='lightcoral', interpolate=True)\n ax.fill_between(timestamps_np, scores_i, zeroline, where=~pos_score, facecolor='royalblue', interpolate=True)\n ax.plot(timestamps_np, scores_i, color='lightgrey', linewidth=0.5)\n \n ax.grid(axis='x')\n ax.set_xlabel(\"year\", fontsize=12)\n ax.set_ylabel(\"M\"+str(i)+\": \"+str(round(expvar.values[i-1]*100, 1))+\"%\", fontsize=12)", + "objectID": "quarto_text/ECCO.html#additional-resources", + "href": "quarto_text/ECCO.html#additional-resources", + "title": "ECCO", + "section": "Additional Resources", + "text": "Additional Resources\nECCO Project Website\nData in Action: Unveiling small-scale ocean circulation through high-resolution Sea Surface Height", "crumbs": [ "Tutorials", - "Science Data Stories", - "Monthly SST EOF Decomposition" + "Dataset Specific", + "ECCO" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html", - "href": "notebooks/Tutorials_TEMPLATE.html", - "title": "Tutorial Title", + "objectID": "quarto_text/Dask_Coiled.html", + "href": "quarto_text/Dask_Coiled.html", + "title": "Dask and Coiled", "section": "", - "text": "Internal Note:\nor", + "text": "Notebooks\n\nIntroduction to Dask Tutorial - covers the basics of using Dask for parallel computing with NASA Earth Data completely in the cloud\nDask Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using dask.delayed(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC.\nDask Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are performed on a single VM with a local Dask cluster.\nCoiled Function Replication Example - demonstrates a more complex example of replicating a function over many files in parallel using coiled.function(). The example analysis generates spatial correlation maps of sea surface temperature vs sea surface height, using data sets available on PO.DAAC. This replicates the analysis from the Dask Function Replication Example, but changes the method of parallel computation. Instead of using a local cluster on a single VM (Dask), many VM’s are combined into a distributed cluster (Coiled).\nCoiled Dataset Chunking Example - demonstrates a more complex example of applying computations to a large dataset via chunking and parallel computing. The example analysis generates seasonal cycles of sea surface temperature off the west coast of the U.S.A for a decade of ultra-high resolution data. Parallel computations are distributed over many VM’s using Coiled’s coiled.cluster().", "crumbs": [ - "Contribute", - "Tutorial Template" + "Advanced Cloud", + "Dask and Coiled" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html#summary", - "href": "notebooks/Tutorials_TEMPLATE.html#summary", - "title": "Tutorial Title", - "section": "Summary", - "text": "Summary\n[Add summary/tutorial description here]", + "objectID": "quarto_text/Tutorials.html#tutorial-categories", + "href": "quarto_text/Tutorials.html#tutorial-categories", + "title": "Tutorials", + "section": "Tutorial Categories", + "text": "Tutorial Categories\n\nDataset Specific Examples\n\n\nGIS\n\n\nCloud vs. Local Workflows\n\n\nScience Data Stories\n\n\nCloud Optimized Examples", "crumbs": [ - "Contribute", - "Tutorial Template" + "Tutorials" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html#requirements", - "href": "notebooks/Tutorials_TEMPLATE.html#requirements", - "title": "Tutorial Title", - "section": "Requirements", - "text": "Requirements\n\n1. Compute environment\ninternal note (remove this note in final tutorial): keep one or both of these Req 1 depending on environment required to run the noteook\nThis tutorial can be run in the following environments: - AWS instance running in us-west-2: NASA Earthdata Cloud data in S3 can be directly accessed via temporary credentials; this access is limited to requests made within the US West (Oregon) (code: us-west-2) AWS region. - Local compute environment e.g. laptop, server: this tutorial can be run on your local machine\n\n\n2. Earthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. Please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up.\n\n\n3. Additional Requirements\nAny other requirements needed for reproducing this tutorial.", + "objectID": "quarto_text/ScienceDataStories.html#pairing-cloud-and-non-cloud-data", + "href": "quarto_text/ScienceDataStories.html#pairing-cloud-and-non-cloud-data", + "title": "Science Data Stories", + "section": "Pairing Cloud and Non-cloud Data", + "text": "Pairing Cloud and Non-cloud Data\nTutorials highlighting workflows that utilize both cloud and non-cloud data simultaneously.\n\nMississippi River Heights Exploration - Tutorial\nThis tutorial explores the relationships between satellite and in situ river heights in the Mississippi River using Pre-SWOT MEaSUREs and USGS river height gauges within the cloud.\n\n\nSea Surface Temperature Ocean Satellite & In-situ Comparison - Tutorial\nThis tutorial co-locates in-situ measurements and satellite data of sea surface temperature (SST) near the European coast for cross-validation of data or model validation. Datasets: Argo floats, MODIS-Aqua L2 SST, & MUR L4 SST.", "crumbs": [ - "Contribute", - "Tutorial Template" + "Tutorials", + "Science Data Stories" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html#learning-objectives", - "href": "notebooks/Tutorials_TEMPLATE.html#learning-objectives", - "title": "Tutorial Title", - "section": "Learning Objectives", - "text": "Learning Objectives\n\nenter objective\nenter objective\n…", + "objectID": "quarto_text/Contribute.html#make-suggestions-or-add-tutorials", + "href": "quarto_text/Contribute.html#make-suggestions-or-add-tutorials", + "title": "Contribute", + "section": "Make Suggestions or Add Tutorials!", + "text": "Make Suggestions or Add Tutorials!\nThese instructions are for anyone that would like to contribute tutorials that utilize (in part) NASA Earthdata to the PO.DAAC Cookbook. If you have cloned the PO.DAAC tutorials GitHub repository with all of the PO.DAAC Cookbook Notebooks, you can make changes on your copy of the tutorials and then create a pull request that will be reviewed by our team to potentially add your content. Follow these intructions on how to create a pull request in GitHub. If adding a new tutorial, within the Pull Request, state the section of the Cookbook you think your content would fit best and a member of PO.DAAC may link the tutorial so it renders within the Cookbook.\nAdded content will only be accepted if it follows these guidlines:\n\nFor Jupyter Notebook Tutorials, follow this template as a standard.\nFor tutorials outside of Jupyter Notebooks, the format must have the following sections:\n\nTitle\nAuthor Name/Affiliation\nSummary\nRequirements (the compute environment used, requirements to run the notebook (needed packages etc.))\nLearning Objectives\n\nThe tutorial must be tested successfully and reviewed by a PO.DAAC member non-author. (This will be done before merging the pull request.)", "crumbs": [ - "Contribute", - "Tutorial Template" + "Contribute" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html#import-packages", - "href": "notebooks/Tutorials_TEMPLATE.html#import-packages", - "title": "Tutorial Title", - "section": "Import Packages", - "text": "Import Packages\n\n# e.g. \nimport earthaccess\nimport xarray as xr", + "objectID": "quarto_text/Contribute.html#instructions-for-po.daac-contributors", + "href": "quarto_text/Contribute.html#instructions-for-po.daac-contributors", + "title": "Contribute", + "section": "Instructions for PO.DAAC Contributors", + "text": "Instructions for PO.DAAC Contributors\n\nHow the Cookbook was Built\nThe PO.DAAC Cookbook is built using Quarto. To build this particular Quarto book, we used these instructions from NASA Openscapes. It’s a Quarto book tutorial on how to copy (fork or download) an existing Quarto website like this one and adapt it for your own uses.\n\n\nSetting up your Work Station\nAdmittedly, there are many ways to set up your work station to effectively accomplish contributing to or editing the PO.DAAC Cookbook quarto website. Steps 1, 2, 4, and 6 are universal to edit the cookbook, but steps 3 and 5 can have variations. The following is a method we have found to be helpful:\n1. Creat a GitHub Account - If you do not have one already, create a GitHub account here: https://github.com/.\n2. Join a team on the podaac repository - Once you have a GitHub account, in the podaac repository, request to join the PO.DAAC team that best suits your position here. This will give you the permissions required to contribute as a PO.DAAC Member.\n3. Set Up your Coding Workspace - On a local machine, I tend to deploy Jupyter Lab (where I do most of my coding) from Anaconda Navigator. RStudio, VS Code, etc. could also work, depending on which you prefer. The workflow would also work on a cloud environment, where I also tend to use the Jupyter Lab interface.\n4. Install Quarto - download and install Quarto’s latest version here.\n5. Pick your Prefered Method to Interface with GitHub in your Workspace - GitHub Desktop makes it easy for me to track my changes and create Pull Requests without needing to remember commands in a the command line interface. If you prefer to use the command line, this is a comprehensive and maintained list of git commands that may be useful.\n6. Clone the podaac/tutorials GitHub Repository - Instructions to do this are in the Tech Guides Section of this Cookbook. If using GitHub Desktop, say no when it asks you if you would like to fork the repository. A fork creates a completely independent copy of the repository while a clone creates a linked copy that will continue to synchronize with the tutorials repository.\nIf you’ve completed the above, you should have all the necessary ingredients to contribute to the PO.DAAC Cookbook!\n\n\nTutorials Repository Organization\nEach chapter in our Cookbook is a separate .qmd markdown file within the quarto_text directory. The notebooks directory holds all of our internal tutorials that get rendered in the Cookbook. images contains all figures embedded within the Cookbook files.\nThe Cookbook structure (i.e. the order of sections and chapters) is determined in the _quarto.yml file in the root directory. We can shuffle chapter order by editing the _quarto.yml file, and add new chapters by adding to the _quarto.yml and creating a new file in the appropriate sub-directory that is indicated in _quarto.yml.\n\n\nHow to Edit Cookbook Content\n1. Create a New Branch in GitHub - In a GitHub repository, the main source of code for that repo is deployed in what is called the “Master” branch. This is the branch that the PO.DAAC Cookbook is rendered from. To edit, creating a new branch is important so changes are not overwritten on the master branch if another individual is working on the same file as you. It helps to have your own branch to work on (named however you like) to make changes and then merge those changes with the master branch after changes are done. After merging, it is common practice to delete the branch you created. I like to create a new branch from GitHub Desktop like so:\n\n\n\n\n\n2. Navigate to the tutorials Folder in your Coding Workspace - once you’ve created a new branch, any code you modify in your coding workspace from the repository you cloned should have tracked changes in your new branch. You can open any file in the tutorials folder and start editing! Here is what my Jupyter Lab workspace looks like:\n\n\n\n\n\n3. Tip for Previewing Changes in the Cookbook - To implement changes in the actual Cookbook, usually those changes need to be committed to your new branch and pulled into the master branch using a Pull Request (outlined below). Most of the time though, it is nice to see what your changes would look like visually in the Cookbook before you commit to them. To open up a preview page of the cookbook from your workspace, open up the terminal and change the directory to your tutorials folder location. Once there, type in quarto preview and another tab should open up in your browser that changes every time you save a change to your files. Here is a screenshot of my terminal opening the preview session:\n\n\n\n\n\nNote: the warnings about external files are fine. We do not host the external files in our repo, but link to them from other repos around GitHub, so they will not be rendered in the preview session. They will render in the actual Cookbook when your branch is merged with the master branch.\n4. Open the File you Wish to Edit - Most text within the Cookbook can be found in a .qmd file within the quarto_text folder\n5. Make Edits - GitHub should track your changes automatically. For example below, I have opened the ‘Contribute.qmd’ file in my Jupyter Lab and in the GitHub Desktop application, it shows all of the changes I have made in green and the old version in red. Here, I changed the text describing tutorial guidelines. Here is a helpful guide for Markdown Basics in Quarto.\n\n\n\n\n\n6. Commit Changes to your Branch and Push to Origin - I like to use GitHub Desktop for this, but you can also use the terminal using git commands.\n\n\n\n\n\n7. Create a Pull Request to Merge your Branch with the Master Branch - From the GitHub Desktop, you can then select “Create Pull Request” and it should open a browser window taking you to the tutorials repository in GitHub. In that browser window, if the information is not already populated from your commit, Add a descriptive title, outline any changes made, add reviewers within PO.DAAC that you think would be able to review your notebook, and then press “Create pull request.” A reviewer will look over your changes and either give feedback on improvements to be made before merging is enabled or accept the changes and merge your branch into the master branch.\n\n\n\n\n\n8. Delete your Branch after Merge is Complete - it is common practice to delete old branches and start again with new branches for new edits.\n\n\nHow to Add Tutorials and Display them in the Cookbook\nAdding tutorials to the podaac/tutorials GitHub repository as a PO.DAAC Contributor should follow the same instructions as those outside of PO.DAAC. See above.\nAfter a tutorial has been added to the repository, however, in order for it to display in the Cookbook, a couple more files need to be updated:\n1. The _quarto.yml file - This file is essentially the table of contents of the PO.DAAC Cookbook, telling quarto where to place a tutorial or file in the Cookbook. Write the path of the added tutorial in the appropriate desired location.\n2. The specific landing page .qmd file - This is the .qmd file that houses the section the tutorial will be in. I usually link the added tutorial on this homepage for the section.\nFor Example, here is a screenshot of the current ECCO portion of the _quarto.yml file and the ECCO.qmd file. The Use Case Demo notebook is hightlighted in both places it is linked. The notebook sits under multiple sections, first and formost, the “Tutorials” Section, and within that, the “Dataset Specific Examples” Section and finally, the “ECCO” page. In the .yml file, we gave the tutorial a title after the “text:” portion, which will be visible on the left hand side table of contents in the rendered Cookbook. Underneath the title, the notebook GitHub path is written out after “href:” as shown. The ECCO.qmd file hosts the information regarding the available ECCO tutorials, and somewhere within this page, the new tutorial should be linked. Note: this link may have a slightly different path starting point than the .yml file because the .qmd files are within a subfolder of the tutorials repo. You will likely need to add a “../” before the path in the .qmd file.\n\n\n\n\n\n\nGuidance for Dataset Specific Tutorials Section\nOnce a couple tutorials have been created for a particular mission, it is useful to add a page under the “Dataset Specific Tutorials” Section in the Cookbook for the tutorials. To add one, create a .qmd file in the quarto_text folder with the mission name as the file name. A good example for this would be the ECCO.qmd file or the SWOT.qmd file. Each Dataset Specific Landing Page should have the following sections:\n\nTitle of Mission\nBackground - a brief over view of the mission and products that links to the PO.DAAC webpage for the mission\nData Resources & Tutorials - this section can have sub-sections grouping resources)\nAdditional Resources - links to workshops or other useful materials relating to the mission)\n\n\n\n\nHow to Link to Notebook Tutorials Hosted in Other Repositories\nWe can include remote notebooks in the Cookbook by explicitly importing them with the following steps. This will create a local copy of them that have additional preamble inserted that includes the original urls and attribution for the notebook.\n\nNavigate to the _import directory.\nOpen assets.json in a text editor. Copy an existing example and use the same structure to indicate the remote notebook you’d like to include. You can write Markdown in the preamble.\n\ntitle: this will be the new title of the notebook\npreamble: this text will be inserted into the notebook below the new title. It should include any description and attribution of the notebook. The preamble is followed by two URL fields (next):\nsource: the url landing page of the specific notebook.\nurl: the raw url of the notebook. (i.e. it usually starts with https://raw.githubusercontent.com/ and can be found by clicking the raw button at the top of a GitHub file)\ntarget: the local filename to give the notebook. The notebook will be saved in the external folder in the root directory.\nprocess: true or false: whether or not to include the entire entry when running the quarto_import.py script\n\nAfter these updates to _import/assets.json, do the following in the terminal, which will return a confirmation of the file that has been processed:\n\ncd _import\nconda env update -f environment.yml\nconda activate quarto-import\npython quarto_import.py -f assets.json\n\nThen update _quarto.yml by adding your file (external/<target>) to the appropriate location in the Cookbook. Also link the external notebook in any .qmd file landing pages that are necessary (See “How to Add Tutorials and Display them in the Cookbook” above).", "crumbs": [ - "Contribute", - "Tutorial Template" + "Contribute" ] }, { - "objectID": "notebooks/Tutorials_TEMPLATE.html#authenticate", - "href": "notebooks/Tutorials_TEMPLATE.html#authenticate", - "title": "Tutorial Title", - "section": "Authenticate", - "text": "Authenticate\nAuthenticate your Earthdata Login (EDL) information using the earthaccess python package as follows:\n\nearthaccess.login() # Login with your EDL credentials if asked\n\n\nDisclaimer: Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not constitute or imply its endorsement by the United States Government or the Jet Propulsion Laboratory, California Institute of Technology.", + "objectID": "quarto_text/Contribute.html#questions-about-the-contribute-process", + "href": "quarto_text/Contribute.html#questions-about-the-contribute-process", + "title": "Contribute", + "section": "Questions about the contribute process?", + "text": "Questions about the contribute process?\nCreate an issue on our tutorials Issues GitHub page.", "crumbs": [ - "Contribute", - "Tutorial Template" + "Contribute" ] }, { - "objectID": "notebooks/opendap/MUR-OPeNDAP.html", - "href": "notebooks/opendap/MUR-OPeNDAP.html", - "title": "OPeNDAP Access", + "objectID": "quarto_text/Webinars.html", + "href": "quarto_text/Webinars.html", + "title": "Webinars", "section": "", - "text": "From the PO.DAAC Cookbook, to access the GitHub version of the notebook, follow this link.\n\n\nOPeNDAP Access\n\nNotebook Objectives:\n\nSearch the common metadata repository (CMR) for the MUR dataset\nObtain OPeNDAP links from CMR search\nDownload data from OPeNDAP links and open via xarray to visualize data\n\n\n#https://ghrc.nsstc.nasa.gov/opendap/globalir/data/2020/0525/globir.20146.0000\nfrom netCDF4 import Dataset\nimport xarray as xr\nimport dask\nimport os\nimport requests\nimport earthaccess\n\n#Allows us to visualize the dask progress for parallel operations\nfrom dask.diagnostics import ProgressBar\nProgressBar().register()\n\n\n\nEarthdata Login\nAn Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don’t already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use earthaccess to authenticate your login credentials below.\n\nauth = earthaccess.login()\n\n\n\nRequest link for OPeNDAP\n\n#CMR Link to use\n#https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=C1625128926-GHRC_CLOUD&temporal=2019-01-01T10:00:00Z,2019-12-31T23:59:59Z\nr = requests.get('https://cmr.earthdata.nasa.gov/search/granules.umm_json?collection_concept_id=C1996881146-POCLOUD&temporal=2019-01-01T10:00:00Z,2019-02-01T00:00:00Z&pageSize=365')\nresponse_body = r.json()\n\n\nod_files = []\nfor itm in response_body['items']:\n for urls in itm['umm']['RelatedUrls']:\n if 'OPeNDAP' in urls['Description']:\n od_files.append(urls['URL'])\n\nod_files\n \n\n['https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190103090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190104090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190105090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190106090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190107090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190108090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190109090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190110090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190111090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190112090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190113090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190114090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190116090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190117090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190118090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190119090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190120090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190121090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190122090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190123090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190124090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190125090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190126090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190127090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190128090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190129090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190130090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190131090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1',\n 'https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190201090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1']\n\n\n\nlen(od_files)\n\n32\n\n\n\nfor f in od_files:\n print (\" opening \" + f)\n data_url = f'{f}.dap.nc4'\n \n \n # The notation below is [start index, step, end index]\n # lat[ /lat= 0..17998] start index. = -90\n # lon[ /lon= 0..35999] start index. = -180\n # time[ /time= 0..0] \n required_variables = {'analysed_sst[0:1:0][000:1:9000][000:1:9000]',\n 'analysis_error[0:1:0][000:1:9000][000:1:9000]',\n 'lat[000:1:9000]',\n 'lon[000:1:9000]',\n 'time[0:1:0]'}\n\n #upper latitude, left longitude, lower latitude, right longitude\n\n basename = os.path.basename(data_url)\n request_params = {'dap4.ce': ';'.join(required_variables)}\n #identity encoding to work around an issue with server side response compression (??)\n response = requests.get(data_url, params=request_params, headers={'Accept-Encoding': 'identity'})\n\n if response.ok:\n with open(basename, 'wb') as file_handler:\n file_handler.write(response.content)\n else:\n print(f'Request failed: {response.text}')\n\n\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190103090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190104090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190105090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190106090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190107090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190108090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190109090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190110090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190111090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190112090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190113090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190114090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190115090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190116090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190117090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190118090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190119090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190120090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190121090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190122090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190123090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190124090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190125090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190126090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190127090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190128090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190129090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190130090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190131090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n opening https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190201090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1\n\n\n\nimport xarray as xr\ncloud_data = xr.open_mfdataset('*.dap.nc4', engine='h5netcdf')\n\n\ncloud_data\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 32, lat: 9001, lon: 9001)\nCoordinates:\n * lat (lat) float32 -89.99 -89.98 -89.97 -89.96 ... -0.01 0.0 0.01\n * lon (lon) float32 -180.0 -180.0 -180.0 ... -90.01 -90.0 -89.99\n * time (time) datetime64[ns] 2019-01-01T09:00:00 ... 2019-02-01T...\nData variables:\n analysed_sst (time, lat, lon) float32 dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>\n analysis_error (time, lat, lon) float32 dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>\nAttributes: (12/48)\n Conventions: CF-1.5\n title: Daily MUR SST, Final product\n summary: A merged, multi-sensor L4 Foundation SST anal...\n references: http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...\n institution: Jet Propulsion Laboratory\n history: created at nominal 4-day latency; replaced nr...\n ... ...\n publisher_name: GHRSST Project Office\n publisher_url: http://www.ghrsst.org\n publisher_email: ghrsst-po@nceo.ac.uk\n processing_level: L4\n cdm_data_type: grid\n history_json: [{\"$schema\":\"https:\\/\\/harmony.earthdata.nasa...xarray.DatasetDimensions:time: 32lat: 9001lon: 9001Coordinates: (3)lat(lat)float32-89.99 -89.98 -89.97 ... 0.0 0.01long_name :latitudestandard_name :latitudeaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :noneorigname :latfullnamepath :/latarray([-8.999e+01, -8.998e+01, -8.997e+01, ..., -1.000e-02, 0.000e+00,\n 1.000e-02], dtype=float32)lon(lon)float32-180.0 -180.0 ... -90.0 -89.99long_name :longitudestandard_name :longitudeaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :noneorigname :lonfullnamepath :/lonarray([-179.99, -179.98, -179.97, ..., -90.01, -90. , -89.99],\n dtype=float32)time(time)datetime64[ns]2019-01-01T09:00:00 ... 2019-02-...long_name :reference time of sst fieldstandard_name :timeaxis :Tcomment :Nominal time of analyzed fieldsorigname :timefullnamepath :/timearray(['2019-01-01T09:00:00.000000000', '2019-01-02T09:00:00.000000000',\n '2019-01-03T09:00:00.000000000', '2019-01-04T09:00:00.000000000',\n '2019-01-05T09:00:00.000000000', '2019-01-06T09:00:00.000000000',\n '2019-01-07T09:00:00.000000000', '2019-01-08T09:00:00.000000000',\n '2019-01-09T09:00:00.000000000', '2019-01-10T09:00:00.000000000',\n '2019-01-11T09:00:00.000000000', '2019-01-12T09:00:00.000000000',\n '2019-01-13T09:00:00.000000000', '2019-01-14T09:00:00.000000000',\n '2019-01-15T09:00:00.000000000', '2019-01-16T09:00:00.000000000',\n '2019-01-17T09:00:00.000000000', '2019-01-18T09:00:00.000000000',\n '2019-01-19T09:00:00.000000000', '2019-01-20T09:00:00.000000000',\n '2019-01-21T09:00:00.000000000', '2019-01-22T09:00:00.000000000',\n '2019-01-23T09:00:00.000000000', '2019-01-24T09:00:00.000000000',\n '2019-01-25T09:00:00.000000000', '2019-01-26T09:00:00.000000000',\n '2019-01-27T09:00:00.000000000', '2019-01-28T09:00:00.000000000',\n '2019-01-29T09:00:00.000000000', '2019-01-30T09:00:00.000000000',\n '2019-01-31T09:00:00.000000000', '2019-02-01T09:00:00.000000000'],\n dtype='datetime64[ns]')Data variables: (2)analysed_sst(time, lat, lon)float32dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperatureunits :kelvinvalid_min :-32767valid_max :32767comment :\\\"Final\\\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAForigname :analysed_sstfullnamepath :/analysed_sst\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.66 GiB\n4.00 MiB\n\n\nShape\n(32, 9001, 9001)\n(1, 1024, 1024)\n\n\nDask graph\n2592 chunks in 65 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 9001 9001 32\n\n\n\n\nanalysis_error(time, lat, lon)float32dask.array<chunksize=(1, 1024, 1024), meta=np.ndarray>long_name :estimated error standard deviation of analysed_sstunits :kelvinvalid_min :0valid_max :32767comment :noneorigname :analysis_errorfullnamepath :/analysis_error\n\n\n\n\n\n\n\n\n\n\n\nArray\nChunk\n\n\n\n\nBytes\n9.66 GiB\n4.00 MiB\n\n\nShape\n(32, 9001, 9001)\n(1, 1024, 1024)\n\n\nDask graph\n2592 chunks in 65 graph layers\n\n\nData type\nfloat32 numpy.ndarray\n\n\n\n\n 9001 9001 32\n\n\n\n\nIndexes: (3)latPandasIndexPandasIndex(Float64Index([ -89.98999786376953, -89.9800033569336,\n -89.97000122070312, -89.95999908447266,\n -89.94999694824219, -89.94000244140625,\n -89.93000030517578, -89.91999816894531,\n -89.91000366210938, -89.9000015258789,\n ...\n -0.07999999821186066, -0.07000000029802322,\n -0.05999999865889549, -0.05000000074505806,\n -0.03999999910593033, -0.029999999329447746,\n -0.019999999552965164, -0.009999999776482582,\n 0.0, 0.009999999776482582],\n dtype='float64', name='lat', length=9001))lonPandasIndexPandasIndex(Float64Index([-179.99000549316406, -179.97999572753906, -179.97000122070312,\n -179.9600067138672, -179.9499969482422, -179.94000244140625,\n -179.92999267578125, -179.9199981689453, -179.91000366210938,\n -179.89999389648438,\n ...\n -90.08000183105469, -90.06999969482422, -90.05999755859375,\n -90.05000305175781, -90.04000091552734, -90.02999877929688,\n -90.0199966430664, -90.01000213623047, -90.0,\n -89.98999786376953],\n dtype='float64', name='lon', length=9001))timePandasIndexPandasIndex(DatetimeIndex(['2019-01-01 09:00:00', '2019-01-02 09:00:00',\n '2019-01-03 09:00:00', '2019-01-04 09:00:00',\n '2019-01-05 09:00:00', '2019-01-06 09:00:00',\n '2019-01-07 09:00:00', '2019-01-08 09:00:00',\n '2019-01-09 09:00:00', '2019-01-10 09:00:00',\n '2019-01-11 09:00:00', '2019-01-12 09:00:00',\n '2019-01-13 09:00:00', '2019-01-14 09:00:00',\n '2019-01-15 09:00:00', '2019-01-16 09:00:00',\n '2019-01-17 09:00:00', '2019-01-18 09:00:00',\n '2019-01-19 09:00:00', '2019-01-20 09:00:00',\n '2019-01-21 09:00:00', '2019-01-22 09:00:00',\n '2019-01-23 09:00:00', '2019-01-24 09:00:00',\n '2019-01-25 09:00:00', '2019-01-26 09:00:00',\n '2019-01-27 09:00:00', '2019-01-28 09:00:00',\n '2019-01-29 09:00:00', '2019-01-30 09:00:00',\n '2019-01-31 09:00:00', '2019-02-01 09:00:00'],\n dtype='datetime64[ns]', name='time', freq=None))Attributes: (48)Conventions :CF-1.5title :Daily MUR SST, Final productsummary :A merged, multi-sensor L4 Foundation SST analysis product from JPL.references :http://podaac.jpl.nasa.gov/Multi-scale_Ultra-high_Resolution_MUR-SSTinstitution :Jet Propulsion Laboratoryhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.\n2024-03-12 23:18:44 GMT hyrax-1.17.0-3 https://opendap.earthdata.nasa.gov/providers/POCLOUD/collections/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)/granules/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.dap.nc4?dap4.ce=analysed_sst%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blon%5B000%3A1%3A9000%5D%3Btime%5B0%3A1%3A0%5D%3Banalysis_error%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blat%5B000%3A1%3A9000%5D\ncomment :MUR = \\\"Multi-scale Ultra-high Reolution\\\"license :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR-JPL-L4-GLOB-v04.1naming_authority :org.ghrsstproduct_version :04.1uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66gds_version_id :2.0netcdf_version_id :4.1date_created :20190110T004403Zstart_time :20190101T090000Zstop_time :20190101T090000Ztime_coverage_start :20181231T210000Ztime_coverage_end :20190101T210000Zfile_quality_level :3source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRR19_G-NAVO, AVHRRMTA_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, NOAA-19, MetOp-A, Buoys/Shipssensor :MODIS, AMSR2, AVHRR, in-situMetadata_Conventions :Unidata Observation Dataset v1.0metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR-JPL-L4-GLOB-v04.1keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionsouthernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0spatial_resolution :0.01 degreesgeospatial_lat_units :degrees northgeospatial_lat_resolution :0.01 degreesgeospatial_lon_units :degrees eastgeospatial_lon_resolution :0.01 degreesacknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs program.creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govproject :NASA Making Earth Science Data Records for Use in Research Environments (MEaSUREs) Programpublisher_name :GHRSST Project Officepublisher_url :http://www.ghrsst.orgpublisher_email :ghrsst-po@nceo.ac.ukprocessing_level :L4cdm_data_type :gridhistory_json :[{\"$schema\":\"https:\\/\\/harmony.earthdata.nasa.gov\\/schemas\\/history\\/0.1.0\\/history-0.1.0.json\",\"date_time\":\"2024-03-12T23:18:44.042+0000\",\"program\":\"hyrax\",\"version\":\"1.17.0-3\",\"parameters\":[{\"request_url\":\"https:\\/\\/opendap.earthdata.nasa.gov\\/providers\\/POCLOUD\\/collections\\/GHRSST%20Level%204%20MUR%20Global%20Foundation%20Sea%20Surface%20Temperature%20Analysis%20(v4.1)\\/granules\\/20190101090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.dap.nc4?dap4.ce=analysed_sst%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blon%5B000%3A1%3A9000%5D%3Btime%5B0%3A1%3A0%5D%3Banalysis_error%5B0%3A1%3A0%5D%5B000%3A1%3A9000%5D%5B000%3A1%3A9000%5D%3Blat%5B000%3A1%3A9000%5D\"},{\"decoded_constraint\":\"dap4.ce=analysed_sst[0:1:0][000:1:9000][000:1:9000];lon[000:1:9000];time[0:1:0];analysis_error[0:1:0][000:1:9000][000:1:9000];lat[000:1:9000]\"}]}]\n\n\n\n#Histogram\ncloud_data['analysed_sst'].plot()\n\n\n# Choose one time segment, plot the data\ncloud_data['analysed_sst'].isel(time=4).plot()\n\n\n#Plot a single point over time\ncloud_data['analysed_sst'].isel(lat=7000, lon=7000).plot()", + "text": "2024: Accessing Data for the World’s Water with SWOT - Learn how to discover, access, and use Surface Water and Ocean Topography (SWOT) mission data and how these data can lead to new, innovative science and applications in the world of water.\n2023: From Ocean to Cloud—Enabling Workflows and Data Utilization - This webinar describes how to set up and use cloud services to run analyses on physical oceanography data at NASA’s PO.DAAC.\n2022: Moving Code to the Data: Analyzing Sea Level Rise Using Earth Data in the Cloud - How in-cloud analysis can be achieved with minimal knowledge of AWS cloud walking through a Jupyter Notebook tutorial.\n2021: Surfing Ocean Data in the Cloud - The Beginner’s Guide to PO.DAAC in the NASA Earthdata Cloud.\n2020: Making Waves: PO.DAAC’s Journey from Servers to a Cloud Environment - Our move to the cloud, what it means for the data, services, and resources PO.DAAC provides, and what it means for the data user community.", "crumbs": [ - "Tutorials", - "Dataset Specific", - "GHRSST", - "OPeNDAP Access" + "Webinars" ] }, { - "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-concise", - "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-concise", - "title": "Harmony Concise + L2SS-Py Demo", - "section": "What is Concise?", - "text": "What is Concise?\nConcise is a Harmony service developed by PODAAC that allows users to concatenate multiple L2 granules together into a single granule. This concatenation is done by adding a new subset_index dimension to the resulting granule." - }, - { - "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-l2ss-py-concise", - "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#what-is-l2ss-py-concise", - "title": "Harmony Concise + L2SS-Py Demo", - "section": "What is L2SS-Py + Concise?", - "text": "What is L2SS-Py + Concise?\nHarmony supports chaining multiple services together. The L2SS-Py + Concise chain allows users to combine spatial, temporal, and variable subsetting with granule concatenation." - }, - { - "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#before-you-start", - "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#before-you-start", - "title": "Harmony Concise + L2SS-Py Demo", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an account in the Earthdata Login, which is required to access data from the NASA Earthdata system. Please visit https://urs.earthdata.nasa.gov to register for an Earthdata Login account. It is free to create and only takes a moment to set up.\nYou will also need a netrc file containing your NASA Earthdata Login credentials in order to execute this notebook. A netrc file can be created manually within text editor and saved to your home directory. For additional information see: Authentication for NASA Earthdata." - }, - { - "objectID": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#running-the-demo", - "href": "notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html#running-the-demo", - "title": "Harmony Concise + L2SS-Py Demo", - "section": "Running the Demo", - "text": "Running the Demo\nThe remaining notebook walks through constructing a request that first subsets multiple files from a collection and then concatenates the results together into a single output file. This is accomplished using the Harmony coverages API through the use of the harmony-py python library.\nThe collection being used in the demonstration is the ASCATB-L2-25km collection which contains operational near-real-time Level 2 ocean surface wind vector retrievals from the Advanced Scatterometer (ASCAT) on MetOp-B at 25 km sampling resolution.\nThe first step is to import the libraries needed to run the demo.\n\nimport xarray as xr\nimport tempfile\nfrom IPython.display import display, JSON\nfrom datetime import datetime, timedelta, time\nfrom harmony import BBox, Client, Collection, Request, Environment, LinkType\n\nfrom mpl_toolkits.basemap import Basemap\nimport matplotlib.pyplot as plt\nimport cartopy.crs as ccrs\nimport s3fs\n\nimport warnings\nwarnings.filterwarnings('ignore')\n%matplotlib inline\n\nCreate Harmony-py client.\n\nharmony_client = Client(env=Environment.PROD)\n\nWith the client created, we can contruct and validate the request. As this is a subsetting + concatenation request, we specify options on the request that define spatial bounds, variables we are interested in, temporal bounds, and indicated the result should be concatenated. Since this is a near real time dataset, we will request the data from yesterday.\n\ncollection = Collection(id='C2075141559-POCLOUD')\n\nyesterday = datetime.today() - timedelta(days=1)\n\nrequest = Request(\n collection=collection,\n spatial=BBox(-180, -30, 180, 30),\n variables=[\n 'wind_speed', \n 'wind_dir'\n ],\n temporal={\n 'start': datetime.combine(yesterday, time.min),\n 'stop': datetime.combine(yesterday, time.max)\n },\n concatenate=True\n)\n\nrequest.is_valid()\n\nTrue\n\n\nNow that we have a valid request we simply need to call the submit function using the client we created earlier and pass in the request as a parameter.\nTip: if you want to see the request before submitting it, use the request_as_curl function on the client to get an equivalent curl command for the request that will be submitted.\n\nprint(harmony_client.request_as_curl(request))\njob_id = harmony_client.submit(request)\nprint(f'Job ID: {job_id}')\n\ncurl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'Cookie: urs_user_already_logged=yes; token=*****; _urs-gui_session=046f3430c6ca2f9e3e00d94c0bee2f70' -H 'User-Agent: Windows/10 harmony-py/0.4.2 CPython/3.8.12 python-requests/2.25.1' 'https://harmony.earthdata.nasa.gov/C2075141559-POCLOUD/ogc-api-coverages/1.0.0/collections/wind_speed,wind_dir/coverage/rangeset?forceAsync=true&subset=lat%28-30%3A30%29&subset=lon%28-180%3A180%29&subset=time%28%222022-10-19T00%3A00%3A00%22%3A%222022-10-19T23%3A59%3A59.999999%22%29&concatenate=true'\nJob ID: 87ec4775-7949-482c-96b2-11f5e6941d15\n\n\nAfter submitting the request it is possible to retrieve the current processing status by using the job ID returned from the submission.\n\nharmony_client.status(job_id)\n\n{'status': 'running',\n 'message': 'The job is being processed',\n 'progress': 0,\n 'created_at': datetime.datetime(2022, 10, 20, 22, 45, 28, 721000, tzinfo=tzutc()),\n 'updated_at': datetime.datetime(2022, 10, 20, 22, 45, 29, 72000, tzinfo=tzutc()),\n 'created_at_local': '2022-10-20T15:45:28-07:00',\n 'updated_at_local': '2022-10-20T15:45:29-07:00',\n 'data_expiration': datetime.datetime(2022, 11, 19, 22, 45, 28, 721000, tzinfo=tzutc()),\n 'data_expiration_local': '2022-11-19T14:45:28-08:00',\n 'request': 'https://harmony.earthdata.nasa.gov/C2075141559-POCLOUD/ogc-api-coverages/1.0.0/collections/wind_speed,wind_dir/coverage/rangeset?forceAsync=true&subset=lat(-30%3A30)&subset=lon(-180%3A180)&subset=time(%222022-10-19T00%3A00%3A00%22%3A%222022-10-19T23%3A59%3A59.999999%22)&concatenate=true',\n 'num_input_granules': 16}\n\n\nIf the request is still running, we can wait until the Harmony request has finished processing. This cell will wait until the request has finised.\n\nharmony_client.wait_for_processing(job_id, show_progress=True)\n\n [ Processing: 100% ] |###################################################| [|]\n\n\nNow that the request has completed we can inspect the results using xarray and matplotlib.\nFirst, let’s download the result into a temporary directory\n\ntemp_dir = tempfile.mkdtemp()\nfutures = harmony_client.download_all(job_id, directory=temp_dir, overwrite=True)\nfile_names = [f.result() for f in futures]\nfile_names\n\n['C:\\\\Users\\\\nickles\\\\AppData\\\\Local\\\\Temp\\\\tmpqzco2nld\\\\C2075141559-POCLOUD_merged.nc4']\n\n\nWith the output file downloaded, now we can open concatenated granule using xarray to inspect some of the metadata.\nNotice the variable subset has been successfully executed – only wind_dir and wind_speed vars are present. In addition, there is a new dimension subset_index added to each variable in the dataset. The index of this dimension corresponds to the original file named in the subset_files variable that contained the data at that index.\n\nds = xr.open_dataset(file_names[0], decode_times=False)\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (subset_index: 16, NUMROWS: 596, NUMCELLS: 42)\nCoordinates:\n lat (subset_index, NUMROWS, NUMCELLS) float32 ...\n lon (subset_index, NUMROWS, NUMCELLS) float32 ...\nDimensions without coordinates: subset_index, NUMROWS, NUMCELLS\nData variables:\n subset_files (subset_index) object 'ascat_20221018_222700_metopb_52328_e...\n time (subset_index, NUMROWS, NUMCELLS) float64 ...\n wind_speed (subset_index, NUMROWS, NUMCELLS) float32 ...\n wind_dir (subset_index, NUMROWS, NUMCELLS) float32 ...\nAttributes: (12/18)\n title: MetOp-B ASCAT Level 2 25.0 km Ocean Sur...\n title_short_name: ASCATB-L2-25km\n Conventions: CF-1.6\n institution: EUMETSAT/OSI SAF/KNMI\n source: MetOp-B ASCAT\n software_identification_level_1: 1000\n ... ...\n processing_level: L2\n rev_orbit_period: 6081.7\n orbit_inclination: 98.7\n references: ASCAT Wind Product User Manual, https:/...\n comment: Orbit period and inclination are consta...\n history_json: [{\"date_time\": \"2022-10-20T22:45:37.904...xarray.DatasetDimensions:subset_index: 16NUMROWS: 596NUMCELLS: 42Coordinates: (2)lat(subset_index, NUMROWS, NUMCELLS)float32...valid_min :-9000000valid_max :9000000standard_name :latitudelong_name :latitudeunits :degrees_north[400512 values with dtype=float32]lon(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :36000000standard_name :longitudelong_name :longitudeunits :degrees_east[400512 values with dtype=float32]Data variables: (4)subset_files(subset_index)object...long_name :List of subsetted files used to create this merge product.array(['ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4',\n 'ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4'],\n dtype=object)time(subset_index, NUMROWS, NUMCELLS)float64...valid_min :0valid_max :2147483647standard_name :timelong_name :timeunits :seconds since 1990-01-01calendar :proleptic_gregorian[400512 values with dtype=float64]wind_speed(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :5000standard_name :wind_speedlong_name :wind speed at 10 munits :m s-1[400512 values with dtype=float32]wind_dir(subset_index, NUMROWS, NUMCELLS)float32...valid_min :0valid_max :3600standard_name :wind_to_directionlong_name :wind direction at 10 munits :degree[400512 values with dtype=float32]Attributes: (18)title :MetOp-B ASCAT Level 2 25.0 km Ocean Surface Wind Vector Producttitle_short_name :ASCATB-L2-25kmConventions :CF-1.6institution :EUMETSAT/OSI SAF/KNMIsource :MetOp-B ASCATsoftware_identification_level_1 :1000instrument_calibration_version :0software_identification_wind :3301pixel_size_on_horizontal :25.0 kmservice_type :epsprocessing_type :Ocontents :ovwprocessing_level :L2rev_orbit_period :6081.7orbit_inclination :98.7references :ASCAT Wind Product User Manual, https://osi-saf.eumetsat.int/, https://scatterometer.knmi.nl/comment :Orbit period and inclination are constant values. All wind directions in oceanographic convention (0 deg. flowing North)history_json :[{\"date_time\": \"2022-10-20T22:45:37.904685+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.891502+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.825551+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:38.951797+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.479597+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.201629+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.958642+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.611733+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.394288+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.465600+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.632834+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:43.428456+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:37.471227+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:39.335118+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:40.743323+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:43.732829+00:00\", \"derived_from\": \"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/ASCATB-L2-25km/ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2.nc\", \"program\": \"l2ss-py\", \"version\": \"2.2.0\", \"parameters\": \"bbox=[[-180, 180], [-30, 30]] cut=True\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S1962070864-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}, {\"date_time\": \"2022-10-20T22:45:48.424799+00:00\", \"derived_from\": [\"ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4\", \"ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4\"], \"program\": \"concise\", \"version\": \"0.5.0\", \"parameters\": \"input_files=[PosixPath('/tmp/tmp6qevy37z/ascat_20221018_222700_metopb_52328_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_152100_metopb_52338_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_170300_metopb_52339_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_000900_metopb_52329_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_184500_metopb_52340_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_220600_metopb_52342_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_202700_metopb_52341_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_234800_metopb_52343_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_015100_metopb_52330_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_051200_metopb_52332_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_033300_metopb_52331_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_065400_metopb_52333_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_083600_metopb_52334_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_101800_metopb_52335_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_133900_metopb_52337_eps_o_250_3301_ovw.l2_subsetted.nc4'), PosixPath('/tmp/tmp6qevy37z/ascat_20221019_120000_metopb_52336_eps_o_250_3301_ovw.l2_subsetted.nc4')]\", \"program_ref\": \"https://cmr.earthdata.nasa.gov:443/search/concepts/S2153799015-POCLOUD\", \"$schema\": \"https://harmony.earthdata.nasa.gov/schemas/history/0.1.0/history-v0.1.0.json\"}]\n\n\nUsing matplotlib, we can genearte a plot for each granule that makes up this concatenated granule. Plot wind_speed for each granule using subset_index dimension.\n\nfig = plt.figure(figsize=(20, 40))\n\nfor index in range(0, len(ds.subset_index)): \n ax = fig.add_subplot((len(ds.subset_index)+1)//2, 2, index+1, projection=ccrs.PlateCarree())\n\n p = ds.isel(subset_index=index).plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=\"wind_speed\",\n s=1,\n levels=9,\n cmap=\"jet\",\n ax=ax\n )\n \n ax.set_global()\n ax.coastlines()\n\nplt.show()\n\n\n\n\n\n\n\n\nPlot wind_speed for all data in this concatenated granule on a single map. Notice that the data is within the spatial bounds we provided earlier.\n\nplt.figure(figsize=(12, 6))\nax = plt.axes(projection=ccrs.PlateCarree())\n\np = ds.plot.scatter(\n y=\"lat\",\n x=\"lon\",\n hue=\"wind_speed\",\n s=1,\n levels=9,\n cmap=\"jet\",\n ax=ax\n)\n\nax.set_global()\nax.coastlines()\nplt.show()" - }, - { - "objectID": "notebooks/podaac_cmr_s3_links.html", - "href": "notebooks/podaac_cmr_s3_links.html", - "title": "CMR search getting S3 Links", - "section": "", - "text": "This is a tutorial to show how to retrive a list of s3 links from a CMR granules search.\n\nPrerequisites\nBefore proceeding, ensure you have the following:\nPython installed on your system. The requests library installed. If not, you can install it using “pip install requests”\nDefine function below to get s3 links for granules based on CMR search criterias.\n\nimport requests\nimport netrc\n\ndef get_s3_links(collection_concept_id, provider, bounding_box=None,\n time_range=None, cycle=None, wildcard=None, edl_token=None):\n \"\"\"\n Fetch S3 links from CMR API based on search criteria.\n\n :param collection_concept_id: The concept ID of the collection to search within.\n :param provider: The data provider for the collection.\n :param bounding_box: A list of coordinates [min_lon, min_lat, max_lon, max_lat] to filter by bounding box.\n :param time_range: A list of two datetime strings [start_time, end_time] to filter by temporal range.\n :param cycle: The cycle value to filter by.\n :param wildcard: A native_id wildcard pattern to filter granules.\n :param edl_token: The EDL token for authentication (optional).\n :return: A list of S3 links from the CMR API.\n \"\"\"\n base_url = 'https://cmr.earthdata.nasa.gov'\n search_endpoint = '/search/granules.umm_json'\n\n # Set up query parameters\n params = {\n 'collection_concept_id': collection_concept_id,\n 'provider': provider,\n 'page_size': 2000\n }\n\n if bounding_box:\n params['bounding_box'] = ','.join(map(str, bounding_box))\n\n if time_range:\n params['temporal'] = ','.join(map(str, time_range))\n\n if cycle:\n params['cycle'] = cycle\n\n if wildcard:\n params['options[native_id][pattern]'] = 'true'\n params['native_id'] = wildcard\n\n s3_links = []\n\n headers = {'cmr-search-after': None}\n if edl_token:\n headers[\"Authorization\"] = f\"Bearer {edl_token}\"\n\n try:\n while True:\n response = requests.get(base_url + search_endpoint, params=params, headers=headers)\n response.raise_for_status() # Check for request errors\n response_data = response.json()\n cmr_search_after = response.headers.get(\"cmr-search-after\")\n\n if 'items' not in response_data:\n break\n\n for item in response_data['items']:\n if 'umm' in item and 'RelatedUrls' in item['umm']:\n for url_info in item['umm']['RelatedUrls']:\n if url_info['Type'] == 'GET DATA VIA DIRECT ACCESS' and url_info['URL'] and 's3://' in url_info['URL']:\n s3_links.append(url_info['URL'])\n\n headers['cmr-search-after'] = cmr_search_after\n\n if cmr_search_after is None:\n break\n\n except requests.exceptions.RequestException as e:\n print(f\"Error: {e}\")\n\n return s3_links\n\n\n\nProvide CMR Credentials\nYou may need authentication for the CMR API (e.g., Earthdata Login), the following function will create an EDL token for you, also you will need to create a .netrc file with your EDL credentials. More information on .netrc files https://everything.curl.dev/usingcurl/netrc\n\n# GET TOKEN FROM CMR \ndef get_token():\n urs_root = 'urs.earthdata.nasa.gov'\n username, _, password = netrc.netrc().authenticators(urs_root)\n token_api = \"https://{}/api/users/tokens\".format(urs_root)\n response = requests.get(token_api, auth=(username, password))\n content = response.json()\n if len(content) > 0:\n return content[0].get('access_token')\n else:\n create_token_api = \"https://{}/api/users/token\".format(urs_root)\n response = requests.post(create_token_api, auth=(username, password))\n content = response.json()\n return content.get('access_token')\n\nedl_token = get_token()\n\n\n\nSearch Collection Concept id\nSearch for a collection concept id using CMR API, we will use a collections shortname to find the collection concept id.\n\ncollection_short_name = \"SWOT_L2_LR_SSH_BASIC_1.0\"\nheaders = {\"Authorization\": f\"Bearer {edl_token}\"}\ncmr_collection_url = f\"https://cmr.earthdata.nasa.gov/search/collections.json?short_name={collection_short_name}\"\nresponse = requests.get(headers=headers, url=cmr_collection_url)\ncollection_concept_id = response.json().get('feed').get('entry')[0].get('id')\n\n\n\nDefine Search Criteria\nDefine the search criteria to filter the granules. This can include the collection concept ID, provider, bounding box, time range, cycle, and wildcard (if needed). Wildcard are used to search for granules name that falls within the wildcard regex.\n\n# Example usage:\nprovider = 'POCLOUD'\nbounding_box = [-90, -90, 90, 90]\ntime_range = [\"2023-01-01T00:00:00Z\", \"2023-12-30T23:59:59Z\"]\ncycle = \"560\"\nwildcard = \"*2023*\"\n\n\n\nFetch S3 Links\nNow, let’s call the get_s3_links function with the provided search criteria to fetch the S3 links from the CMR API.\n\ns3_links = get_s3_links(collection_concept_id, provider,\n bounding_box=bounding_box, time_range=time_range, \n wildcard=wildcard, edl_token=edl_token, cycle=cycle)\n\nprint(len(s3_links))\ndisplay(s3_links)" - }, - { - "objectID": "notebooks/harmony subsetting/shapefile_subset.html", - "href": "notebooks/harmony subsetting/shapefile_subset.html", - "title": "L2SS-Py Shapefile Subsetting", - "section": "", - "text": "This notebook demonstates subsetting multiple data files by an existing shapefile.\nImport Harmony Python library\n\nfrom harmony import BBox, Client, Collection, Request\nfrom harmony.config import Environment\n\nImport libraries used to visualize l2ss-py result\n\nimport datetime as dt\nimport xarray as xr\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\n\nimport cartopy.io.img_tiles as cimgt\nimport cartopy.crs as ccrs\nfrom cartopy.io.shapereader import Reader\nfrom cartopy.feature import ShapelyFeature\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\nCreate Harmony client. In this case, point the Harmony client at the LOCAL Harmony environment.\n\nharmony_client = Client()\n\nThe example utilized in this demo uses a shapefile of the Gulf of Mexico. That shapefile ZIP file is in the local directory this notebook is running in.\n\nshapefile_path = 'gulf_shapefile.zip' \ncollection_id = 'C2075141605-POCLOUD' # ASCATB-L2-Coastal\n\nrequest = Request(\n collection=Collection(id=collection_id),\n shape=shapefile_path,\n granule_id=[\n 'G2244750740-POCLOUD',\n 'G2244133671-POCLOUD',\n 'G2243066020-POCLOUD'\n ]\n)\n\nrequest.is_valid()\n\nTrue\n\n\nWait for processing and then view the output\n\njob_id = harmony_client.submit(request)\nprint(f'jobID = {job_id}')\n\nprint('\\n Waiting for the job to finish. . .\\n')\nharmony_client.wait_for_processing(job_id, show_progress=True)\nprint(\"\\n. . .DONE!\")\n\njobID = 3af6c0ce-bbed-45b0-86ae-265a00182a6f\n\n\n [ Processing: 100% ] |###################################################| [|]\n\n\n\ndef display_wind_speed(nc_file_name):\n ds = xr.load_dataset(nc_file_name, engine='netcdf4')\n lats = ds.lat.values\n lons = ds.lon.values\n wind_speed_data = ds.wind_speed.values\n\n ax = plt.axes(projection=ccrs.PlateCarree())\n ax.set_global()\n ax.coastlines()\n # Zoom in to ~ north america\n ax.set_extent([-170, -20, 0, 40])\n ax.contourf(lons, lats, wind_speed_data)\n plt.show()\n\n\nfor filename in [f.result() for f in harmony_client.download_all(job_id)]:\n display_wind_speed(filename)\n print(filename)\n \n\n\n\n\n\n\n\n\nascat_20220328_023300_metopb_49418_eps_o_coa_3202_ovw.l2_subsetted.nc4\n\n\n\n\n\n\n\n\n\nascat_20220329_140000_metopb_49439_eps_o_coa_3202_ovw.l2_subsetted.nc4\n\n\n\n\n\n\n\n\n\nascat_20220330_152100_metopb_49454_eps_o_coa_3202_ovw.l2_subsetted.nc4" - }, - { - "objectID": "notebooks/aws_lambda_sst/sst-global-mean-exploratory.html", - "href": "notebooks/aws_lambda_sst/sst-global-mean-exploratory.html", - "title": "Calculate MUR25 Sea Surface Temperature Global Mean", - "section": "", - "text": "This notebook demonstrates how we calculate the area-weighted global mean sea surface temperature (SST) from the MUR25 L4 dataset.\nYou can run this on a local computer by downloading the data using the following command in your terminal:\npodaac-data-downloader -c MUR25-JPL-L4-GLOB-v04.2 -d ./data/MUR25-JPL-L4-GLOB-v04.2 --start-date 2022-12-01T00:00:00Z --end-date 2022-12-31T23:00:00Z\n\nLoad required libraries and prepare data\n\nimport cartopy.crs as ccrs\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport xarray as xr\nfrom datetime import date\n\n\nds = xr.load_dataset('~/data/MUR25-JPL-L4-GLOB-v04.2/20221201090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc')\nds\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.Dataset>\nDimensions: (time: 1, lat: 720, lon: 1440)\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\n * lat (lat) float32 -89.88 -89.62 -89.38 ... 89.38 89.62 89.88\n * lon (lon) float32 -179.9 -179.6 -179.4 ... 179.4 179.6 179.9\nData variables:\n analysed_sst (time, lat, lon) float32 nan nan nan ... 271.4 271.4 271.4\n analysis_error (time, lat, lon) float32 nan nan nan ... 0.34 0.34 0.34\n mask (time, lat, lon) float32 2.0 2.0 2.0 2.0 ... 9.0 9.0 9.0\n sea_ice_fraction (time, lat, lon) float32 nan nan nan ... 0.97 0.97 0.97\n sst_anomaly (time, lat, lon) float32 nan nan nan nan ... 0.0 0.0 0.0\nAttributes: (12/54)\n Conventions: CF-1.7, ACDD-1.3\n title: Daily 0.25-degree MUR SST, Final product\n summary: A low-resolution version of the MUR SST analy...\n keywords: Oceans > Ocean Temperature > Sea Surface Temp...\n keywords_vocabulary: NASA Global Change Master Directory (GCMD) Sc...\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadata Con...\n ... ...\n publisher_name: GHRSST Project Office\n publisher_url: https://www.ghrsst.org\n publisher_email: gpc@ghrsst.org\n file_quality_level: 3\n metadata_link: http://podaac.jpl.nasa.gov/ws/metadata/datase...\n acknowledgment: Please acknowledge the use of these data with...xarray.DatasetDimensions:time: 1lat: 720lon: 1440Coordinates: (3)time(time)datetime64[ns]2022-12-01T09:00:00long_name :reference time of sst fieldstandard_name :timecoverage_content_type :coordinateaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)lon(lon)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudecoverage_content_type :coordinateaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)Data variables: (5)analysed_sst(time, lat, lon)float32nan nan nan ... 271.4 271.4 271.4long_name :analysed sea surface temperaturestandard_name :sea_surface_foundation_temperaturecoverage_content_type :physicalMeasurementunits :kelvinvalid_min :-32767valid_max :32767comment :\"Final\" version using Multi-Resolution Variational Analysis (MRVA) method for interpolationsource :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFarray([[[ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n ...,\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35],\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35],\n [271.35, 271.35, 271.35, ..., 271.35, 271.35, 271.35]]],\n dtype=float32)analysis_error(time, lat, lon)float32nan nan nan nan ... 0.34 0.34 0.34long_name :estimated error standard deviation of analysed_sstcoverage_content_type :qualityInformationunits :kelvinvalid_min :0valid_max :32767comment :uncertainty in \"analysed_sst\"array([[[ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n [ nan, nan, nan, ..., nan, nan, nan],\n ...,\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34],\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34],\n [0.34, 0.34, 0.34, ..., 0.34, 0.34, 0.34]]], dtype=float32)mask(time, lat, lon)float322.0 2.0 2.0 2.0 ... 9.0 9.0 9.0 9.0long_name :sea/land field composite maskcoverage_content_type :referenceInformationvalid_min :1valid_max :31flag_masks :[ 1 2 4 8 16]flag_meanings :water land optional_lake_surface sea_ice optional_river_surfacecomment :flag interpretation as integer values: 1=water, 2=land, 5=lake, 9=water with ice in the grid, 13=lake with ice in the grid, 17=riversource :GMT \"grdlandmask\", ice flag from sea_ice_fraction dataarray([[[2., 2., 2., ..., 2., 2., 2.],\n [2., 2., 2., ..., 2., 2., 2.],\n [2., 2., 2., ..., 2., 2., 2.],\n ...,\n [9., 9., 9., ..., 9., 9., 9.],\n [9., 9., 9., ..., 9., 9., 9.],\n [9., 9., 9., ..., 9., 9., 9.]]], dtype=float32)sea_ice_fraction(time, lat, lon)float32nan nan nan nan ... 0.97 0.97 0.97long_name :sea ice area fractionstandard_name :sea_ice_area_fractioncoverage_content_type :auxiliaryInformationvalid_min :0valid_max :100source :EUMETSAT OSI-SAF, copyright EUMETSATcomment :ice fraction is a dimensionless quantity between 0 and 1; it has been interpolated by a nearest neighbor approach.array([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [0.96 , 0.96 , 0.96 , ..., 0.96 ,\n 0.96 , 0.96 ],\n [0.96 , 0.96 , 0.96 , ..., 0.96999997,\n 0.96999997, 0.96999997],\n [0.96 , 0.96 , 0.96 , ..., 0.96999997,\n 0.96999997, 0.96999997]]], dtype=float32)sst_anomaly(time, lat, lon)float32nan nan nan nan ... 0.0 0.0 0.0 0.0long_name :SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 periodcoverage_content_type :auxiliaryInformationunits :kelvinvalid_min :-32767valid_max :32767comment :anomaly reference to the day-of-year average between 2003 and 2014array([[[nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n [nan, nan, nan, ..., nan, nan, nan],\n ...,\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.],\n [ 0., 0., 0., ..., 0., 0., 0.]]], dtype=float32)Attributes: (54)Conventions :CF-1.7, ACDD-1.3title :Daily 0.25-degree MUR SST, Final productsummary :A low-resolution version of the MUR SST analysis, a merged, multi-sensor L4 Foundation SST analysis product from JPL.keywords :Oceans > Ocean Temperature > Sea Surface Temperaturekeywords_vocabulary :NASA Global Change Master Directory (GCMD) Science Keywordsstandard_name_vocabulary :NetCDF Climate and Forecast (CF) Metadata Conventionhistory :created at nominal 4-day latency; replaced nrt (1-day latency) version.source :MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAFplatform :Terra, Aqua, GCOM-W, MetOp-B, Buoys/Shipsinstrument :MODIS, AMSR2, AVHRR, in-situsensor :MODIS, AMSR2, AVHRR, in-situprocessing_level :L4cdm_data_type :gridproduct_version :04.2references :Chin et al. (2017) \"Remote Sensing of Environment\", volulme 200, pages 154-169. http://dx.doi.org/10.1016/j.rse.2017.07.029creator_name :JPL MUR SST projectcreator_email :ghrsst@podaac.jpl.nasa.govcreator_url :http://mur.jpl.nasa.govcreator_institution :Jet Propulsion Laboratoryinstitution :Jet Propulsion Laboratoryproject :NASA MEaSUREs and COVERAGEprogram :NASA Earth Science Data and Information System (ESDIS)southernmost_latitude :-90.0northernmost_latitude :90.0westernmost_longitude :-180.0easternmost_longitude :180.0geospatial_lat_min :-90.0geospatial_lat_max :90.0geospatial_lon_min :-180.0geospatial_lon_max :180.0geospatial_lat_units :degrees northgeospatial_lat_resolution :0.25geospatial_lon_units :degrees eastgeospatial_lon_resolution :0.25date_created :2022-12-10start_time :20221201T090000Zstop_time :20221201T090000Ztime_coverage_start :20221130T210000Ztime_coverage_end :20221201T210000Ztime_coverage_resolution :P1Dlicense :These data are available free of charge under data policy of JPL PO.DAAC.id :MUR25-JPL-L4-GLOB-v04.2uuid :27665bc0-d5fc-11e1-9b23-0800200c9a66comment :MUR = \"Multi-scale Ultra-high Resolution\"naming_authority :org.ghrsstgds_version_id :2.0netcdf_version_id :04.2spatial_resolution :0.25 degreespublisher_name :GHRSST Project Officepublisher_url :https://www.ghrsst.orgpublisher_email :gpc@ghrsst.orgfile_quality_level :3metadata_link :http://podaac.jpl.nasa.gov/ws/metadata/dataset/?format=iso&shortName=MUR25-JPL-L4-GLOB-v04.2acknowledgment :Please acknowledge the use of these data with the following statement: These data were provided by JPL under support by NASA MEaSUREs and COVERAGE programs.\n\n\n\n# select sst variable\nsst = ds.analysed_sst\n\n# convert to degrees Celcius\nsst = sst - 273.15\nsst\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1, lat: 720, lon: 1440)>\narray([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878]]], dtype=float32)\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\n * lat (lat) float32 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88\n * lon (lon) float32 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9xarray.DataArray'analysed_sst'time: 1lat: 720lon: 1440nan nan nan nan nan nan nan nan ... -1.8 -1.8 -1.8 -1.8 -1.8 -1.8 -1.8array([[[ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n [ nan, nan, nan, ..., nan,\n nan, nan],\n ...,\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878],\n [-1.7999878, -1.7999878, -1.7999878, ..., -1.7999878,\n -1.7999878, -1.7999878]]], dtype=float32)Coordinates: (3)time(time)datetime64[ns]2022-12-01T09:00:00long_name :reference time of sst fieldstandard_name :timecoverage_content_type :coordinateaxis :Tcomment :Nominal time of analyzed fieldsarray(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)lon(lon)float32-179.9 -179.6 ... 179.6 179.9long_name :longitudestandard_name :longitudecoverage_content_type :coordinateaxis :Xunits :degrees_eastvalid_min :-180.0valid_max :180.0comment :geolocations inherited from the input data without correctionarray([-179.875, -179.625, -179.375, ..., 179.375, 179.625, 179.875],\n dtype=float32)Attributes: (0)\n\n\n\n# plot the data\np = sst.plot(subplot_kws=dict(transform=ccrs.PlateCarree()))\n\n\n\n\n\n\n\n\n\n\nCalculate the area-weighted global mean\n\n# create the weights\n\nweights = np.cos(np.deg2rad(sst.lat))\nweights\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'lat' (lat: 720)>\narray([0.00218172, 0.00654498, 0.01090811, 0.01527103, 0.01963366,\n 0.02399603, 0.02835783, 0.03271909, 0.03707973, 0.04143966,\n 0.04579892, 0.05015719, 0.0545145 , 0.05887078, 0.06322594,\n 0.06758001, 0.07193268, 0.07628398, 0.08063382, 0.08498225,\n 0.08932894, 0.09367393, 0.09801713, 0.10235848, 0.10669798,\n 0.11103535, 0.11537059, 0.11970364, 0.12403442, 0.12836295,\n 0.13268891, 0.13701235, 0.14133318, 0.14565133, 0.1499668 ,\n 0.15427932, 0.1585889 , 0.16289546, 0.16719891, 0.1714993 ,\n 0.1757963 , 0.18008997, 0.1843802 , 0.18866692, 0.19295016,\n 0.19722962, 0.20150532, 0.20577718, 0.21004525, 0.2143092 ,\n 0.21856907, 0.22282477, 0.22707623, 0.2313235 , 0.23556623,\n 0.23980448, 0.24403816, 0.24826722, 0.25249165, 0.25671116,\n 0.26092577, 0.26513544, 0.26934004, 0.27353963, 0.2777339 ,\n 0.28192288, 0.2861065 , 0.29028466, 0.2944574 , 0.29862443,\n 0.30278578, 0.30694136, 0.3110911 , 0.31523505, 0.31937286,\n 0.3235046 , 0.32763016, 0.33174962, 0.33586264, 0.33996928,\n 0.34406942, 0.34816304, 0.35225013, 0.3563304 , 0.36040387,\n 0.3644705 , 0.36853018, 0.37258297, 0.37662855, 0.38066694,\n 0.38469812, 0.38872194, 0.3927385 , 0.39674744, 0.40074885,\n 0.40474263, 0.4087287 , 0.4127071 , 0.4166775 , 0.42064002,\n...\n 0.40074885, 0.39674744, 0.3927385 , 0.38872194, 0.38469812,\n 0.38066694, 0.37662855, 0.37258297, 0.36853018, 0.3644705 ,\n 0.36040387, 0.3563304 , 0.35225013, 0.34816304, 0.34406942,\n 0.33996928, 0.33586264, 0.33174962, 0.32763016, 0.3235046 ,\n 0.31937286, 0.31523505, 0.3110911 , 0.30694136, 0.30278578,\n 0.29862443, 0.2944574 , 0.29028466, 0.2861065 , 0.28192288,\n 0.2777339 , 0.27353963, 0.26934004, 0.26513544, 0.26092577,\n 0.25671116, 0.25249165, 0.24826722, 0.24403816, 0.23980448,\n 0.23556623, 0.2313235 , 0.22707623, 0.22282477, 0.21856907,\n 0.2143092 , 0.21004525, 0.20577718, 0.20150532, 0.19722962,\n 0.19295016, 0.18866692, 0.1843802 , 0.18008997, 0.1757963 ,\n 0.1714993 , 0.16719891, 0.16289546, 0.1585889 , 0.15427932,\n 0.1499668 , 0.14565133, 0.14133318, 0.13701235, 0.13268891,\n 0.12836295, 0.12403442, 0.11970364, 0.11537059, 0.11103535,\n 0.10669798, 0.10235848, 0.09801713, 0.09367393, 0.08932894,\n 0.08498225, 0.08063382, 0.07628398, 0.07193268, 0.06758001,\n 0.06322594, 0.05887078, 0.0545145 , 0.05015719, 0.04579892,\n 0.04143966, 0.03707973, 0.03271909, 0.02835783, 0.02399603,\n 0.01963366, 0.01527103, 0.01090811, 0.00654498, 0.00218172],\n dtype=float32)\nCoordinates:\n * lat (lat) float32 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88\nAttributes:\n long_name: latitude\n standard_name: latitude\n coverage_content_type: coordinate\n axis: Y\n units: degrees_north\n valid_min: -90.0\n valid_max: 90.0\n comment: geolocations inherited from the input data withou...xarray.DataArray'lat'lat: 7200.002182 0.006545 0.01091 0.01527 ... 0.01091 0.006545 0.002182array([0.00218172, 0.00654498, 0.01090811, 0.01527103, 0.01963366,\n 0.02399603, 0.02835783, 0.03271909, 0.03707973, 0.04143966,\n 0.04579892, 0.05015719, 0.0545145 , 0.05887078, 0.06322594,\n 0.06758001, 0.07193268, 0.07628398, 0.08063382, 0.08498225,\n 0.08932894, 0.09367393, 0.09801713, 0.10235848, 0.10669798,\n 0.11103535, 0.11537059, 0.11970364, 0.12403442, 0.12836295,\n 0.13268891, 0.13701235, 0.14133318, 0.14565133, 0.1499668 ,\n 0.15427932, 0.1585889 , 0.16289546, 0.16719891, 0.1714993 ,\n 0.1757963 , 0.18008997, 0.1843802 , 0.18866692, 0.19295016,\n 0.19722962, 0.20150532, 0.20577718, 0.21004525, 0.2143092 ,\n 0.21856907, 0.22282477, 0.22707623, 0.2313235 , 0.23556623,\n 0.23980448, 0.24403816, 0.24826722, 0.25249165, 0.25671116,\n 0.26092577, 0.26513544, 0.26934004, 0.27353963, 0.2777339 ,\n 0.28192288, 0.2861065 , 0.29028466, 0.2944574 , 0.29862443,\n 0.30278578, 0.30694136, 0.3110911 , 0.31523505, 0.31937286,\n 0.3235046 , 0.32763016, 0.33174962, 0.33586264, 0.33996928,\n 0.34406942, 0.34816304, 0.35225013, 0.3563304 , 0.36040387,\n 0.3644705 , 0.36853018, 0.37258297, 0.37662855, 0.38066694,\n 0.38469812, 0.38872194, 0.3927385 , 0.39674744, 0.40074885,\n 0.40474263, 0.4087287 , 0.4127071 , 0.4166775 , 0.42064002,\n...\n 0.40074885, 0.39674744, 0.3927385 , 0.38872194, 0.38469812,\n 0.38066694, 0.37662855, 0.37258297, 0.36853018, 0.3644705 ,\n 0.36040387, 0.3563304 , 0.35225013, 0.34816304, 0.34406942,\n 0.33996928, 0.33586264, 0.33174962, 0.32763016, 0.3235046 ,\n 0.31937286, 0.31523505, 0.3110911 , 0.30694136, 0.30278578,\n 0.29862443, 0.2944574 , 0.29028466, 0.2861065 , 0.28192288,\n 0.2777339 , 0.27353963, 0.26934004, 0.26513544, 0.26092577,\n 0.25671116, 0.25249165, 0.24826722, 0.24403816, 0.23980448,\n 0.23556623, 0.2313235 , 0.22707623, 0.22282477, 0.21856907,\n 0.2143092 , 0.21004525, 0.20577718, 0.20150532, 0.19722962,\n 0.19295016, 0.18866692, 0.1843802 , 0.18008997, 0.1757963 ,\n 0.1714993 , 0.16719891, 0.16289546, 0.1585889 , 0.15427932,\n 0.1499668 , 0.14565133, 0.14133318, 0.13701235, 0.13268891,\n 0.12836295, 0.12403442, 0.11970364, 0.11537059, 0.11103535,\n 0.10669798, 0.10235848, 0.09801713, 0.09367393, 0.08932894,\n 0.08498225, 0.08063382, 0.07628398, 0.07193268, 0.06758001,\n 0.06322594, 0.05887078, 0.0545145 , 0.05015719, 0.04579892,\n 0.04143966, 0.03707973, 0.03271909, 0.02835783, 0.02399603,\n 0.01963366, 0.01527103, 0.01090811, 0.00654498, 0.00218172],\n dtype=float32)Coordinates: (1)lat(lat)float32-89.88 -89.62 ... 89.62 89.88long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correctionarray([-89.875, -89.625, -89.375, ..., 89.375, 89.625, 89.875],\n dtype=float32)Attributes: (8)long_name :latitudestandard_name :latitudecoverage_content_type :coordinateaxis :Yunits :degrees_northvalid_min :-90.0valid_max :90.0comment :geolocations inherited from the input data without correction\n\n\n\nfor lat in sst.lat:\n l = lat.values\n if (l>60) or (l<-60):\n weights.loc[dict(lat=l)] = 0\n\n#weights\n\n\n# apply weights to data\nsst_weighted = sst.weighted(weights)\n\n# calculate the global mean on the weighted data\nsst_global_mean = sst_weighted.mean()\n\n# display the values\nsst_global_mean\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' ()>\narray(20.52885965)xarray.DataArray'analysed_sst'20.53array(20.52885965)Coordinates: (0)Attributes: (0)\n\n\n\n\nsst_out = sst_global_mean.expand_dims(time=ds.time)\nsst_out = sst_out.assign_attrs({\n \"description\": \"Area-weighted global mean sea surface temperature calculated using AWS Lambda\",\n \"units\": \"celcius\",\n \"date_created\": date.today().strftime(\"%b-%d-%Y\")\n})\nsst_out\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<xarray.DataArray 'analysed_sst' (time: 1)>\narray([20.52885965])\nCoordinates:\n * time (time) datetime64[ns] 2022-12-01T09:00:00\nAttributes:\n description: Area-weighted global mean sea surface temperature calculat...\n units: celcius\n date_created: Jun-09-2023xarray.DataArray'analysed_sst'time: 120.53array([20.52885965])Coordinates: (1)time(time)datetime64[ns]2022-12-01T09:00:00array(['2022-12-01T09:00:00.000000000'], dtype='datetime64[ns]')Attributes: (3)description :Area-weighted global mean sea surface temperature calculated using AWS Lambdaunits :celciusdate_created :Jun-09-2023" - }, - { - "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html", - "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html", - "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", - "section": "", - "text": "Author: Jinbo Wang Jinbo.Wang@jpl.nasa.gov, Jack McNelis jack.mcnelis@jpl.nasa.gov\nThis is a demonstration of accessing the ECCO-BASED PRE-SWOT NUMERICAL SIMULATION. The dataset can be found following https://search.earthdata.nasa.gov/search?q=pocloud%20pre-swot.\nimport s3fs\nimport requests\nimport xarray as xr\nimport pylab as plt\nfrom netrc import netrc\nfrom urllib import request\nfrom platform import system\nfrom getpass import getpass\nfrom http.cookiejar import CookieJar\nfrom os.path import expanduser, join\n\nShortName = \"MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_v1.0\"\ntarget_file = \"LLC4320_pre-SWOT_ACC_SMST_20111221.nc\"\nEarthdata Login\nAuthenticate with your Earthdata Login/URS credentials by configuring a .netrc file in your home directory.\nRun the next cell to authenticate. (You might be prompted for your Earthdata Login username and password.)\ndef setup_earthdata_login_auth(endpoint: str='urs.earthdata.nasa.gov'):\n netrc_name = \"_netrc\" if system()==\"Windows\" else \".netrc\"\n try:\n username, _, password = netrc(file=join(expanduser('~'), netrc_name)).authenticators(endpoint)\n except (FileNotFoundError, TypeError):\n print('Please provide your Earthdata Login credentials for access.')\n print('Your info will only be passed to %s and will not be exposed in Jupyter.' % (endpoint))\n username = input('Username: ')\n password = getpass('Password: ')\n manager = request.HTTPPasswordMgrWithDefaultRealm()\n manager.add_password(None, endpoint, username, password)\n auth = request.HTTPBasicAuthHandler(manager)\n jar = CookieJar()\n processor = request.HTTPCookieProcessor(jar)\n opener = request.build_opener(auth, processor)\n request.install_opener(opener)\n \nsetup_earthdata_login_auth()\n\nPlease provide your Earthdata Login credentials for access.\nYour info will only be passed to urs.earthdata.nasa.gov and will not be exposed in Jupyter.\n\n\nUsername: marscreature\nPassword: ·············\nYou should now be able to download the file at the following link:\nhttps_access = f\"https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/{ShortName}/{target_file}\"\n\nprint(https_access)\n\nhttps://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_v1.0/LLC4320_pre-SWOT_ACC_SMST_2011122?.nc\nOpen the dataset\nRun the next cell to access/open the netCDF file with xarray:\ndef begin_s3_direct_access():\n \"\"\"Returns s3fs object for accessing datasets stored in S3.\"\"\"\n response = requests.get(\"https://archive.podaac.earthdata.nasa.gov/s3credentials\").json()\n return s3fs.S3FileSystem(key=response['accessKeyId'],\n secret=response['secretAccessKey'],\n token=response['sessionToken'], \n client_kwargs={'region_name':'us-west-2'})\n\ntry:\n fs = begin_s3_direct_access()\n # Load netCDF with 's3fs' and 'xarray' upon successful connection to S3:\n dd = xr.open_dataset(fs.open(f\"podaac-ops-cumulus-protected/{ShortName}/{target_file}\"))\nexcept:\n print(\"Failed to establish AWS in-region access. Downloading to local disk instead.\")\n request.urlretrieve(https_access, target_file)\n # Load netCDF with 'xarray' after download completes:\n \n dd = xr.open_dataset(target_file)\n\nprint(dd)\n\nFailed to establish AWS in-region access. Downloading to local disk instead.\n<xarray.Dataset>\nDimensions: (i: 192, i_g: 192, j: 349, j_g: 349, k: 84, k_l: 84, k_p1: 85, k_u: 84, nb: 2, time: 24)\nCoordinates:\n * j_g (j_g) float32 0.0 1.0 2.0 3.0 4.0 ... 345.0 346.0 347.0 348.0\n * i (i) float32 0.0 1.0 2.0 3.0 4.0 ... 187.0 188.0 189.0 190.0 191.0\n * i_g (i_g) float32 0.0 1.0 2.0 3.0 4.0 ... 188.0 189.0 190.0 191.0\n * j (j) float32 0.0 1.0 2.0 3.0 4.0 ... 344.0 345.0 346.0 347.0 348.0\n * k (k) int32 0 1 2 3 4 5 6 7 8 9 10 ... 74 75 76 77 78 79 80 81 82 83\n * k_u (k_u) int32 0 1 2 3 4 5 6 7 8 9 ... 74 75 76 77 78 79 80 81 82 83\n * k_l (k_l) int32 0 1 2 3 4 5 6 7 8 9 ... 74 75 76 77 78 79 80 81 82 83\n * k_p1 (k_p1) int32 0 1 2 3 4 5 6 7 8 9 ... 75 76 77 78 79 80 81 82 83 84\n * nb (nb) int32 0 1\n * time (time) datetime64[ns] 2011-12-21 ... 2011-12-21T23:00:00\nData variables:\n XC (j, i) float32 ...\n YC (j, i) float32 ...\n DXV (j, i) float32 ...\n DYU (j, i) float32 ...\n Depth (j, i) float32 ...\n AngleSN (j, i) float32 ...\n AngleCS (j, i) float32 ...\n DXC (j, i_g) float32 ...\n DYG (j, i_g) float32 ...\n DYC (j_g, i) float32 ...\n DXG (j_g, i) float32 ...\n XG (j_g, i_g) float32 ...\n YG (j_g, i_g) float32 ...\n RAZ (j_g, i_g) float32 ...\n XC_bnds (j, i, nb) float64 ...\n YC_bnds (j, i, nb) float64 ...\n Z (k) float32 ...\n Zp1 (k_p1) float32 ...\n Zu (k_u) float32 ...\n Zl (k_l) float32 ...\n Z_bnds (k, nb) float32 ...\n Eta (time, j, i) float64 ...\n KPPhbl (time, j, i) float64 ...\n PhiBot (time, j, i) float64 ...\n oceFWflx (time, j, i) float64 ...\n oceQnet (time, j, i) float64 ...\n oceQsw (time, j, i) float64 ...\n oceSflux (time, j, i) float64 ...\n oceTAUX (time, j, i_g) float64 ...\n oceTAUY (time, j_g, i) float64 ...\n Theta (time, k, j, i) float64 ...\n Salt (time, k, j, i) float64 ...\n U (time, k, j, i_g) float32 ...\n V (time, k, j_g, i) float64 ...\n W (time, k_l, j, i) float64 ...\nAttributes:\n acknowledgement: This research was carried out by the Jet...\n author: Dimitris Menemenlis et al.\n contributor: Chris Hill, Christopher E. Henze, Jinbo ...\n contributor_role: MITgcm developer, AMES supercomputer sup...\n cdm_data_type: Grid\n Conventions: CF-1.7, ACDD-1.3\n creator_email: menemenlis@jpl.nasa.gov\n creator_institution: NASA Jet Propulsion Laboratory (JPL)\n creator_name: Dimitris Menemelis et al.\n creator_type: group\n creator_url: https://science.jpl.nasa.gov/people/Mene...\n date_created: 2021-01-20T00:00:00\n date_issued: 2021-01-20T00:00:00\n date_metadata_modified: 2021-01-20T00:00:00\n geospatial_lat_max: -53.00567\n geospatial_lat_min: -56.989952\n geospatial_lat_units: degrees_north\n geospatial_lon_max: 154.28125\n geospatial_lon_min: 150.30208\n geospatial_lon_units: degrees_east\n geospatial_bounds_crs: EPSG:4326\n geospatial_vertical_max: 0\n geospatial_vertical_min: -6134.5\n geospatial_vertical_positive: up\n geospatial_vertical_resolution: variable\n geospatial_vertical_units: meter\n history: Inaugural release of LLC4320 regions to ...\n id: MITgcm_LLC4320_Pre-SWOT_JPL_L4_ACC_SMST_...\n institution: NASA Jet Propulsion Laboratory (JPL)\n instrument_vocabulary: GCMD instrument keywords\n keywords: EARTH SCIENCE SERVICES > MODELS > EARTH ...\n keywords_vocabulary: NASA Global Change Master Directory (GCM...\n license: Public Domain\n metadata_link: http://podaac.jpl.nasa.gov/ws/metadata/d...\n naming_authority: gov.nasa.jpl\n platform_vocabulary: GCMD platform keywords\n processing_level: L4\n product_time_coverage_end: 2012-11-15T00:00:00\n product_time_coverage_start: 2011-09-13T00:00:00\n product_version: 1.0\n program: NASA Physical Oceanography\n project: Surface Water and Ocean Topography (SWOT...\n publisher_email: podaac@podaac.jpl.nasa.gov\n publisher_institution: PO.DAAC\n publisher_name: Physical Oceanography Distributed Active...\n publisher_type: institution\n publisher_url: https://podaac.jpl.nasa.gov\n source: MITgcm simulation\n standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadat...\n summary: This is a subset of a global ocean simul...\n time_coverage_end: 2011-12-21 23:00:00\n time_coverage_start: 2011-12-21 00:00:00\n title: LLC4320 regional Southern Ocean\n geospatial_lon_resolution: variable\n geospatial_lat_resolution: variable\n platform: MITgcm" - }, - { - "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-eight-2d-fields.", - "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-eight-2d-fields.", - "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", - "section": "Plot eight 2D fields.", - "text": "Plot eight 2D fields.\n\nfig,ax=plt.subplots(3,3,figsize=(16,16))\n\nvarn=['Eta','KPPhbl','PhiBot','oceFWflx','oceQnet','oceQsw','oceSflux','oceTAUY','oceTAUX']\n\nfor i in range(3):\n for j in range(3):\n dd[varn[i*3+j]][0,...].plot(ax=ax[j,i])\n ax[j,i].set_title(varn[i*3+j])\nplt.tight_layout()" - }, - { - "objectID": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-a-3d-field-based-temperature", - "href": "notebooks/Pre-SWOT_Numerical_Simulation_Demo.html#plot-a-3d-field-based-temperature", - "title": "PRE-SWOT NUMERICAL SIMULATION VERSION 1 User Guide Demo", - "section": "Plot a 3D field based (temperature)", - "text": "Plot a 3D field based (temperature)\n\nfig,ax=plt.subplots(1,2,figsize=(20,10))\ntheta=dd['Theta'][:]\ntheta.coords['k']=dd['Z'].data\n\ntheta[0,0,...].plot(ax=ax[0])\nax[0].vlines(100,0,400,colors='w')\ntheta[0,:,:,100].plot(ax=ax[1])" - }, - { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#before-you-start", - "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#before-you-start", - "title": "\nTable of Contents\n", - "section": "Before you start", - "text": "Before you start\nBefore you beginning this tutorial, make sure you have an Earthdata account: https://urs.earthdata.nasa.gov for the operations envionrment (most common) or https://uat.urs.earthdata.nasa.gov for the UAT environment.\nAccounts are free to create and take just a moment to set up.\n\nimport requests\nfrom os import makedirs\nfrom os.path import isdir, basename\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen, urlretrieve\nfrom datetime import datetime, timedelta\nfrom json import dumps, loads\nimport earthaccess\nfrom earthaccess import Auth, DataCollections, DataGranules, Store", + "objectID": "quarto_text/SWOT.html#swot-background", + "href": "quarto_text/SWOT.html#swot-background", + "title": "SWOT", + "section": "SWOT Background", + "text": "SWOT Background\nThe Surface Water and Ocean Topography (SWOT) mission aims to provide valuable data and information about the world’s oceans and its terrestrial surface water such as lakes, rivers, and wetlands. SWOT is jointly developed by NASA and Centre National D’Etudes Spatiales (CNES), with contributions from the Canadian Space Agency (CSA) and United Kingdom Space Agency (UKSA). The satellite launched on December 16, 2022. PO.DAAC is the NASA archive for the SWOT mission, and has made data available via the NASA Earthdata Cloud (hosted in AWS) with direct download capabilities available. PO.DAAC hosts a variety of SWOT data products, whose product description documents can be found in the chart listing each dataset. More information can be found on PO.DAAC’s SWOT webpage and the SWOT Data User Handbook. Refer to this Mission Events page for relevant information about spacecraft events that impact data quality and availability. To give feedback or ask questions on data products, post in this Earthdata Forum topic.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access NRT Data" + "SWOT" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#authentication-with-earthaccess", - "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#authentication-with-earthaccess", - "title": "\nTable of Contents\n", - "section": "Authentication with earthaccess", - "text": "Authentication with earthaccess\nIn this notebook, we will be calling the authentication in the below cell.\n\nauth = earthaccess.login(strategy=\"interactive\", persist=True)", + "objectID": "quarto_text/SWOT.html#swot-data-resources-tutorials", + "href": "quarto_text/SWOT.html#swot-data-resources-tutorials", + "title": "SWOT", + "section": "SWOT Data Resources & Tutorials", + "text": "SWOT Data Resources & Tutorials\n\nSearch & Download\n\nVia Graphical User Interface:\n\nFind/download SWOT data on Earthdata Search\n\n\n\nProgrammatically: ie. within Python code workflows\n\nSearch and Download via earthaccess\nwith unique SWORD river reach ID\nwith unique Hydrologic Unit Code (HUC) basin ID\n\n\n\nVia Command Line - PO.DAAC subscriber/downloader examples:\nHydrology: These examples will download either the river vector files or the raster files for February 2024:\npodaac-data-downloader -c SWOT_L2_HR_RiverSP_2.0 -d ./SWOT_L2_HR_RiverSP_2.0/ --start-date 2024-02-01T00:00:00Z --end-date 2024-02-29T23:59:59Z\nThis only downloads 1 hours worth of data for the globe:\npodaac-data-downloader -c SWOT_L2_HR_Raster_2.0 -d ./SWOT_L2_HR_Raster_2.0/ --start-date 2024-02-01T00:00:00Z --end-date 2024-02-29T00:59:59Z\nOceanography: These examples will download modeled sea surface heights for the whole SSH collection and then the anomalies using the subscriber then downloader and finally, subset the data by bounding box:\npodaac-data-subscriber -c SWOT_L2_LR_SSH_2.0 -d ./SWOT_L2_LR_SSH_2.0/ --start-date 2023-03-29T00:00:00Z \npodaac-data-subscriber -c SWOT_L2_NALT_OGDR_SSHA_2.0 -d ./data/SWOT_L2_NALT_OGDR_SSHA_2.0 --start-date 2023-08-01T00:00:00Z --end-date 2023-08-02T00:00:00Z\npodaac-data-downloader -c SWOT_L2_NALT_OGDR_SSHA_2.0 -d ./data/SWOT_L2_NALT_OGDR_SSHA_2.0 --start-date 2023-06-23T00:00:00Z --end-date 2023-06-23T06:00:00Z\npodaac-data-downloader -c SWOT_L2_LR_SSH_Basic_2.0 -d ./data -sd 2023-11-25T00:00:00Z -ed 2023-12-15T00:00:00Z -b=\"-22.0,-27,6.5,0\" --subset\n\nSee how to Download/Subscribe for more information on how to use the PO.DAAC subscriber/downloader including with spatial queries.\n\n\n\nSearch SWOT Passes over Time\nCNES developed this dedicated visualization tool for a quick look at where SWOT has been, where it is, and where it will be. Once you have selected the area of interest, click the Search button to search for SWOT passes. The results are displayed in a table and the swaths that intersect the area of interest are displayed on the map. Click on the marker to view the pass number.\nTo launch the Binder application, click on this link.\nTo launch jupyterlab in Binder, clink on this link.\nNote: The Binder versions of this are for casual quick looks, but we recommend for extensive use to access the Jupyter Notebook directly here.\n\n\nSWOT Spatial Coverage\nTo identify spatial coverage/search terms for the science 21-day orbit, PO.DAAC has created a KMZ file that has layers of the SWOT passes and tiles, with corresponding scene numbers identified in the pop-up when a location is selected (see screenshot below). Each layer has direct links to Earthdata Search results (the ‘search’ links) for corresponding files. The passes layer has useful information for all SWOT products, but links to the LR products specifically, the tiles layer is useful for HR products (L1B_HR_SLC, L2_HR_PIXC, and L2_HR_PIXCVec products use tile spatial extents while the L2_HR_Raster product uses scenes. L2_HR_RiverSP and L2_HR_LakeSp use continent-level passes).\nTo download the KMZ file, for the science 21-day orbit, click here.\nFor the Beta Pre-validated data KMZ that used the cal/val 1-day orbit, click here.\nThese files can be opened in the Google Earth desktop application and viewed like the following:\n\n\n\n\n\nScreenshot of pass and tile layer in spatial coverage KMZ file viewed in the Google Earth Desktop application\n\n\n\nThe KaRIN HR Masks true/false text pop up for tiles comes from the two different masks used for different parts of the year. The ‘Seasonal’ mask is used from Dec 1st to March 1st and removes part of the Canadian archipelago coverage to collect additional data over sea ice instead, indicated by true/false statements.\n\n\nTips for SWOT Spatial Search\nTo support spatial search of SWOT data products, the following naming conventions may be of help. Tip: use these shortname identifiers below when searching for SWOT data in the NASA Earthdata Search portal or programmatically using the CMR API and/or earthaccess python library.\nSWOT HR data products use Tiles, Scenes, or Continent-level Swaths IDs depending on the product, which define the spatial extent of what is in each file, as follows in the chart below. Along-track scene and tile numbers are numbered sequentially following the spacecraft flight direction, so the numbers increase from south to north for ascending passes and from north to south for descending passes. SWOT LR products use global swaths and nadir tracks that use pass numbers. See SWOT Spatial Coverage Section above for information to find the pass, tile or scene numbers.\n\n\n\n\n\n\n\n\n\n\nProduct (organized by…)\nFile Naming Convention\nNotes\n\n\n\n\n\n\nL2_HR_RiverSP L2_HR_LakeSP (continent-level swaths)\nPPP_CC\nPPP = pass number (valid range: 001-584) CC = continent code (options listed below) AF - Africa EU - Europe and Middle East SI - Siberia AS - Central and Southeast Asia AU - Australia and Oceania SA - South America NA - North America and Caribbean AR - North American Arctic GR - Greenland Ex: 013_NA = pass 013, North America\n\n\n\n\nL2_HR_PIXC L2_HR_PIXCVec L1B_HR_SLC (tiles)\nPPP_TTTC\nPPP = pass number (valid range: 001-584) TTT = tile number (valid range: 001-308) C = character L or R corresponding to left or right swaths Ex: 001_120R = pass 001, right swath, tile 120\n\n\n\n\nL2_HR_Raster (scenes)\nPPP_SSS\nPPP = pass number (valid range: 001-584) SSS = scene number (valid range: 001-154) Scenes correspond to 2 x 2 sets of tiles scene number x 2 = tile number Ex: 001_060 = pass 001, scene 60, corresponding to the same location as the PIXC/PIXCVec tile example above.\n\n\n\n\nL2_RAD_(O/I)GDR L2_NALT_(O/I)GDR(nadir) L2_LR_SSH (swath)\nPPP_\nPPP = pass number (valid range: 001-584) Ex: 013_ = pass 013\n\n\n\n\n\nIn Earthdata Search GUI:\n\nUse the top left Search Box and search with keywords, e.g. SWOT L2 HR\nSelect a collection of interest\nA Filter Granule filtering capability will show up on the left hand side of the GUI. Recall naming convention is _cycle_pass_spatialIdentifier_.\n\nUse wildcards to narrow down spatially, using one of the codes from the table above depending on your use case. Tip: use underscores ( _ ) with your wildcard key words for a more specific search.\nExample: *_NA_* will filter the RiverSP or LakeSP collection selected to only return those granules (files) that are part of the North America collection\nExample: *_004_256_* will filter the RiverSP or LakeSP collection selected to only return those granules (files) that correspond to cycle 004, pass 256\nExample: *_004_253_128* will filter the Raster collection selected to only return those granules (files) that correspond to cycle 004, pass 253, scene 128\n\nIn addition, you can also draw a region of interest (ROI) on the map, using the Spatial Search Filter icon or the Advanced Search under the main search box. These will help to filter what is returned for the spatial search. Tip: It is recommended that ROI searches are used together with wildcards described above for a more accurate search.\n\n\n\n\nAccess & Visualization\n\n\n\n\n\nBasic Access SWOT Hydrology data in the cloud | locally\n\n\nBasic Access SWOT Oceanography data in the cloud | locally\n\n\nSWOT Raster Multifile Access & Quality Flag Application in the cloud | locally\n\n\nHydrocron: Time series API Multi-reach tutorial - See Hydrocron documentation and more description under tools below. \n\n\nSWOT Pixel Cloud (PIXC) Area Aggregration locally\n\n\nSWOT Pixel Cloud (PIXC) Phase Unwrapping Error Fix locally\n\n\nQuality Flag Tutorial - Quality Flag Tips for all products, specifically demonstrates SSHA 8-bit quality flag application\n\n\n\nData Story\n\nSWOT Hydrology Science Workflow in the Cloud - Retrieving SWOT attributes (WSE, width, slope) and plotting a longitudinal profile along a river or over a basin\n\n\n\nGIS workflows\n\nSWOT: Through a GIS Lens StoryMap\n\n\nShapefile exploration\n\n\nTransform SWOT Datetime field for use in GIS Software\n\n\n\nTransform\n\nHiTIDE subsetter for Sea Surface Height Products - select KaRIn instrument in sensors, see video tutorial here\n\n\nHydrocron: Time series API - Currently for rivers, see Hydrocron documentation and more description under tools below. \n\n\nTransform SWOT Hydrology lake shapefiles into time series - work around for lake time series while Hydrocron is under development to include lakes.\n\n\nNetCDF to Geotiff Conversion - mac or Linux | Windows\n\n\n\nTools\nHydrocron - an API that repackages the river shapefile dataset (L2_HR_RiverSP) into csv or GeoJSON formats that make time-series analysis easier. SWOT data is archived as individually timestamped shapefiles, which would otherwise require users to perform potentially thousands of file operations per river feature to view the data as a timeseries. Hydrocron makes this possible with a single API call.\nSWODLR - a system for generating on demand raster products from SWOT L2 raster data with custom resolutions, projections, and extents. -in development\nHiTIDE subsetter for Sea Surface Height Products - select KaRIn instrument in sensors, see video tutorial here\n\n\nSWORD of Science\nThe SWORD of Science (SoS) is a community-driven dataset produced for and from the execution of the Confluence workflow which is a cloud-based workflow that executes on SWOT observations to produce river discharge parameter estimates. Data granules contain two files, priors and results. The priors file contains prior information, such as in-situ gauge data and model output that is used to generate the discharge products. The results file contains the resulting river discharge data products.\n\nExplore river discharge\nExplore river discharge with gauge data\nPlot ALL river discharge algorithms\nVisualize river discharge", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access NRT Data" + "SWOT" ] }, { - "objectID": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#hands-off-workflow", - "href": "notebooks/sentinel-6/Access_Sentinel6_NRT.html#hands-off-workflow", - "title": "\nTable of Contents\n", - "section": "Hands-off workflow", - "text": "Hands-off workflow\nThis workflow/notebook can be run routinely to maintain a time series of NRT data, downloading new granules as they become available in CMR.\nThe notebook writes/overwrites a file .update to the target data directory with each successful run. The file tracks to date and time of the most recent update to the time series of NRT granules using a timestamp in the format yyyy-mm-ddThh:mm:ssZ.\nThe timestamp matches the value used for the created_at parameter in the last successful run. This parameter finds the granules created within a range of datetimes. This workflow leverages the created_at parameter to search backwards in time for new granules ingested between the time of our timestamp and now.\nThe variables in the cell below determine the workflow behavior on its initial run:\n\nmins: Initialize a new local time series by starting with the granules ingested since ___ minutes ago.\ncmr: The domain of the target CMR instance, either cmr.earthdata.nasa.gov.\nccid: The unique CMR concept-id of the desired collection.\ndata: The path to a local directory in which to download/maintain a copy of the NRT granule time series.\n\n\ncmr = \"cmr.earthdata.nasa.gov\"\n\n# this function returns a concept id for a particular dataset\ndef get_collection(url: str=f\"https://{cmr}/search/collections.umm_json\", **params):\n return requests.get(url, params).json().get(\"items\")[0]\n\n#\n# This cell accepts parameters from command line with papermill: \n# https://papermill.readthedocs.io\n#\n# These variables should be set before the first run, then they \n# should be left alone. All subsequent runs expect the values \n# for cmr, ccid, data to be unchanged. The mins value has no \n# impact on subsequent runs.\n#\n\nmins = 20\n\nname = \"JASON_CS_S6A_L2_ALT_LR_RED_OST_NRT_F\"\n\nccid = get_collection(ShortName=name).get(\"meta\").get(\"concept-id\")\n\ndata = \"resources/nrt\"\n\nThe variable data is pointed at a nearby folder resources/nrt by default. You should change data to a suitable download path on your file system. An unlucky sequence of git commands could disappear that folder and its downloads if your not careful. Just change it.\nThe Python imports relevant to the workflow\nThe search retrieves granules ingested during the last n minutes. A file in your local data dir file that tracks updates to your data directory, if one file exists. The CMR Search falls back on the ten minute window if not.\n\ntimestamp = (datetime.utcnow()-timedelta(minutes=mins)).strftime(\"%Y-%m-%dT%H:%M:%SZ\")\ntimestamp\n\n'2023-08-02T21:08:21Z'\n\n\nThis cell will replace the timestamp above with the one read from the .update file in the data directory, if it exists.\n\nif not isdir(data):\n print(f\"NOTE: Making new data directory at '{data}'. (This is the first run.)\")\n makedirs(data)\nelse:\n try:\n with open(f\"{data}/.update\", \"r\") as f:\n timestamp = f.read()\n except FileNotFoundError:\n print(\"WARN: No .update in the data directory. (Is this the first run?)\")\n else:\n print(f\"NOTE: .update found in the data directory. (The last run was at {timestamp}.)\")\n\nWARN: No .update in the data directory. (Is this the first run?)\n\n\nThere are several ways to query for CMR updates that occured during a given timeframe. Read on in the CMR Search documentation:\n\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-new-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#c-with-revised-granules (Collections)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-production-date (Granules)\nhttps://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#g-created-at (Granules)\n\nThe created_at parameter works for our purposes. It’s a granule search parameter that returns the records ingested since the input timestamp.\n\nparams = {\n 'scroll': \"true\",\n 'page_size': 2000,\n 'sort_key': \"-start_date\",\n 'collection_concept_id': ccid, \n 'created_at': timestamp,\n # Limit results to coverage for .5deg bbox in Gulf of Alaska:\n 'bounding_box': \"-146.5,57.5,-146,58\",\n}\n\nparams\n\n{'scroll': 'true',\n 'page_size': 2000,\n 'sort_key': '-start_date',\n 'collection_concept_id': 'C1968980576-POCLOUD',\n 'created_at': '2023-08-02T21:08:21Z',\n 'bounding_box': '-146.5,57.5,-146,58'}\n\n\nGet the query parameters as a string and then the complete search url:\n\nquery = urlencode(params)\nurl = f\"https://{cmr}/search/granules.umm_json?{query}\"\nprint(url)\n\nhttps://cmr.earthdata.nasa.gov/search/granules.umm_json?scroll=true&page_size=2000&sort_key=-start_date&collection_concept_id=C1968980576-POCLOUD&created_at=2023-08-02T21%3A08%3A21Z&bounding_box=-146.5%2C57.5%2C-146%2C58\n\n\nGet a new timestamp that represents the UTC time of the search. Then download the records in umm_json format for granules that match our search parameters:\n\nwith urlopen(url) as f:\n results = loads(f.read().decode())\n\nprint(f\"{results['hits']} new granules ingested for '{ccid}' since '{timestamp}'.\")\n\ntimestamp = datetime.utcnow().strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n0 new granules ingested for 'C1968980576-POCLOUD' since '2023-08-02T21:08:21Z'.\n\n\nNeatly print the first granule record (if one was returned):\n\nif len(results['items'])>0:\n print(dumps(results['items'][0], indent=2))\n\nThe link for http access can be retrieved from each granule record’s RelatedUrls field. The download link is identified by \"Type\": \"GET DATA\" .\nSelect the download URL for each of the granule records:\n\ndownloads = [[u['URL'] for u in r['umm']['RelatedUrls'] if u['Type']==\"GET DATA\"][0] for r in results['items']]\ndownloads\n\n[]\n\n\nFinish by downloading the files to the data directory in a loop. Overwrite .update with a new timestamp on success.\n\nfor f in downloads:\n try:\n earthaccess.download([f[0]], f\"{data}/{basename(f)}\")\n except Exception as e:\n print(f\"[{datetime.now()}] FAILURE: {f}\\n\\n{e}\\n\")\n raise e\n else:\n print(f\"[{datetime.now()}] SUCCESS: {f}\")\n\nIf there were updates to the local time series during this run and no exceptions were raised during the download loop, then overwrite the timestamp file that tracks updates to the data folder (resources/nrt/.update):\n\nif len(results['items'])>0:\n with open(f\"{data}/.update\", \"w\") as f:\n f.write(timestamp)", + "objectID": "quarto_text/SWOT.html#additional-resources", + "href": "quarto_text/SWOT.html#additional-resources", + "title": "SWOT", + "section": "Additional Resources", + "text": "Additional Resources\n\nData Descriptions and Features\nSWOT Data User Handbook\nFeatures of KaRIn Data that Users Should be Aware of - Slide Deck presented at the 2023 SWOT Science Team by Curtis Chen that addresses practical aspects of interpreting SWOT KaRIn data products, answers frequently asked questions, and provides tips to hopefully avoid misinterpretation and confusion of the data.\nLatest Release Notes - Version C KaRIn Science Data Products (aka 2.0) - See section 6 for current issues and features of the datasets!\nMission Spacecraft Events - page for relevant information about spacecraft events that impact data quality and availability.\nSWOT Data Product User Feedback - Post on this topic in the Earthdata Forum to give feedback or ask questions of the experts!\n\n\nA Priori Databases\nSWOT River Database (SWORD) - the database for rivers SWOT products are based upon, great for discovering river reach IDs!\nPrior Lake Database (PLD) - Add in the PLD layer into Hydroweb.next to see the lakes SWOT products are based upon, great for discovering lake IDs!\n\n\nEarthdata Webinar\nAccessing Data for the World’s Water with SWOT\nWatch the Recording! Learn how to discover, access, and use SWOT mission data and how these data can lead to new, innovative science and applications in the world of water.\n\n\nSWOT Community GitHub Repository\nhttps://github.com/SWOT-community\nThis is a code space for the global SWOT mission community. We share experience, code, research and much more. Our mission is to increase the value of SWOT.\n\n\nData in Action Stories\nFacing the challenges of using high-resolution sea surface height observations from SWOT\nUnveiling the first global observations of high resolution Sea Surface Height from SWOT\n\n\nWorkshops\n\n2024 SWOT Early Career Researcher Workshop Using Binder\nhttps://github.com/podaac/2024-SWOT-ECR-Workshop\nExplore SWOT data on a Binder virtual environment or local machine. This material was presented at the 9th Global Energy and Water Exchanges (GEWEX) Open Science Conference and the Hacking Limnology 2024 Virtual Summit Remote Sensing Day.\n\n\n2024 SWOT Hydrology Data Access Workshop\nhttps://podaac.github.io/2024-SWOT-Hydro-Workshop/\nThis workshop focuses on the SWOT Hydrology datasets including river and lake vector data in shapefiles, and raster, pixel cloud, and pixel vector data in netCDF. In this pre-meeting workshop for the AGU Chapman: Remote Sensing of the Water Cycle Conference, participants are introduced to SWOT and the various ways to access and utilize its data products, including via cloud computing, local download, and data transformation tools.\n\n\n2022 SWOT Ocean Cloud Workshop\nhttps://podaac.github.io/2022-SWOT-Ocean-Cloud-Workshop/\nThe goal of the workshop was to enable the (oceanography) science team to be ready for processing and handling the large volumes of SWOT SSH data in the cloud. Learning objectives focus on how to access the simulated SWOT L2 SSH data from Earthdata Cloud either by downloading or accessing the data on the cloud.", "crumbs": [ "Tutorials", "Dataset Specific", - "Sentinel-6 Michael Freilich", - "Access NRT Data" + "SWOT" ] - }, - { - "objectID": "mcc_api/metadata_compliance_checker_API.html", - "href": "mcc_api/metadata_compliance_checker_API.html", - "title": "MCC - API POST", - "section": "", - "text": "Template for making API calls to Metadata Compliance Checker (MCC) using a local netCDF or HDF file, and outputing the response to JSON" - }, - { - "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc-endpoints", - "href": "mcc_api/metadata_compliance_checker_API.html#mcc-endpoints", - "title": "MCC - API POST", - "section": "MCC Endpoints", - "text": "MCC Endpoints\nPROD - https://mcc.podaac.earthdatacloud.nasa.gov/\nUAT - https://mcc.podaac.uat.earthdatacloud.nasa.gov/mcc\n\nimport json\nimport requests\nimport sys\n\n# Choose VENUE: UAT or PROD\nmcc_env = 'UAT'\nmcc_env = 'PROD'" - }, - { - "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc-dictionary---environments", - "href": "mcc_api/metadata_compliance_checker_API.html#mcc-dictionary---environments", - "title": "MCC - API POST", - "section": "MCC Dictionary - Environments", - "text": "MCC Dictionary - Environments\n\nurl_dict = {\n 'UAT': \"https://mcc.podaac.uat.earthdatacloud.nasa.gov/mcc\",\n 'PROD': \"https://mcc.podaac.earthdatacloud.nasa.gov/\"\n}\n\nmcc_host = url_dict.get(mcc_env)\n\n\n# Print\nprint(mcc_env, \" - \" , mcc_host)" - }, - { - "objectID": "mcc_api/metadata_compliance_checker_API.html#mcc---api-post-query-example-for-a-local-file", - "href": "mcc_api/metadata_compliance_checker_API.html#mcc---api-post-query-example-for-a-local-file", - "title": "MCC - API POST", - "section": "MCC - API POST query example (for a local file)", - "text": "MCC - API POST query example (for a local file)\nSee https://mcc.podaac.earthdatacloud.nasa.gov/mcc/about_api for a description of the query parameters (accessed via payload{} dictionary in this example)\n\nurl = mcc_host + \"/check\"\n\npayload = {\n'ACDD':'on',\n'ACDD-version':'1.3',\n'CF':'on',\n'CF-version':'1.7',\n'response':'json',\n}\n\n\n# set the path and filename to upload to MCC\ndirname = \"my_local_path_to_the_file\"\nfilename = \"myFile.nc\"\n\n# working examples . . . comment out, modify or remove these two lines as needed\ndirname = \"./data/\"\nfilename = \"ascat_20210101_000900_metopa_73696_eps_o_coa_3202_ovw.l2.nc\"\n\n\nfiles=[\n ('file-upload',\n (\n filename, \n open(dirname+filename,'rb'),'application/octet-stream'\n\n )\n )\n]\n\nheaders = {}\n\n# Ping the API; format the response in json; pretty print the json response\nresponse = requests.request(\"POST\", url, headers=headers, data=payload, files=files)\njson_resp = json.loads(response.text)\njson_resp_formatted = json.dumps(json_resp, indent=2)\nprint(json_resp_formatted)" } ] \ No newline at end of file diff --git a/site_libs/bootstrap/bootstrap-dark.min.css b/site_libs/bootstrap/bootstrap-dark.min.css index 56132101..ace4afd9 100644 --- a/site_libs/bootstrap/bootstrap-dark.min.css +++ b/site_libs/bootstrap/bootstrap-dark.min.css @@ -2,7 +2,7 @@ * Bootstrap v5.3.1 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #375a7f;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #00bc8c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ebebeb;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #444;--bs-gray-800: #343a40;--bs-gray-900: #222;--bs-default: #434343;--bs-primary: #375a7f;--bs-secondary: #434343;--bs-success: #00bc8c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #6f6f6f;--bs-dark: #2d2d2d;--bs-default-rgb: 67, 67, 67;--bs-primary-rgb: 55, 90, 127;--bs-secondary-rgb: 67, 67, 67;--bs-success-rgb: 0, 188, 140;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 111, 111, 111;--bs-dark-rgb: 45, 45, 45;--bs-primary-text-emphasis: #162433;--bs-secondary-text-emphasis: #1b1b1b;--bs-success-text-emphasis: #004b38;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #444;--bs-dark-text-emphasis: #444;--bs-primary-bg-subtle: #d7dee5;--bs-secondary-bg-subtle: #d9d9d9;--bs-success-bg-subtle: #ccf2e8;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #afbdcc;--bs-secondary-border-subtle: #b4b4b4;--bs-success-border-subtle: #99e4d1;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ebebeb;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #fff;--bs-body-color-rgb: 255, 255, 255;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(255, 255, 255, 0.75);--bs-secondary-color-rgb: 255, 255, 255;--bs-secondary-bg: #ebebeb;--bs-secondary-bg-rgb: 235, 235, 235;--bs-tertiary-color: rgba(255, 255, 255, 0.5);--bs-tertiary-color-rgb: 255, 255, 255;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #00bc8c;--bs-link-color-rgb: 0, 188, 140;--bs-link-decoration: underline;--bs-link-hover-color: #009670;--bs-link-hover-color-rgb: 0, 150, 112;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(55, 90, 127, 0.25);--bs-form-valid-color: #00bc8c;--bs-form-valid-border-color: #00bc8c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b2e31;--bs-tertiary-bg-rgb: 43, 46, 49;--bs-primary-text-emphasis: #879cb2;--bs-secondary-text-emphasis: #8e8e8e;--bs-success-text-emphasis: #66d7ba;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #0b1219;--bs-secondary-bg-subtle: #0d0d0d;--bs-success-bg-subtle: #00261c;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #21364c;--bs-secondary-border-subtle: #282828;--bs-success-border-subtle: #007154;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #444;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #879cb2;--bs-link-hover-color: #9fb0c1;--bs-link-color-rgb: 135, 156, 178;--bs-link-hover-color-rgb: 159, 176, 193;--bs-code-color: white;--bs-border-color: #444;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #66d7ba;--bs-form-valid-border-color: #66d7ba;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ebebeb}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:inherit;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#222;background-color:#fff;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(255,255,255,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#222;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(255,255,255,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #fff;--bs-table-bg: #222;--bs-table-border-color: #434343;--bs-table-accent-bg: transparent;--bs-table-striped-color: #fff;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #fff;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #fff;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #fff}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #375a7f;--bs-table-border-color: #4b6b8c;--bs-table-striped-bg: #416285;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b6b8c;--bs-table-active-color: #fff;--bs-table-hover-bg: #466689;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #434343;--bs-table-border-color: #565656;--bs-table-striped-bg: #4c4c4c;--bs-table-striped-color: #fff;--bs-table-active-bg: #565656;--bs-table-active-color: #fff;--bs-table-hover-bg: #515151;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #00bc8c;--bs-table-border-color: #1ac398;--bs-table-striped-bg: #0dbf92;--bs-table-striped-color: #fff;--bs-table-active-bg: #1ac398;--bs-table-active-color: #fff;--bs-table-hover-bg: #13c195;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #fff;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #fff;--bs-table-bg: #6f6f6f;--bs-table-border-color: #7d7d7d;--bs-table-striped-bg: #767676;--bs-table-striped-color: #fff;--bs-table-active-bg: #7d7d7d;--bs-table-active-color: #fff;--bs-table-hover-bg: #7a7a7a;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #2d2d2d;--bs-table-border-color: #424242;--bs-table-striped-bg: #383838;--bs-table-striped-color: #fff;--bs-table-active-bg: #424242;--bs-table-active-color: #fff;--bs-table-hover-bg: #3d3d3d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(255,255,255,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#2d2d2d;background-color:#fff;border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#595959;opacity:1}.form-control:disabled{background-color:#ebebeb;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#6f6f6f;background-color:#434343;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#363636}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#595959;background-color:#ebebeb}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #2d2d2d}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:none;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#375a7f;border-color:#375a7f}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#375a7f;border-color:#375a7f;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239badbf'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c3ced9}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c3ced9}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(255,255,255,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(255,255,255,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ebebeb}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6f6f6f;text-align:center;white-space:nowrap;background-color:#434343;border:1px solid #adb5bd;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#00bc8c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#00bc8c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#00bc8c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#00bc8c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#00bc8c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#00bc8c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#00bc8c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #fff;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2f4d6c;--bs-btn-hover-border-color: #2c4866;--bs-btn-focus-shadow-rgb: 85, 115, 146;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c4866;--bs-btn-active-border-color: #29445f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #375a7f;--bs-btn-disabled-border-color: #375a7f}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00a077;--bs-btn-hover-border-color: #009670;--bs-btn-focus-shadow-rgb: 38, 198, 157;--bs-btn-active-color: #fff;--bs-btn-active-bg: #009670;--bs-btn-active-border-color: #008d69;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #00bc8c;--bs-btn-disabled-border-color: #00bc8c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #fff;--bs-btn-bg: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5e5e5e;--bs-btn-hover-border-color: #595959;--bs-btn-focus-shadow-rgb: 133, 133, 133;--bs-btn-active-color: #fff;--bs-btn-active-bg: #595959;--bs-btn-active-border-color: #535353;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6f6f6f;--bs-btn-disabled-border-color: #6f6f6f}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #4d4d4d;--bs-btn-hover-border-color: #424242;--bs-btn-focus-shadow-rgb: 77, 77, 77;--bs-btn-active-color: #fff;--bs-btn-active-bg: #575757;--bs-btn-active-border-color: #424242;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2d2d2d;--bs-btn-disabled-border-color: #2d2d2d}.btn-outline-default{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #375a7f;--bs-btn-hover-border-color: #375a7f;--bs-btn-focus-shadow-rgb: 55, 90, 127;--bs-btn-active-color: #fff;--bs-btn-active-bg: #375a7f;--bs-btn-active-border-color: #375a7f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #375a7f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #375a7f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00bc8c;--bs-btn-hover-border-color: #00bc8c;--bs-btn-focus-shadow-rgb: 0, 188, 140;--bs-btn-active-color: #fff;--bs-btn-active-bg: #00bc8c;--bs-btn-active-border-color: #00bc8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #00bc8c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #00bc8c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6f6f6f;--bs-btn-hover-border-color: #6f6f6f;--bs-btn-focus-shadow-rgb: 111, 111, 111;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6f6f6f;--bs-btn-active-border-color: #6f6f6f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6f6f6f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6f6f6f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2d2d2d;--bs-btn-hover-border-color: #2d2d2d;--bs-btn-focus-shadow-rgb: 45, 45, 45;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2d2d2d;--bs-btn-active-border-color: #2d2d2d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2d2d2d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2d2d2d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #00bc8c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #009670;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #009670;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 38, 198, 157;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #fff;--bs-dropdown-bg: #222;--bs-dropdown-border-color: #434343;--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: #434343;--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #fff;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #375a7f;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: rgba(255, 255, 255, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: #434343;--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: #434343;--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #00bc8c;--bs-nav-link-hover-color: #009670;--bs-nav-link-disabled-color: #6f6f6f;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #434343;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #434343 #434343 transparent;--bs-nav-tabs-link-active-color: #fff;--bs-nav-tabs-link-active-bg: #222;--bs-nav-tabs-link-active-border-color: #434343 #434343 transparent;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #375a7f}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #2d2d2d;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #fff;--bs-accordion-bg: #222;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #fff;--bs-accordion-btn-bg: #222;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162433'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #9badbf;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #162433;--bs-accordion-active-bg: #d7dee5}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: #434343;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(255, 255, 255, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(255, 255, 255, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #00bc8c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #00efb2;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #009670;--bs-pagination-focus-bg: #ebebeb;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #00efb2;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #fff;--bs-pagination-disabled-bg: #007053;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #434343;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #375a7f;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #fff;--bs-list-group-bg: #2d2d2d;--bs-list-group-border-color: #434343;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(255, 255, 255, 0.75);--bs-list-group-action-hover-color: #fff;--bs-list-group-action-hover-bg: #434343;--bs-list-group-action-active-color: #fff;--bs-list-group-action-active-bg: #222;--bs-list-group-disabled-color: rgba(255, 255, 255, 0.75);--bs-list-group-disabled-bg: #2d2d2d;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #375a7f;--bs-list-group-active-border-color: #375a7f;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: #434343;--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(255, 255, 255, 0.75);--bs-toast-header-bg: #2d2d2d;--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #2d2d2d;--bs-modal-border-color: #434343;--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #434343;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #434343;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #222;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #2d2d2d;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #434343;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #fff;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #fff;--bs-offcanvas-bg: #222;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: #434343;--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#fff !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(44, 72, 102, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(44, 72, 102, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(0, 150, 112, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(0, 150, 112, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(89, 89, 89, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(89, 89, 89, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(36, 36, 36, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(36, 36, 36, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#fff}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}:root{--bslib-page-sidebar-title-bg: #375a7f;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #222);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#dee2e6}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fff}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#fefefe}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#fefefe;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#fefefe}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#fefefe}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(252,254,254,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#cbcbcb}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#fefefe}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(252,254,254,.8)}div.sidebar-item-container.disabled{color:rgba(254,254,254,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#fcfefe}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#6f6f6f}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #434343 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #434343}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#6f6f6f;border-bottom:1px solid #434343}.quarto-banner nav.quarto-secondary-nav{background-color:#375a7f;color:#dee2e6;border-top:1px solid #434343}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#009670}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#222}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #434343}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#8a8a8a}.nav-footer a{color:#8a8a8a}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#dee2e6;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#fefefe;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#222;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#222;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#dee2e6;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#dee2e6;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #adb5bd;border-radius:.25rem;color:#2d2d2d;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#2d2d2d;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#2d2d2d;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#2d2d2d;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#2d2d2d;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #adb5bd 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#2f2f2f;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#2b4663}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#2d2d2d}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#000}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#2d2d2d;color:#fff}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#2d2d2d;border-color:#adb5bd;color:#fff}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #adb5bd}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#dee2e6}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#fefefe}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(34,34,34,.65);width:90%;bottom:0;box-shadow:rgba(173,181,189,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#222;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#222;border-bottom:1px solid #adb5bd;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#fff;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(255,255,255,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#375a7f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#434343 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#00bc8c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:#3498db !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#f39c12 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:#e74c3c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#6f6f6f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#2d2d2d !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #4673a3;border-bottom:solid 1px #4673a3}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#436e9b}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#dee2e6}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#fff}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#fff}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px silver;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#222;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#222;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#fff}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#2d2d2d}.tableFloatingHeaderOriginal{background-color:#2d2d2d;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.listing-actions-group .form-select,.listing-actions-group .form-control{background-color:#222;color:#fff}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#fff;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#00bc8c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#00bc8c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#00bc8c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#222;border:solid 1px #dee2e6;border-radius:.25rem;color:#fff;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#222}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#222}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#222;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#222}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#222;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! + */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #375a7f;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #00bc8c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ebebeb;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #444;--bs-gray-800: #343a40;--bs-gray-900: #222;--bs-default: #434343;--bs-primary: #375a7f;--bs-secondary: #434343;--bs-success: #00bc8c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #6f6f6f;--bs-dark: #2d2d2d;--bs-default-rgb: 67, 67, 67;--bs-primary-rgb: 55, 90, 127;--bs-secondary-rgb: 67, 67, 67;--bs-success-rgb: 0, 188, 140;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 111, 111, 111;--bs-dark-rgb: 45, 45, 45;--bs-primary-text-emphasis: #162433;--bs-secondary-text-emphasis: #1b1b1b;--bs-success-text-emphasis: #004b38;--bs-info-text-emphasis: #153d58;--bs-warning-text-emphasis: #613e07;--bs-danger-text-emphasis: #5c1e18;--bs-light-text-emphasis: #444;--bs-dark-text-emphasis: #444;--bs-primary-bg-subtle: #d7dee5;--bs-secondary-bg-subtle: #d9d9d9;--bs-success-bg-subtle: #ccf2e8;--bs-info-bg-subtle: #d6eaf8;--bs-warning-bg-subtle: #fdebd0;--bs-danger-bg-subtle: #fadbd8;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #afbdcc;--bs-secondary-border-subtle: #b4b4b4;--bs-success-border-subtle: #99e4d1;--bs-info-border-subtle: #aed6f1;--bs-warning-border-subtle: #fad7a0;--bs-danger-border-subtle: #f5b7b1;--bs-light-border-subtle: #ebebeb;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #fff;--bs-body-color-rgb: 255, 255, 255;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(255, 255, 255, 0.75);--bs-secondary-color-rgb: 255, 255, 255;--bs-secondary-bg: #ebebeb;--bs-secondary-bg-rgb: 235, 235, 235;--bs-tertiary-color: rgba(255, 255, 255, 0.5);--bs-tertiary-color-rgb: 255, 255, 255;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #00bc8c;--bs-link-color-rgb: 0, 188, 140;--bs-link-decoration: underline;--bs-link-hover-color: #009670;--bs-link-hover-color-rgb: 0, 150, 112;--bs-code-color: #7d12ba;--bs-highlight-bg: #fdebd0;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(55, 90, 127, 0.25);--bs-form-valid-color: #00bc8c;--bs-form-valid-border-color: #00bc8c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #222;--bs-body-bg-rgb: 34, 34, 34;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b2e31;--bs-tertiary-bg-rgb: 43, 46, 49;--bs-primary-text-emphasis: #879cb2;--bs-secondary-text-emphasis: #8e8e8e;--bs-success-text-emphasis: #66d7ba;--bs-info-text-emphasis: #85c1e9;--bs-warning-text-emphasis: #f8c471;--bs-danger-text-emphasis: #f1948a;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #0b1219;--bs-secondary-bg-subtle: #0d0d0d;--bs-success-bg-subtle: #00261c;--bs-info-bg-subtle: #0a1e2c;--bs-warning-bg-subtle: #311f04;--bs-danger-bg-subtle: #2e0f0c;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #21364c;--bs-secondary-border-subtle: #282828;--bs-success-border-subtle: #007154;--bs-info-border-subtle: #1f5b83;--bs-warning-border-subtle: #925e0b;--bs-danger-border-subtle: #8b2e24;--bs-light-border-subtle: #444;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #879cb2;--bs-link-hover-color: #9fb0c1;--bs-link-color-rgb: 135, 156, 178;--bs-link-hover-color-rgb: 159, 176, 193;--bs-code-color: white;--bs-border-color: #444;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #66d7ba;--bs-form-valid-border-color: #66d7ba;--bs-form-invalid-color: #f1948a;--bs-form-invalid-border-color: #f1948a}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ebebeb}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:inherit;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#222;background-color:#fff;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(255,255,255,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#222;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(255,255,255,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #fff;--bs-table-bg: #222;--bs-table-border-color: #434343;--bs-table-accent-bg: transparent;--bs-table-striped-color: #fff;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #fff;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #fff;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #fff}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #375a7f;--bs-table-border-color: #4b6b8c;--bs-table-striped-bg: #416285;--bs-table-striped-color: #fff;--bs-table-active-bg: #4b6b8c;--bs-table-active-color: #fff;--bs-table-hover-bg: #466689;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #434343;--bs-table-border-color: #565656;--bs-table-striped-bg: #4c4c4c;--bs-table-striped-color: #fff;--bs-table-active-bg: #565656;--bs-table-active-color: #fff;--bs-table-hover-bg: #515151;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #00bc8c;--bs-table-border-color: #1ac398;--bs-table-striped-bg: #0dbf92;--bs-table-striped-color: #fff;--bs-table-active-bg: #1ac398;--bs-table-active-color: #fff;--bs-table-hover-bg: #13c195;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: #48a2df;--bs-table-striped-bg: #3e9ddd;--bs-table-striped-color: #fff;--bs-table-active-bg: #48a2df;--bs-table-active-color: #fff;--bs-table-hover-bg: #43a0de;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: #f4a62a;--bs-table-striped-bg: #f4a11e;--bs-table-striped-color: #fff;--bs-table-active-bg: #f4a62a;--bs-table-active-color: #fff;--bs-table-hover-bg: #f4a324;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: #e95e50;--bs-table-striped-bg: #e85546;--bs-table-striped-color: #fff;--bs-table-active-bg: #e95e50;--bs-table-active-color: #fff;--bs-table-hover-bg: #e9594b;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #fff;--bs-table-bg: #6f6f6f;--bs-table-border-color: #7d7d7d;--bs-table-striped-bg: #767676;--bs-table-striped-color: #fff;--bs-table-active-bg: #7d7d7d;--bs-table-active-color: #fff;--bs-table-hover-bg: #7a7a7a;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #2d2d2d;--bs-table-border-color: #424242;--bs-table-striped-bg: #383838;--bs-table-striped-color: #fff;--bs-table-active-bg: #424242;--bs-table-active-color: #fff;--bs-table-hover-bg: #3d3d3d;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(255,255,255,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#2d2d2d;background-color:#fff;border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#595959;opacity:1}.form-control:disabled{background-color:#ebebeb;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#6f6f6f;background-color:#434343;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#363636}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#fff;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#2d2d2d;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #adb5bd;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#595959;background-color:#ebebeb}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #2d2d2d}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:none;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#9badbf;outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#375a7f;border-color:#375a7f}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#375a7f;border-color:#375a7f;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239badbf'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #222,0 0 0 .25rem rgba(55,90,127,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c3ced9}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#375a7f;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#c3ced9}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(255,255,255,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(255,255,255,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ebebeb}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#6f6f6f;text-align:center;white-space:nowrap;background-color:#434343;border:1px solid #adb5bd;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#00bc8c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#00bc8c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#00bc8c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#00bc8c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#00bc8c;box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#00bc8c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#00bc8c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(0,188,140,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#00bc8c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #fff;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2f4d6c;--bs-btn-hover-border-color: #2c4866;--bs-btn-focus-shadow-rgb: 85, 115, 146;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c4866;--bs-btn-active-border-color: #29445f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #375a7f;--bs-btn-disabled-border-color: #375a7f}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #393939;--bs-btn-hover-border-color: #363636;--bs-btn-focus-shadow-rgb: 95, 95, 95;--bs-btn-active-color: #fff;--bs-btn-active-bg: #363636;--bs-btn-active-border-color: #323232;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #434343;--bs-btn-disabled-border-color: #434343}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00a077;--bs-btn-hover-border-color: #009670;--bs-btn-focus-shadow-rgb: 38, 198, 157;--bs-btn-active-color: #fff;--bs-btn-active-bg: #009670;--bs-btn-active-border-color: #008d69;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #00bc8c;--bs-btn-disabled-border-color: #00bc8c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c81ba;--bs-btn-hover-border-color: #2a7aaf;--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a7aaf;--bs-btn-active-border-color: #2772a4;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #cf850f;--bs-btn-hover-border-color: #c27d0e;--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: #c27d0e;--bs-btn-active-border-color: #b6750e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #c44133;--bs-btn-hover-border-color: #b93d30;--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: #b93d30;--bs-btn-active-border-color: #ad392d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #fff;--bs-btn-bg: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5e5e5e;--bs-btn-hover-border-color: #595959;--bs-btn-focus-shadow-rgb: 133, 133, 133;--bs-btn-active-color: #fff;--bs-btn-active-bg: #595959;--bs-btn-active-border-color: #535353;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6f6f6f;--bs-btn-disabled-border-color: #6f6f6f}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #4d4d4d;--bs-btn-hover-border-color: #424242;--bs-btn-focus-shadow-rgb: 77, 77, 77;--bs-btn-active-color: #fff;--bs-btn-active-bg: #575757;--bs-btn-active-border-color: #424242;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2d2d2d;--bs-btn-disabled-border-color: #2d2d2d}.btn-outline-default{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #375a7f;--bs-btn-border-color: #375a7f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #375a7f;--bs-btn-hover-border-color: #375a7f;--bs-btn-focus-shadow-rgb: 55, 90, 127;--bs-btn-active-color: #fff;--bs-btn-active-bg: #375a7f;--bs-btn-active-border-color: #375a7f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #375a7f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #375a7f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #434343;--bs-btn-border-color: #434343;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #434343;--bs-btn-hover-border-color: #434343;--bs-btn-focus-shadow-rgb: 67, 67, 67;--bs-btn-active-color: #fff;--bs-btn-active-bg: #434343;--bs-btn-active-border-color: #434343;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #434343;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #434343;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #00bc8c;--bs-btn-border-color: #00bc8c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #00bc8c;--bs-btn-hover-border-color: #00bc8c;--bs-btn-focus-shadow-rgb: 0, 188, 140;--bs-btn-active-color: #fff;--bs-btn-active-bg: #00bc8c;--bs-btn-active-border-color: #00bc8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #00bc8c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #00bc8c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #6f6f6f;--bs-btn-border-color: #6f6f6f;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6f6f6f;--bs-btn-hover-border-color: #6f6f6f;--bs-btn-focus-shadow-rgb: 111, 111, 111;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6f6f6f;--bs-btn-active-border-color: #6f6f6f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6f6f6f;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6f6f6f;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #2d2d2d;--bs-btn-border-color: #2d2d2d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2d2d2d;--bs-btn-hover-border-color: #2d2d2d;--bs-btn-focus-shadow-rgb: 45, 45, 45;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2d2d2d;--bs-btn-active-border-color: #2d2d2d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2d2d2d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2d2d2d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #00bc8c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #009670;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #009670;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 38, 198, 157;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #fff;--bs-dropdown-bg: #222;--bs-dropdown-border-color: #434343;--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: #434343;--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #fff;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #375a7f;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: rgba(255, 255, 255, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: #434343;--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: #434343;--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #375a7f;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #00bc8c;--bs-nav-link-hover-color: #009670;--bs-nav-link-disabled-color: #6f6f6f;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(55,90,127,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #434343;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #434343 #434343 transparent;--bs-nav-tabs-link-active-color: #fff;--bs-nav-tabs-link-active-bg: #222;--bs-nav-tabs-link-active-border-color: #434343 #434343 transparent;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #375a7f}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #dee2e6;--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(222, 226, 230, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: #dee2e6;--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(222, 226, 230, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23dee2e6' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #2d2d2d;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #fff;--bs-accordion-bg: #222;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #fff;--bs-accordion-btn-bg: #222;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23162433'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #9badbf;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #162433;--bs-accordion-active-bg: #d7dee5}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23879cb2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: #434343;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(255, 255, 255, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(255, 255, 255, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #00bc8c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: #00efb2;--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: #009670;--bs-pagination-focus-bg: #ebebeb;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #00efb2;--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #fff;--bs-pagination-disabled-bg: #007053;--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #434343;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #375a7f;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #fff;--bs-list-group-bg: #2d2d2d;--bs-list-group-border-color: #434343;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(255, 255, 255, 0.75);--bs-list-group-action-hover-color: #fff;--bs-list-group-action-hover-bg: #434343;--bs-list-group-action-active-color: #fff;--bs-list-group-action-active-bg: #222;--bs-list-group-disabled-color: rgba(255, 255, 255, 0.75);--bs-list-group-disabled-bg: #2d2d2d;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #375a7f;--bs-list-group-active-border-color: #375a7f;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: #434343;--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(255, 255, 255, 0.75);--bs-toast-header-bg: #2d2d2d;--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #2d2d2d;--bs-modal-border-color: #434343;--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #434343;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #434343;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #222;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #2d2d2d;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #434343;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #fff;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #fff;--bs-offcanvas-bg: #222;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: #434343;--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#fff !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(44, 72, 102, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(44, 72, 102, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(54, 54, 54, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(54, 54, 54, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(0, 150, 112, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(0, 150, 112, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(89, 89, 89, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(89, 89, 89, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(36, 36, 36, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(36, 36, 36, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#fff}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #375a7f;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #00bc8c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #434343}.bg-default{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #375a7f}.bg-primary{--bslib-color-bg: #375a7f;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #434343}.bg-secondary{--bslib-color-bg: #434343;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #00bc8c}.bg-success{--bslib-color-bg: #00bc8c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #6f6f6f}.bg-light{--bslib-color-bg: #6f6f6f;--bslib-color-fg: #fff}.text-dark{--bslib-color-fg: #2d2d2d}.bg-dark{--bslib-color-bg: #2d2d2d;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4a3cad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4a3cad;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d5099;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4d5099;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7e4f84;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7e4f84;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d5464;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7d5464;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #866854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #866854;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #827453;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #827453;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #218184;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #218184;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2e8689;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2e8689;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #3673a4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #375a7f var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #3673a4;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #532ec4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #532ec4;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #9a28a9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9a28a9;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #9e4898;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #9e4898;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #3d55c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #3d55c9;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5246e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5246e9;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #594ca7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #594ca7;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9f40ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9f40ac;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #9f468c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #9f468c;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a4667b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #a4667b;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #4373ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #4373ac;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #5764cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #5764cb;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a14987;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a14987;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b840a1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b840a1;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #e8446c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #e8446c;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0585c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0585c;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec645b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec645b;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b708c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b708c;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a062ac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a062ac;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a15257;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a15257;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b33485;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b33485;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b74871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b74871;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #e7465c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #e7465c;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f0602c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f0602c;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ec6c2b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #ec6c2b;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #8b795c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #8b795c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #977e60;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #977e60;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #9f6a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #9f6a7c;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #ae703f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #ae703f;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f56444;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f56444;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f46a24;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #f46a24;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f98a13;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #f98a13;color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: #989744;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #989744;color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #ad8864;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #ad8864;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a8823e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #a8823e;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #bb646c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #bb646c;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #be7858;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #be7858;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ef7643;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ef7643;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ee7c23;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #ee7c23;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f79013;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #f79013;color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #92a943;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #92a943;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #9fae47;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9fae47;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #a79a62;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #a79a62;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #169587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #169587;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #2977b5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #2977b5;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #2c8ba1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #2c8ba1;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #5d8a8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #5d8a8c;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #5c8f6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #5c8f6c;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: #65a35c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #65a35c;color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #61af5b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #61af5b;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: #0dc190;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #0dc190;color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #15aeac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #00bc8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #15aeac;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #299d8d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #299d8d;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #709773;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #709773;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #74b762;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #74b762;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: #13c493;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #13c493;color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #28b5b2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) #28b5b2;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #357fb6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #375a7f var(--bg-gradient-end, 180%)) #357fb6;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4862e4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4862e4;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4c76d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4c76d1;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7c74bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7c74bb;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #7c7a9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) #7c7a9b;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #848e8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #848e8b;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #809a8b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) #809a8b;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #1fa6bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #00bc8c var(--bg-gradient-end, 180%)) #1fa6bb;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #2cacc0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #2cacc0;color:#fff}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #222);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}:root{--bslib-page-sidebar-title-bg: #375a7f;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#dee2e6}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fff}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#fefefe}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#fefefe;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#fefefe}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#fefefe}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(252,254,254,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#cbcbcb}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#fefefe}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(252,254,254,.8)}div.sidebar-item-container.disabled{color:rgba(254,254,254,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#fcfefe}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#6f6f6f}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #434343 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #434343}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#6f6f6f;border-bottom:1px solid #434343}.quarto-banner nav.quarto-secondary-nav{background-color:#375a7f;color:#dee2e6;border-top:1px solid #434343}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#009670}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#222}body.nav-fixed{padding-top:82px}body .nav-footer{border-top:1px solid #434343}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#8a8a8a}.nav-footer a{color:#8a8a8a}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#dee2e6;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#fefefe;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#222;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#222;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#dee2e6;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#dee2e6;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #adb5bd;border-radius:.25rem;color:#2d2d2d;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#2d2d2d;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#2d2d2d;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#2d2d2d;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#2d2d2d;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#2d2d2d;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #adb5bd 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#2f2f2f;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#375a7f}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#2b4663}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#2d2d2d}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#000}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#2d2d2d;color:#fff}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#2d2d2d;border-color:#adb5bd;color:#fff}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #adb5bd}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#dee2e6}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#fefefe}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(34,34,34,.65);width:90%;bottom:0;box-shadow:rgba(173,181,189,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#222;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#222;border-bottom:1px solid #adb5bd;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#fff;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(55,90,127,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(255,255,255,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#375a7f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#434343 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#00bc8c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:#3498db !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#f39c12 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:#e74c3c !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#6f6f6f !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#2d2d2d !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #4673a3;border-bottom:solid 1px #4673a3}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#436e9b}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#dee2e6}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#fff}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#fff}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px silver;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#222;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#222;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#fff}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#2d2d2d}.tableFloatingHeaderOriginal{background-color:#2d2d2d;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.listing-actions-group .form-select,.listing-actions-group .form-control{background-color:#222;color:#fff}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#fff;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid #6c757d 1px;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#00bc8c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#00bc8c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#00bc8c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#fff;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#00bc8c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#222;border:solid 1px #dee2e6;border-radius:.25rem;color:#fff;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#222}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#222}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#222;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#222}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#222;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! * * ansi colors from IPython notebook's * diff --git a/site_libs/bootstrap/bootstrap.min.css b/site_libs/bootstrap/bootstrap.min.css index 3ad34eb4..a3b6a95a 100644 --- a/site_libs/bootstrap/bootstrap.min.css +++ b/site_libs/bootstrap/bootstrap.min.css @@ -2,7 +2,7 @@ * Bootstrap v5.3.1 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#545555}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#545555;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#545555}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#545555}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(31,78,182,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#878888}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#545555}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(31,78,182,.8)}div.sidebar-item-container.disabled{color:rgba(84,85,85,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#1f4eb6}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#f8f9fa}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #dee2e6 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#f8f9fa;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}body .nav-footer{border-top:1px solid #dee2e6}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! + */@import"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;700&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2780e3;--bs-indigo: #6610f2;--bs-purple: #613d7c;--bs-pink: #e83e8c;--bs-red: #ff0039;--bs-orange: #f0ad4e;--bs-yellow: #ff7518;--bs-green: #3fb618;--bs-teal: #20c997;--bs-cyan: #9954bb;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #343a40;--bs-primary: #2780e3;--bs-secondary: #343a40;--bs-success: #3fb618;--bs-info: #9954bb;--bs-warning: #ff7518;--bs-danger: #ff0039;--bs-light: #f8f9fa;--bs-dark: #343a40;--bs-default-rgb: 52, 58, 64;--bs-primary-rgb: 39, 128, 227;--bs-secondary-rgb: 52, 58, 64;--bs-success-rgb: 63, 182, 24;--bs-info-rgb: 153, 84, 187;--bs-warning-rgb: 255, 117, 24;--bs-danger-rgb: 255, 0, 57;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 52, 58, 64;--bs-primary-text-emphasis: #10335b;--bs-secondary-text-emphasis: #15171a;--bs-success-text-emphasis: #19490a;--bs-info-text-emphasis: #3d224b;--bs-warning-text-emphasis: #662f0a;--bs-danger-text-emphasis: #660017;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #d4e6f9;--bs-secondary-bg-subtle: #d6d8d9;--bs-success-bg-subtle: #d9f0d1;--bs-info-bg-subtle: #ebddf1;--bs-warning-bg-subtle: #ffe3d1;--bs-danger-bg-subtle: #ffccd7;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #a9ccf4;--bs-secondary-border-subtle: #aeb0b3;--bs-success-border-subtle: #b2e2a3;--bs-info-border-subtle: #d6bbe4;--bs-warning-border-subtle: #ffc8a3;--bs-danger-border-subtle: #ff99b0;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #343a40;--bs-body-color-rgb: 52, 58, 64;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(52, 58, 64, 0.75);--bs-secondary-color-rgb: 52, 58, 64;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(52, 58, 64, 0.5);--bs-tertiary-color-rgb: 52, 58, 64;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #2761e3;--bs-link-color-rgb: 39, 97, 227;--bs-link-decoration: underline;--bs-link-hover-color: #1f4eb6;--bs-link-hover-color-rgb: 31, 78, 182;--bs-code-color: #7d12ba;--bs-highlight-bg: #ffe3d1;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(39, 128, 227, 0.25);--bs-form-valid-color: #3fb618;--bs-form-valid-border-color: #3fb618;--bs-form-invalid-color: #ff0039;--bs-form-invalid-border-color: #ff0039}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #7db3ee;--bs-secondary-text-emphasis: #85898c;--bs-success-text-emphasis: #8cd374;--bs-info-text-emphasis: #c298d6;--bs-warning-text-emphasis: #ffac74;--bs-danger-text-emphasis: #ff6688;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #081a2d;--bs-secondary-bg-subtle: #0a0c0d;--bs-success-bg-subtle: #0d2405;--bs-info-bg-subtle: #1f1125;--bs-warning-bg-subtle: #331705;--bs-danger-bg-subtle: #33000b;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #174d88;--bs-secondary-border-subtle: #1f2326;--bs-success-border-subtle: #266d0e;--bs-info-border-subtle: #5c3270;--bs-warning-border-subtle: #99460e;--bs-danger-border-subtle: #990022;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #7db3ee;--bs-link-hover-color: #97c2f1;--bs-link-color-rgb: 125, 179, 238;--bs-link-hover-color-rgb: 151, 194, 241;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #8cd374;--bs-form-valid-border-color: #8cd374;--bs-form-invalid-color: #ff6688;--bs-form-invalid-border-color: #ff6688}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6)}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#343a40}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(52,58,64,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(52,58,64,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #343a40;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #343a40;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #343a40;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #343a40;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #b2bac1}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #d4e6f9;--bs-table-border-color: #bfcfe0;--bs-table-striped-bg: #c9dbed;--bs-table-striped-color: #000;--bs-table-active-bg: #bfcfe0;--bs-table-active-color: #000;--bs-table-hover-bg: #c4d5e6;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #d6d8d9;--bs-table-border-color: #c1c2c3;--bs-table-striped-bg: #cbcdce;--bs-table-striped-color: #000;--bs-table-active-bg: #c1c2c3;--bs-table-active-color: #000;--bs-table-hover-bg: #c6c8c9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d9f0d1;--bs-table-border-color: #c3d8bc;--bs-table-striped-bg: #cee4c7;--bs-table-striped-color: #000;--bs-table-active-bg: #c3d8bc;--bs-table-active-color: #000;--bs-table-hover-bg: #c9dec1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #ebddf1;--bs-table-border-color: #d4c7d9;--bs-table-striped-bg: #dfd2e5;--bs-table-striped-color: #000;--bs-table-active-bg: #d4c7d9;--bs-table-active-color: #000;--bs-table-hover-bg: #d9ccdf;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #ffe3d1;--bs-table-border-color: #e6ccbc;--bs-table-striped-bg: #f2d8c7;--bs-table-striped-color: #000;--bs-table-active-bg: #e6ccbc;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd2c1;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #ffccd7;--bs-table-border-color: #e6b8c2;--bs-table-striped-bg: #f2c2cc;--bs-table-striped-color: #000;--bs-table-active-bg: #e6b8c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ecbdc7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #343a40;--bs-table-border-color: #484e53;--bs-table-striped-bg: #3e444a;--bs-table-striped-color: #fff;--bs-table-active-bg: #484e53;--bs-table-active-color: #fff;--bs-table-hover-bg: #43494e;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(52,58,64,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#343a40;background-color:#fff;border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(52,58,64,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#343a40;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#343a40;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important}.form-control-color::-webkit-color-swatch{border:0 !important}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #343a40}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#93c0f1;outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2780e3;border-color:#2780e3}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2780e3;border-color:#2780e3;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2393c0f1'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(39,128,227,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bed9f7}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2780e3;border:0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bed9f7}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(52,58,64,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(52,58,64,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#343a40;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1)}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#3fb618}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#3fb618}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3fb618;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3fb618}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233fb618' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3fb618;box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3fb618}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3fb618}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(63,182,24,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3fb618}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#ff0039}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#ff0039}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ff0039;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ff0039}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ff0039'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ff0039' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ff0039;box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ff0039}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ff0039}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,0,57,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ff0039}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #343a40;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #216dc1;--bs-btn-hover-border-color: #1f66b6;--bs-btn-focus-shadow-rgb: 71, 147, 231;--bs-btn-active-color: #fff;--bs-btn-active-bg: #1f66b6;--bs-btn-active-border-color: #1d60aa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2780e3;--bs-btn-disabled-border-color: #2780e3}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3136;--bs-btn-hover-border-color: #2a2e33;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2a2e33;--bs-btn-active-border-color: #272c30;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #369b14;--bs-btn-hover-border-color: #329213;--bs-btn-focus-shadow-rgb: 92, 193, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #329213;--bs-btn-active-border-color: #2f8912;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3fb618;--bs-btn-disabled-border-color: #3fb618}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #82479f;--bs-btn-hover-border-color: #7a4396;--bs-btn-focus-shadow-rgb: 168, 110, 197;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7a4396;--bs-btn-active-border-color: #733f8c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #9954bb;--bs-btn-disabled-border-color: #9954bb}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d96314;--bs-btn-hover-border-color: #cc5e13;--bs-btn-focus-shadow-rgb: 255, 138, 59;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc5e13;--bs-btn-active-border-color: #bf5812;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff7518;--bs-btn-disabled-border-color: #ff7518}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #d90030;--bs-btn-hover-border-color: #cc002e;--bs-btn-focus-shadow-rgb: 255, 38, 87;--bs-btn-active-color: #fff;--bs-btn-active-bg: #cc002e;--bs-btn-active-border-color: #bf002b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #ff0039;--bs-btn-disabled-border-color: #ff0039}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #52585d;--bs-btn-hover-border-color: #484e53;--bs-btn-focus-shadow-rgb: 82, 88, 93;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d6166;--bs-btn-active-border-color: #484e53;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #343a40;--bs-btn-disabled-border-color: #343a40}.btn-outline-default{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2780e3;--bs-btn-border-color: #2780e3;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2780e3;--bs-btn-hover-border-color: #2780e3;--bs-btn-focus-shadow-rgb: 39, 128, 227;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2780e3;--bs-btn-active-border-color: #2780e3;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2780e3;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2780e3;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #3fb618;--bs-btn-border-color: #3fb618;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3fb618;--bs-btn-hover-border-color: #3fb618;--bs-btn-focus-shadow-rgb: 63, 182, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3fb618;--bs-btn-active-border-color: #3fb618;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3fb618;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3fb618;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #9954bb;--bs-btn-border-color: #9954bb;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #9954bb;--bs-btn-hover-border-color: #9954bb;--bs-btn-focus-shadow-rgb: 153, 84, 187;--bs-btn-active-color: #fff;--bs-btn-active-bg: #9954bb;--bs-btn-active-border-color: #9954bb;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #9954bb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #9954bb;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ff7518;--bs-btn-border-color: #ff7518;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff7518;--bs-btn-hover-border-color: #ff7518;--bs-btn-focus-shadow-rgb: 255, 117, 24;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff7518;--bs-btn-active-border-color: #ff7518;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff7518;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff7518;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #ff0039;--bs-btn-border-color: #ff0039;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #ff0039;--bs-btn-hover-border-color: #ff0039;--bs-btn-focus-shadow-rgb: 255, 0, 57;--bs-btn-active-color: #fff;--bs-btn-active-bg: #ff0039;--bs-btn-active-border-color: #ff0039;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ff0039;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ff0039;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #343a40;--bs-btn-border-color: #343a40;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #343a40;--bs-btn-hover-border-color: #343a40;--bs-btn-focus-shadow-rgb: 52, 58, 64;--bs-btn-active-color: #fff;--bs-btn-active-bg: #343a40;--bs-btn-active-border-color: #343a40;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #343a40;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #343a40;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #2761e3;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #1f4eb6;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #1f4eb6;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 71, 121, 231;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #343a40;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #343a40;--bs-dropdown-link-hover-color: #343a40;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: rgba(52, 58, 64, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2780e3;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #2761e3;--bs-nav-link-hover-color: #1f4eb6;--bs-nav-link-disabled-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(39,128,227,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #dee2e6;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width))}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2780e3}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #545555;--bs-navbar-hover-color: rgba(31, 78, 182, 0.8);--bs-navbar-disabled-color: rgba(84, 85, 85, 0.75);--bs-navbar-active-color: #1f4eb6;--bs-navbar-brand-color: #545555;--bs-navbar-brand-hover-color: #1f4eb6;--bs-navbar-toggler-border-color: rgba(84, 85, 85, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23545555' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0}.card>.list-group:last-child{border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}}.accordion{--bs-accordion-color: #343a40;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #343a40;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23343a40'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2310335b'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #93c0f1;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #10335b;--bs-accordion-active-bg: #d4e6f9}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:not(:first-of-type){border-top:0}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%237db3ee'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(52, 58, 64, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(52, 58, 64, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #2761e3;--bs-pagination-bg: #fff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: #dee2e6;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #1f4eb6;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: #dee2e6;--bs-pagination-focus-color: #1f4eb6;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #2780e3;--bs-pagination-active-border-color: #2780e3;--bs-pagination-disabled-color: rgba(52, 58, 64, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: #dee2e6;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--bs-progress-height: 0.5rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2780e3;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #343a40;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(52, 58, 64, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #343a40;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(52, 58, 64, 0.75);--bs-list-group-disabled-bg: #fff;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2780e3;--bs-list-group-active-border-color: #2780e3;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(39, 128, 227, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(52, 58, 64, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color)}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #343a40;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #343a40;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(31, 102, 182, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(31, 102, 182, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(50, 146, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(50, 146, 19, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(122, 67, 150, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(122, 67, 150, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(204, 94, 19, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 94, 19, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(204, 0, 46, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(204, 0, 46, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(42, 46, 51, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 46, 51, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2780e3;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #613d7c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #613d7c;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #ff0039;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #f0ad4e;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #f0ad4e;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ff7518;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #3fb618;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #9954bb;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #343a40}.bg-default{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2780e3}.bg-primary{--bslib-color-bg: #2780e3;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #343a40}.bg-secondary{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #3fb618}.bg-success{--bslib-color-bg: #3fb618;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #9954bb}.bg-info{--bslib-color-bg: #9954bb;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #ff7518}.bg-warning{--bslib-color-bg: #ff7518;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #ff0039}.bg-danger{--bslib-color-bg: #ff0039;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #343a40}.bg-dark{--bslib-color-bg: #343a40;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4053e9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4053e9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3e65ba;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3e65ba;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: #7466c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #7466c0;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: #7d4d9f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #7d4d9f;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: #7792a7;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #7792a7;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #7d7c92;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #7d7c92;color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: #319692;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #319692;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: #249dc5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #249dc5;color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #556ed3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #2780e3 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #556ed3;color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4d3dec;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4d3dec;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: #6422c3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #6422c3;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: #9a22c9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #9a22c9;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: #a30aa8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a30aa8;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9d4fb0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9d4fb0;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a3389b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a3389b;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: #56529b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #56529b;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #7a2bdc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #7a2bdc;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: #4a58a5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #4a58a5;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #632bab;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #632bab;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: #973d82;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #973d82;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: #a02561;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #a02561;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: #9a6a6a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #9a6a6a;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #a05354;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #a05354;color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: #536d54;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #536d54;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: #477587;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #477587;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #774695;background:linear-gradient(var(--bg-gradient-deg, 140deg), #613d7c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #774695;color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: #9b58af;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #9b58af;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b42cb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b42cb5;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b23e86;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b23e86;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: #f1256b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f1256b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: #eb6a73;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #eb6a73;color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #f1545e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f1545e;color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: #a46e5e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a46e5e;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: #987690;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #987690;color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #c8479f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #c8479f;color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a9337d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a9337d;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c20683;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c20683;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c01854;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c01854;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f6195a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f6195a;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: #f94541;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f94541;color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #ff2f2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #ff2f2c;color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: #b2492c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b2492c;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6505f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6505f;color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d6226d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff0039 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d6226d;color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a09b8a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a09b8a;color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #b96e90;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #b96e90;color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: #b78060;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #b78060;color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: #ed8167;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #ed8167;color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: #f66846;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #f66846;color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #f69738;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #f69738;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a9b138;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #a9b138;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #9db86b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #9db86b;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #cd897a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #f0ad4e var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #cd897a;color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: #a97969;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #a97969;color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #c24d6f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c24d6f;color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: #c05f40;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #c05f40;color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: #f65f46;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #f65f46;color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: #ff4625;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #ff4625;color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #f98b2e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #f98b2e;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: #b28f18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #b28f18;color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: #a6974b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6974b;color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #d66859;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ff7518 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #d66859;color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: #35a069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #35a069;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #4f746f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #4f746f;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: #4d8640;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #4d8640;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: #838646;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #838646;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: #8c6d25;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #8c6d25;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #86b22e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #86b22e;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #8c9c18;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #8c9c18;color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #33be4b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #33be4b;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #638f59;background:linear-gradient(var(--bg-gradient-deg, 140deg), #3fb618 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #638f59;color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: #23acb5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #23acb5;color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: #3a918c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #3a918c;color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: #709193;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #709193;color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: #797971;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #797971;color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #73be7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #73be7a;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #79a764;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #79a764;color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #2cc164;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #2cc164;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: #509aa5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #9954bb var(--bg-gradient-end, 180%)) #509aa5;color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: #6b66cb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #2780e3 var(--bg-gradient-end, 180%)) #6b66cb;color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: #8539d1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #8539d1;color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: #834ba2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #613d7c var(--bg-gradient-end, 180%)) #834ba2;color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: #b94ba8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) #b94ba8;color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: #c23287;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff0039 var(--bg-gradient-end, 180%)) #c23287;color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: #bc788f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #f0ad4e var(--bg-gradient-end, 180%)) #bc788f;color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: #c2617a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #ff7518 var(--bg-gradient-end, 180%)) #c2617a;color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: #757b7a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #3fb618 var(--bg-gradient-end, 180%)) #757b7a;color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: #6983ad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #9954bb var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #6983ad;color:#fff}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:400;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}:root{--bslib-page-sidebar-title-bg: #f8f9fa;--bslib-page-sidebar-title-color: #000}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:#545555}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#1f4eb6}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:#545555}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:#545555;padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:#545555}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:#545555}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(31,78,182,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:#878888}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:#545555}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(31,78,182,.8)}div.sidebar-item-container.disabled{color:rgba(84,85,85,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:#1f4eb6}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#f8f9fa}.sidebar.sidebar-navigation:not(.rollup){border-right:1px solid #dee2e6 !important}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#f8f9fa;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#f8f9fa;color:#545555;border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(255,255,255,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:rgba(102,102,102,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:#1f4eb6}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:64px}body .nav-footer{border-top:1px solid #dee2e6}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:#757575}.nav-footer a{color:#757575}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:#545555;border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:#545555;opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:#545555;opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#343a40;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#343a40;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#343a40;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#343a40;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#343a40;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#343a40;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:#f2f2f2;padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2780e3}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:#4b95e8}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#343a40}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:#e5effc}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#343a40}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#343a40}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:#545555}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:rgba(255,255,255,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#343a40;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(39,128,227,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(52,58,64,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:#5397e9 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#343a40 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:#3aa716 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:#fa6400 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7019607843) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#f8f9fa !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#343a40 !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px #dae0e5;border-bottom:solid 1px #dae0e5}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:#e0e5e9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:#545555}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#343a40}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#343a40}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px #bcbfc0;padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#343a40}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#343a40;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:"Source Sans Pro",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#2761e3}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#2761e3}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#2761e3}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#2761e3}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:#626d78;text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#2761e3}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#343a40;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#343a40}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre-wrap}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}div.ansi-escaped-output{font-family:monospace;display:block}/*! * * ansi colors from IPython notebook's * diff --git a/sitemap.xml b/sitemap.xml index 4bd73357..fbb6c2ba 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,475 +1,475 @@ - https://podaac.github.io/tutorials/index.html - 2024-07-22T21:36:50.862Z + https://podaac.github.io/tutorials/quarto_text/SMAP.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/sentinel-6/S6_Cloud_Notebook.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/quarto_text/Questions.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/quarto_text/DataSubscriberDownloader.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/docs/documentation.html - 2024-07-22T21:36:51.002Z + https://podaac.github.io/tutorials/quarto_text/CloudvsLocalWorkflows.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html - 2024-07-22T21:36:51.010Z + https://podaac.github.io/tutorials/quarto_text/DatasetSpecificExamples.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/harmony subsetting/Harmony L2 Subsetter.html - 2024-07-22T21:36:51.378Z + https://podaac.github.io/tutorials/quarto_text/Experimental.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/harmony_concatenation/Harmony_Concatenation.html - 2024-07-22T21:36:51.382Z + https://podaac.github.io/tutorials/quarto_text/SMODE.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/MODIS_L2P_SST_DataCube.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/quarto_text/Advanced.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/podaac_cmr_tutorial.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/quarto_text/TechGuides.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/DataStories/SWOTHR_Science_Application.html - 2024-07-22T21:36:50.954Z + https://podaac.github.io/tutorials/quarto_text/HowTo.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/HUC Feature Translation Service Examples-updated-20210804.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/quarto_text/cheatsheet.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html - 2024-07-22T21:36:51.446Z + https://podaac.github.io/tutorials/quarto_text/GIS.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html - 2024-07-22T21:36:51.394Z + https://podaac.github.io/tutorials/notebooks/l2-regridding/reprojection notebook.html + 2024-07-24T16:06:27.113Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html - 2024-07-22T21:36:51.486Z + https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/sst-global-mean-exploratory.html + 2024-07-24T16:06:26.725Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/Cloud_DirectDownload_AmazonRiver_Estuary_Exploration.html - 2024-07-22T21:36:51.474Z + https://podaac.github.io/tutorials/notebooks/opendap/MUR-OPeNDAP.html + 2024-07-24T16:06:27.209Z - https://podaac.github.io/tutorials/notebooks/GIS/MUR_SSTA_QGIS.html - 2024-07-22T21:36:50.958Z + https://podaac.github.io/tutorials/notebooks/Cloud L2SS subset and plot - JH.html + 2024-07-24T16:06:26.597Z - https://podaac.github.io/tutorials/notebooks/GIS/SWOT_GISshapefiles.html - 2024-07-22T21:36:50.990Z + https://podaac.github.io/tutorials/notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html + 2024-07-24T16:06:27.109Z - https://podaac.github.io/tutorials/notebooks/GIS/Subscriber_nc_to_tif_SWOT.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/Harmony API.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/notebooks/DataStories/SWOTHR_Science_Application.html + 2024-07-24T16:06:26.673Z - https://podaac.github.io/tutorials/notebooks/batch_download_podaac_data.html - 2024-07-22T21:36:51.010Z + https://podaac.github.io/tutorials/notebooks/harmony subsetting/Harmony L2 Subsetter.html + 2024-07-24T16:06:27.101Z - https://podaac.github.io/tutorials/notebooks/PODAAC_CMR_Shapefile_Search_MODIS_UAT.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/notebooks/Tutorials_TEMPLATE.html + 2024-07-24T16:06:26.721Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_Raster_Notebook_cloud.html - 2024-07-22T21:36:51.290Z + https://podaac.github.io/tutorials/notebooks/GIS/SWOTshp_CSVconversion.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html - 2024-07-22T21:36:51.162Z + https://podaac.github.io/tutorials/notebooks/GIS/SWOT_datetime_GIS.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOTHR_localmachine.html - 2024-07-22T21:36:51.126Z + https://podaac.github.io/tutorials/notebooks/GIS/GDAL_NetCDF_GeoTIFF.html + 2024-07-24T16:06:26.677Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOTHR_s3Access.html - 2024-07-22T21:36:51.158Z + https://podaac.github.io/tutorials/notebooks/Harmony API.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/datasets/enso_MUR_tutorial_final.html - 2024-07-22T21:36:51.354Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html + 2024-07-24T16:06:27.117Z - https://podaac.github.io/tutorials/notebooks/datasets/smap_imerg_tutorial.html - 2024-07-22T21:36:51.378Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/Cloud_DirectDownload_AmazonRiver_Estuary_Exploration.html + 2024-07-24T16:06:27.197Z - https://podaac.github.io/tutorials/notebooks/datasets/Localmachine_SWOT_Oceanography.html - 2024-07-22T21:36:51.046Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html + 2024-07-24T16:06:27.185Z - https://podaac.github.io/tutorials/notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html - 2024-07-22T21:36:51.014Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html + 2024-07-24T16:06:27.169Z - https://podaac.github.io/tutorials/notebooks/datasets/OPERA_GIS_Notebook.html - 2024-07-22T21:36:51.102Z + https://podaac.github.io/tutorials/notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html + 2024-07-24T16:06:26.717Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_quality_flag_demo.html - 2024-07-22T21:36:51.342Z + https://podaac.github.io/tutorials/notebooks/podaac_cmr_s3_links.html + 2024-07-24T16:06:27.209Z - https://podaac.github.io/tutorials/notebooks/SWOT-EA-2021/Colocate_satellite_insitu_ocean.html - 2024-07-22T21:36:51.002Z + https://podaac.github.io/tutorials/notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html + 2024-07-24T16:06:26.765Z - https://podaac.github.io/tutorials/notebooks/Advanced_cloud/dask_delayed_01.html - 2024-07-22T21:36:50.882Z + https://podaac.github.io/tutorials/notebooks/datasets/Localmachine_SWOT_Oceanography.html + 2024-07-24T16:06:26.765Z - https://podaac.github.io/tutorials/notebooks/Advanced_cloud/basic_dask.html - 2024-07-22T21:36:50.862Z + https://podaac.github.io/tutorials/notebooks/datasets/OISSS_L4_multimission_monthly_v1.html + 2024-07-24T16:06:26.805Z - https://podaac.github.io/tutorials/notebooks/Advanced_cloud/coiled_cluster_01.html - 2024-07-22T21:36:50.866Z + https://podaac.github.io/tutorials/notebooks/datasets/OPERA_GIS_Cloud.html + 2024-07-24T16:06:26.813Z - https://podaac.github.io/tutorials/notebooks/SearchDownload_SWOTviaCMR.html - 2024-07-22T21:36:51.002Z + https://podaac.github.io/tutorials/notebooks/datasets/DirectCloud_Access_SWOT_Oceanography.html + 2024-07-24T16:06:26.733Z - https://podaac.github.io/tutorials/quarto_text/Workshops.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/OPERA_GIS_Notebook.html + 2024-07-24T16:06:26.821Z - https://podaac.github.io/tutorials/quarto_text/GHRSST.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/MUR_SST_Washington_Comparison.html + 2024-07-24T16:06:26.801Z - https://podaac.github.io/tutorials/quarto_text/SMODE.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOTHR_s3Access.html + 2024-07-24T16:06:26.877Z - https://podaac.github.io/tutorials/quarto_text/Contribute.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE.html + 2024-07-24T16:06:26.881Z - https://podaac.github.io/tutorials/quarto_text/Advanced.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_Raster_Notebook_local.html + 2024-07-24T16:06:27.065Z - https://podaac.github.io/tutorials/quarto_text/Dask_Coiled.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Pre-SWOT_Numerical_Simulation_Demo.html + 2024-07-24T16:06:26.717Z - https://podaac.github.io/tutorials/quarto_text/Questions.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/sentinel-6/Access_Sentinel6_By_CyclePass.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/quarto_text/Webinars.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Advanced_cloud/coiled_cluster_01.html + 2024-07-24T16:06:26.581Z - https://podaac.github.io/tutorials/quarto_text/Experimental.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Advanced_cloud/dask_cluster_01.html + 2024-07-24T16:06:26.593Z - https://podaac.github.io/tutorials/quarto_text/DatasetSpecificExamples.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Advanced_cloud/coiled_function_01.html + 2024-07-24T16:06:26.589Z - https://podaac.github.io/tutorials/quarto_text/Sentinel6MF.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/MODIS_L2P_SST_DataCube.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/quarto_text/CloudOptimizedExamples.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/index.html + 2024-07-24T16:06:26.577Z - https://podaac.github.io/tutorials/external/Introduction_to_xarray.html - 2024-07-22T21:37:28.646Z + https://podaac.github.io/tutorials/external/earthdata_search.html + 2024-07-24T16:07:08.557Z https://podaac.github.io/tutorials/external/find_data_programmatically.html - 2024-07-22T21:37:31.646Z + 2024-07-24T16:07:08.701Z - https://podaac.github.io/tutorials/external/cof-zarr-reformat.html - 2024-07-22T21:37:27.146Z + https://podaac.github.io/tutorials/external/access-cloud-python.html + 2024-07-24T16:07:08.077Z - https://podaac.github.io/tutorials/external/SWOT_SSH_dashboard.html - 2024-07-22T21:37:35.466Z + https://podaac.github.io/tutorials/external/zarr_access.html + 2024-07-24T16:07:04.277Z - https://podaac.github.io/tutorials/external/read_data.html - 2024-07-22T21:37:31.762Z + https://podaac.github.io/tutorials/external/Direct_S3_Access_NetCDF.html + 2024-07-24T16:06:26.269Z - https://podaac.github.io/tutorials/external/earthdata_search.html - 2024-07-22T21:37:31.502Z + https://podaac.github.io/tutorials/external/NASA_Earthdata_Authentication.html + 2024-07-24T16:06:26.309Z https://podaac.github.io/tutorials/external/ECCO_cloud_direct_access_s3.html - 2024-07-22T21:37:30.638Z + 2024-07-24T16:07:07.605Z - https://podaac.github.io/tutorials/external/Downloader.html - 2024-07-22T21:37:31.810Z + https://podaac.github.io/tutorials/external/access-local-opendap.html + 2024-07-24T16:07:08.405Z - https://podaac.github.io/tutorials/external/Direct_S3_Access_NetCDF.html - 2024-07-22T21:36:50.550Z + https://podaac.github.io/tutorials/external/ECCO_download_data.html + 2024-07-24T16:07:07.881Z - https://podaac.github.io/tutorials/external/NASA_Earthdata_Authentication.html - 2024-07-22T21:36:50.594Z + https://podaac.github.io/tutorials/external/zarr-eosdis-store.html + 2024-07-24T16:07:03.569Z - https://podaac.github.io/tutorials/external/access-local-python.html - 2024-07-22T21:37:31.210Z + https://podaac.github.io/tutorials/external/insitu_dataviz_demo.html + 2024-07-24T16:07:07.269Z - https://podaac.github.io/tutorials/external/July_2022_Earthdata_Webinar.html - 2024-07-22T21:37:29.022Z + https://podaac.github.io/tutorials/external/read_data.html + 2024-07-24T16:07:08.933Z - https://podaac.github.io/tutorials/external/DownloadDopplerScattData.html - 2024-07-22T21:37:29.082Z + https://podaac.github.io/tutorials/external/Introduction_to_xarray.html + 2024-07-24T16:07:05.357Z - https://podaac.github.io/tutorials/external/access-local-opendap.html - 2024-07-22T21:37:31.342Z + https://podaac.github.io/tutorials/external/VisualizeDopplerScattData.html + 2024-07-24T16:07:06.937Z - https://podaac.github.io/tutorials/external/ECCO_download_data.html - 2024-07-22T21:37:30.886Z + https://podaac.github.io/tutorials/external/cof-zarr-reformat.html + 2024-07-24T16:07:03.909Z - https://podaac.github.io/tutorials/external/VisualizeDopplerScattData.html - 2024-07-22T21:37:29.942Z + https://podaac.github.io/tutorials/external/SWOT_SSH_dashboard.html + 2024-07-24T16:07:14.237Z - https://podaac.github.io/tutorials/external/zarr_access.html - 2024-07-22T21:37:27.546Z + https://podaac.github.io/tutorials/external/SWOT_to_kerchunk.html + 2024-07-24T16:07:09.637Z - https://podaac.github.io/tutorials/external/SWOT_to_kerchunk.html - 2024-07-22T21:37:32.170Z + https://podaac.github.io/tutorials/external/July_2022_Earthdata_Webinar.html + 2024-07-24T16:07:05.657Z - https://podaac.github.io/tutorials/external/Subscriber.html - 2024-07-22T21:37:31.858Z + https://podaac.github.io/tutorials/external/Downloader.html + 2024-07-24T16:07:09.109Z - https://podaac.github.io/tutorials/external/insitu_dataviz_demo.html - 2024-07-22T21:37:30.350Z + https://podaac.github.io/tutorials/external/Subscriber.html + 2024-07-24T16:07:09.269Z - https://podaac.github.io/tutorials/external/access-cloud-python.html - 2024-07-22T21:37:31.078Z + https://podaac.github.io/tutorials/external/access-local-python.html + 2024-07-24T16:07:08.257Z - https://podaac.github.io/tutorials/external/zarr-eosdis-store.html - 2024-07-22T21:37:26.814Z + https://podaac.github.io/tutorials/external/DownloadDopplerScattData.html + 2024-07-24T16:07:05.865Z - https://podaac.github.io/tutorials/quarto_text/TechGuides.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/mcc_api/metadata_compliance_checker_API.html + 2024-07-24T16:06:26.577Z - https://podaac.github.io/tutorials/quarto_text/GIS.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/SWORD_River_Demo.html + 2024-07-24T16:06:26.717Z - https://podaac.github.io/tutorials/quarto_text/Tutorials.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/HUC Feature Translation Service Examples-updated-20210804.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/quarto_text/CloudvsLocalWorkflows.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Advanced_cloud/dask_delayed_01.html + 2024-07-24T16:06:26.597Z - https://podaac.github.io/tutorials/quarto_text/SMAP.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/Advanced_cloud/basic_dask.html + 2024-07-24T16:06:26.577Z - https://podaac.github.io/tutorials/quarto_text/HowTo.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/sentinel-6/S6_Cloud_Notebook.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/quarto_text/cheatsheet.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/sentinel-6/Access_Sentinel6_NRT.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/quarto_text/OPERA.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/smap_imerg_tutorial.html + 2024-07-24T16:06:27.101Z - https://podaac.github.io/tutorials/quarto_text/ScienceDataStories.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html + 2024-07-24T16:06:26.913Z - https://podaac.github.io/tutorials/quarto_text/DataSubscriberDownloader.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_Raster_Notebook_cloud.html + 2024-07-24T16:06:27.013Z - https://podaac.github.io/tutorials/quarto_text/SWOT.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html + 2024-07-24T16:06:26.885Z - https://podaac.github.io/tutorials/quarto_text/ECCO.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html + 2024-07-24T16:06:26.881Z - https://podaac.github.io/tutorials/notebooks/s3/S3-Access.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/notebooks/datasets/enso_MUR_tutorial_final.html + 2024-07-24T16:06:27.077Z - https://podaac.github.io/tutorials/notebooks/Cloud L2SS subset and plot - JH.html - 2024-07-22T21:36:50.882Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges_plot_all.html + 2024-07-24T16:06:26.881Z - https://podaac.github.io/tutorials/notebooks/Advanced_cloud/coiled_function_01.html - 2024-07-22T21:36:50.874Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOTHR_localmachine.html + 2024-07-24T16:06:26.845Z - https://podaac.github.io/tutorials/notebooks/Advanced_cloud/dask_cluster_01.html - 2024-07-22T21:36:50.874Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_PIXC_Area_localmachine.html + 2024-07-24T16:06:26.889Z - https://podaac.github.io/tutorials/notebooks/l2-regridding/reprojection notebook.html - 2024-07-22T21:36:51.390Z + https://podaac.github.io/tutorials/notebooks/datasets/SWOT_quality_flag_demo.html + 2024-07-24T16:06:27.065Z - https://podaac.github.io/tutorials/notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html - 2024-07-22T21:36:51.002Z + https://podaac.github.io/tutorials/notebooks/SearchDownload_SWOTviaCMR.html + 2024-07-24T16:06:26.721Z - https://podaac.github.io/tutorials/notebooks/datasets/MUR_SST_Washington_Comparison.html - 2024-07-22T21:36:51.082Z + https://podaac.github.io/tutorials/notebooks/SWOT-EA-2021/Estuary_explore_inCloud_zarr.html + 2024-07-24T16:06:26.717Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges_plot_all.html - 2024-07-22T21:36:51.162Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/arctic_2019.html + 2024-07-24T16:06:27.117Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_PIXC_Area_localmachine.html - 2024-07-22T21:36:51.170Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html + 2024-07-24T16:06:27.201Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_visualize.html - 2024-07-22T21:36:51.166Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/S6_OPeNDAP_Access_Gridding.html + 2024-07-24T16:06:27.209Z - https://podaac.github.io/tutorials/notebooks/datasets/Hydrocron_SWOT_timeseries_examples.html - 2024-07-22T21:36:51.046Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Cloud.html + 2024-07-24T16:06:27.117Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_L4_DAWG_SOS_DISCHARGE_gauges.html - 2024-07-22T21:36:51.162Z + https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/River_Heights_in_the_Cloud.html + 2024-07-24T16:06:27.169Z - https://podaac.github.io/tutorials/notebooks/datasets/OPERA_GIS_Cloud.html - 2024-07-22T21:36:51.094Z + https://podaac.github.io/tutorials/notebooks/GIS/SWOT_GISshapefiles.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_PIXC_PhaseUnwrap_localmachine.html - 2024-07-22T21:36:51.194Z + https://podaac.github.io/tutorials/notebooks/GIS/Subscriber_nc_to_tif_SWOT.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/datasets/SWOT_Raster_Notebook_local.html - 2024-07-22T21:36:51.342Z + https://podaac.github.io/tutorials/notebooks/GIS/MUR_SSTA_QGIS.html + 2024-07-24T16:06:26.677Z - https://podaac.github.io/tutorials/notebooks/datasets/OISSS_L4_multimission_monthly_v1.html - 2024-07-22T21:36:51.086Z + https://podaac.github.io/tutorials/notebooks/batch_download_podaac_data.html + 2024-07-24T16:06:26.729Z - https://podaac.github.io/tutorials/notebooks/SWORD_River_Demo.html - 2024-07-22T21:36:50.998Z + https://podaac.github.io/tutorials/notebooks/harmony subsetting/shapefile_subset.html + 2024-07-24T16:06:27.101Z - https://podaac.github.io/tutorials/notebooks/PODAAC_Data_Subscriber.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/notebooks/s3/S3-Access.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/GIS/GDAL_NetCDF_GeoTIFF.html - 2024-07-22T21:36:50.958Z + https://podaac.github.io/tutorials/notebooks/DataStories/eof_example_ersst.html + 2024-07-24T16:06:26.677Z - https://podaac.github.io/tutorials/notebooks/GIS/SWOTshp_CSVconversion.html - 2024-07-22T21:36:50.994Z + https://podaac.github.io/tutorials/notebooks/harmony_concatenation/Harmony_Concatenation.html + 2024-07-24T16:06:27.105Z - https://podaac.github.io/tutorials/notebooks/GIS/SWOT_datetime_GIS.html - 2024-07-22T21:36:50.990Z + https://podaac.github.io/tutorials/notebooks/podaac_cmr_tutorial.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/ECCO_ssh_sst_corr.html - 2024-07-22T21:36:51.478Z + https://podaac.github.io/tutorials/notebooks/PODAAC_Data_Subscriber.html + 2024-07-24T16:06:26.709Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/workshop_osm_2022/CloudAWS_AmazonRiver_Estuary_Exploration.html - 2024-07-22T21:36:51.462Z + https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/podaac-lambda-invoke-sst-global-mean.html + 2024-07-24T16:06:26.725Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_workshop_sept2022/SWOTHR_s3Access.html - 2024-07-22T21:36:51.446Z + https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/docs/documentation.html + 2024-07-24T16:06:26.721Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/swot_ea_hackweek_2022/HLS-WaterDetection-Local.html - 2024-07-22T21:36:51.394Z + https://podaac.github.io/tutorials/quarto_text/Workshops.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/meetings_workshops/arctic_2019.html - 2024-07-22T21:36:51.394Z + https://podaac.github.io/tutorials/quarto_text/OPERA.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/DataStories/eof_example_ersst.html - 2024-07-22T21:36:50.958Z + https://podaac.github.io/tutorials/quarto_text/Sentinel6MF.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/Tutorials_TEMPLATE.html - 2024-07-22T21:36:51.002Z + https://podaac.github.io/tutorials/quarto_text/GHRSST.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/opendap/MUR-OPeNDAP.html - 2024-07-22T21:36:51.486Z + https://podaac.github.io/tutorials/quarto_text/CloudOptimizedExamples.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/harmony_concatenation/Harmony_Subsetting_Concatenation.html - 2024-07-22T21:36:51.386Z + https://podaac.github.io/tutorials/quarto_text/ECCO.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/podaac_cmr_s3_links.html - 2024-07-22T21:36:51.486Z + https://podaac.github.io/tutorials/quarto_text/Dask_Coiled.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/harmony subsetting/shapefile_subset.html - 2024-07-22T21:36:51.378Z + https://podaac.github.io/tutorials/quarto_text/Tutorials.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/aws_lambda_sst/sst-global-mean-exploratory.html - 2024-07-22T21:36:51.010Z + https://podaac.github.io/tutorials/quarto_text/ScienceDataStories.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/Pre-SWOT_Numerical_Simulation_Demo.html - 2024-07-22T21:36:50.998Z + https://podaac.github.io/tutorials/quarto_text/Contribute.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/notebooks/sentinel-6/Access_Sentinel6_NRT.html - 2024-07-22T21:36:51.490Z + https://podaac.github.io/tutorials/quarto_text/Webinars.html + 2024-07-24T16:06:27.213Z - https://podaac.github.io/tutorials/mcc_api/metadata_compliance_checker_API.html - 2024-07-22T21:36:50.862Z + https://podaac.github.io/tutorials/quarto_text/SWOT.html + 2024-07-24T16:06:27.213Z