{ "cells": [ { "cell_type": "markdown", "id": "starting-spokesman", "metadata": {}, "source": [ "# Building an Intake-esm catalog from CESM2 History Files\n", "\n", "As mentioned in a couple of ESDS posts ([intake-esm and Dask](https://ncar.github.io/esds/posts/intake_esm_dask/), [debugging intake-esm](https://ncar.github.io/esds/posts/intake_cmip6_debug/)), [intake-esm](https://intake-esm.readthedocs.io/en/latest/) can be a helpful tool to work with when dealing with model data, especially CESM. One of the requirements for using intake-esm is having a catalog which is comprised of two pieces:\n", "* A table of the relevant metadata (ex. file path, variable, stream, etc.)\n", "* A json describing the dataset, including how to aggregate the variables\n", "\n", "Typically, these pieces are constructed \"manually\" using information within the file path, on a very ad-hoc basis. Also, these catalogs are typically only created for \"larger\", community datasets, not neccessarily used within smaller model runs/daily workflows. A new package (currently a prototype), called [ecgtools](https://ecgtools.readthedocs.io/en/latest/) works to solve the issues of generating these intake-esm catalogs. Ecgtools stands for Earth System Model (ESM) Catalog Generation tools. The current catalog generation tools supported are:\n", "* CMIP6 models\n", "* CESM \"history\" files\n", "* CESM \"timeseries\" files\n", "\n", "This package has not officially been release yet on [pypi](https://pypi.org/) or [conda-forge](https://conda-forge.org/), but this release will likely happen soon. This post will give an overview of using [ecgtools](https://ecgtools.readthedocs.io/en/latest/) for parsing CESM history file model output, and reading in the data using \n", "[intake-esm](https://intake-esm.readthedocs.io/en/latest/). In this example, we use model output using the default component-set (compset) detailed in the [CESM Quickstart Guide](https://escomp.github.io/CESM/versions/cesm2.1/html/).\n", "\n", "## What's a \"history\" file?\n", "A history file is the default output from CESM, where each file is a single time \"slice\" with every variable from the component of interest. These types of files can be difficult to work with, since often times one is interested in a time series of a single variable. Building a catalog can be helpful in accessing your data, querying for certain variables, and potentially creating timeseries files later down the road.\n", "\n", "Let's get started!\n", "\n", "## Downloading the beta version of ecgtools\n", "In order to access this in its current state, you will need to clone the repository from github. On the machine with the data you are planning on creating a catalog for, run the following:\n", "\n", "```\n", "git clone https://github.com/NCAR/ecgtools.git\n", "```\n", "\n", "This will create a clone of the repository on your machine. After you clone the respository, run\n", "\n", "```\n", "pip install -e ecgtools\n", "```\n", "\n", "This will install the package into the python environment you currently activated (for more on dealing with conda environments, check out the [faq page](https://ncar.github.io/esds/faq/#conda-environments)\n", "\n", "You will also want to install intake-esm, which you can install using `conda-forge`\n", "\n", "```\n", "conda install -c conda-forge intake-esm\n", "```\n", "\n", "## Imports\n", "The only parts of ecgtools we need are the `Builder` object and the `parse_cesm_history` parser from the CESM parsers! We import `glob` to take a look at the files we are parsing." ] }, { "cell_type": "code", "execution_count": 1, "id": "nominated-battle", "metadata": {}, "outputs": [], "source": [ "import glob\n", "\n", "from ecgtools import Builder\n", "from ecgtools.parsers.cesm import parse_cesm_history" ] }, { "cell_type": "markdown", "id": "czech-stylus", "metadata": {}, "source": [ "### Understanding the Directory Structure\n", "\n", "The first step to setting up the `Builder` object is determining where your files are stored. As mentioned previously, we have a sample dataset of CESM2 model output, which is stored in `/glade/work/mgrover/cesm_test_data/`\n", "\n", "Taking a look at that directory, we see that there is a single case `b.e20.B1850.f19_g17.test`" ] }, { "cell_type": "code", "execution_count": 2, "id": "south-nancy", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "glob.glob('/glade/work/mgrover/cesm_test_data/*')" ] }, { "cell_type": "markdown", "id": "literary-scholarship", "metadata": {}, "source": [ "Once we go into that directory, we see all the different components, including the atmosphere (atm), ocean (ocn), and land (lnd)!" ] }, { "cell_type": "code", "execution_count": 3, "id": "equipped-recycling", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/logs',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/cpl',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ocn',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/lnd',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/esp',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/glc',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/rof',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/rest',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/wav',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ice']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "glob.glob('/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/*')" ] }, { "cell_type": "markdown", "id": "relevant-conflict", "metadata": {}, "source": [ "If we go one step further, we notice that within each component, is a `hist` directory which contains the model output" ] }, { "cell_type": "code", "execution_count": 4, "id": "velvet-synthesis", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm/hist/b.e20.B1850.f19_g17.test.cam.h0.0002-08.nc',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm/hist/b.e20.B1850.f19_g17.test.cam.h0.0001-09.nc',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm/hist/b.e20.B1850.f19_g17.test.cam.h0.0002-07.nc']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "glob.glob('/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm/*/*.nc')[0:3]" ] }, { "cell_type": "markdown", "id": "viral-stroke", "metadata": {}, "source": [ "If we take a look at the `ocn` component though, we notice that there are a few timeseries files in there..." ] }, { "cell_type": "code", "execution_count": 5, "id": "medium-bishop", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ocn/tseries/b.e20.B1850.f19_g17.test.pop.h.pCO2SURF.000101-001012.nc',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ocn/tseries/b.e20.B1850.f19_g17.test.pop.h.SiO3_RIV_FLUX.000101-001012.nc',\n", " '/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ocn/tseries/b.e20.B1850.f19_g17.test.pop.h.graze_sp_zootot.000101-001012.nc']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "glob.glob('/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/ocn/*/*.nc')[0:3]" ] }, { "cell_type": "markdown", "id": "sunset-animation", "metadata": {}, "source": [ "When we setup our catalog builder, we will need to specify not including the timeseries (tseries) and restart (rest) directories!\n", "\n", "Now that we understand the directory structure, let's make the catalog." ] }, { "cell_type": "markdown", "id": "growing-anthony", "metadata": {}, "source": [ "## Build the catalog!\n", "\n", "Let's start by inspecting the builder object" ] }, { "cell_type": "code", "execution_count": 6, "id": "promising-installation", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mInit signature:\u001b[0m\n", "\u001b[0mBuilder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mroot_path\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpydantic\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDirectoryPath\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mextension\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'.nc'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mdepth\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mexclude_patterns\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mnjobs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m \n", "Generates a catalog from a list of files.\n", "\n", "Parameters\n", "----------\n", "root_path : str\n", " Path of root directory.\n", "extension : str, optional\n", " File extension, by default None. If None, the builder will look for files with\n", " \"*.nc\" extension.\n", "depth : int, optional\n", " Recursion depth. Recursively crawl `root_path` up to a specified depth, by default 0\n", "exclude_patterns : list, optional\n", " Directory, file patterns to exclude during catalog generation.\n", " These could be substring or regular expressions. by default None\n", "njobs : int, optional\n", " The maximum number of concurrently running jobs,\n", " by default -1 meaning all CPUs are used.\n", "\u001b[0;31mFile:\u001b[0m /glade/work/mgrover/git_repos/ecgtools/ecgtools/builder.py\n", "\u001b[0;31mType:\u001b[0m type\n", "\u001b[0;31mSubclasses:\u001b[0m \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Builder?" ] }, { "cell_type": "markdown", "id": "ccf85513-d76a-4b31-9908-dc6af39afc12", "metadata": {}, "source": [ "
\n", "

Info

\n", " Note that as of 21 June, 2021, the parsing_func parameter is now used in the .build() method!\n", "
" ] }, { "cell_type": "code", "execution_count": 7, "id": "abroad-taxation", "metadata": {}, "outputs": [], "source": [ "b = Builder(\n", " # Directory with the output\n", " \"/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/\",\n", " # Depth of 1 since we are sending it to the case output directory\n", " depth=1,\n", " # Exclude the timeseries and restart directories\n", " exclude_patterns=[\"*/tseries/*\", \"*/rest/*\"],\n", " # Number of jobs to execute - should be equal to # threads you are using\n", " njobs=5,\n", ")" ] }, { "cell_type": "markdown", "id": "painful-syria", "metadata": {}, "source": [ "Double check the object is set up..." ] }, { "cell_type": "code", "execution_count": 11, "id": "studied-jersey", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Builder(root_path=PosixPath('/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test'), extension='.nc', depth=1, exclude_patterns=['*/tseries/*', '*/rest/*'], njobs=5)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "markdown", "id": "american-exhibit", "metadata": {}, "source": [ "We are good to go! Let's build the catalog by calling `.build()` on the object, passing in the `parse_cesm_history` parser! By default, it will use the `LokyBackend` which is described in the [Joblib documentation](https://joblib.readthedocs.io/en/latest/parallel.html)." ] }, { "cell_type": "code", "execution_count": 12, "id": "false-bristol", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[Parallel(n_jobs=5)]: Using backend LokyBackend with 5 concurrent workers.\n", "[Parallel(n_jobs=5)]: Done 6 out of 12 | elapsed: 0.2s remaining: 0.2s\n", "[Parallel(n_jobs=5)]: Done 9 out of 12 | elapsed: 0.2s remaining: 0.1s\n", "[Parallel(n_jobs=5)]: Done 12 out of 12 | elapsed: 0.2s remaining: 0.0s\n", "[Parallel(n_jobs=5)]: Done 12 out of 12 | elapsed: 0.2s finished\n", "[Parallel(n_jobs=5)]: Using backend LokyBackend with 5 concurrent workers.\n", "[Parallel(n_jobs=5)]: Done 8 tasks | elapsed: 1.6s\n", "[Parallel(n_jobs=5)]: Done 62 tasks | elapsed: 4.5s\n", "[Parallel(n_jobs=5)]: Done 152 tasks | elapsed: 11.4s\n", "[Parallel(n_jobs=5)]: Done 264 out of 264 | elapsed: 15.1s finished\n", "/glade/work/mgrover/git_repos/ecgtools/ecgtools/builder.py:180: UserWarning: Unable to parse 5 assets/files. A list of these assets can be found in `.invalid_assets` attribute.\n", " parsing_func, parsing_func_kwargs\n" ] } ], "source": [ "b = b.build(parse_cesm_history)" ] }, { "cell_type": "markdown", "id": "caring-harrison", "metadata": {}, "source": [ "## Inspect the Catalog" ] }, { "cell_type": "markdown", "id": "hydraulic-developer", "metadata": {}, "source": [ "Now that the catalog is built, we can inspect the dataframe which is used to create the catalog by calling `.df` on the builder object" ] }, { "cell_type": "code", "execution_count": 13, "id": "composite-insider", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
componentstreamcasedatefrequencyvariablespath
0atmcam.h0b.e20.B1850.f19_g17.test0002-08month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
1atmcam.h0b.e20.B1850.f19_g17.test0001-09month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
2atmcam.h0b.e20.B1850.f19_g17.test0002-07month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
3atmcam.h0b.e20.B1850.f19_g17.test0003-05month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
4atmcam.h0b.e20.B1850.f19_g17.test0002-01month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
........................
259icecice.hb.e20.B1850.f19_g17.test0001-08month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
260icecice.hb.e20.B1850.f19_g17.test0001-03month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
261icecice.hb.e20.B1850.f19_g17.test0002-11month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
262icecice.hb.e20.B1850.f19_g17.test0002-10month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
263icecice.hb.e20.B1850.f19_g17.test0003-12month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
\n", "

259 rows × 7 columns

\n", "
" ], "text/plain": [ " component stream case date frequency \\\n", "0 atm cam.h0 b.e20.B1850.f19_g17.test 0002-08 month_1 \n", "1 atm cam.h0 b.e20.B1850.f19_g17.test 0001-09 month_1 \n", "2 atm cam.h0 b.e20.B1850.f19_g17.test 0002-07 month_1 \n", "3 atm cam.h0 b.e20.B1850.f19_g17.test 0003-05 month_1 \n", "4 atm cam.h0 b.e20.B1850.f19_g17.test 0002-01 month_1 \n", ".. ... ... ... ... ... \n", "259 ice cice.h b.e20.B1850.f19_g17.test 0001-08 month_1 \n", "260 ice cice.h b.e20.B1850.f19_g17.test 0001-03 month_1 \n", "261 ice cice.h b.e20.B1850.f19_g17.test 0002-11 month_1 \n", "262 ice cice.h b.e20.B1850.f19_g17.test 0002-10 month_1 \n", "263 ice cice.h b.e20.B1850.f19_g17.test 0003-12 month_1 \n", "\n", " variables \\\n", "0 [date, datesec, date_written, time_written, nd... \n", "1 [date, datesec, date_written, time_written, nd... \n", "2 [date, datesec, date_written, time_written, nd... \n", "3 [date, datesec, date_written, time_written, nd... \n", "4 [date, datesec, date_written, time_written, nd... \n", ".. ... \n", "259 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "260 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "261 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "262 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "263 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "\n", " path \n", "0 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "1 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "2 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "3 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "4 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", ".. ... \n", "259 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "260 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "261 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "262 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "263 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "\n", "[259 rows x 7 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.df" ] }, { "cell_type": "markdown", "id": "fitted-audio", "metadata": {}, "source": [ "The resultant dataframe includes the:\n", "* Component\n", "* Stream\n", "* Case\n", "* Date\n", "* Frequency\n", "* Variables\n", "* Path\n", "\n", "We can also check to see which files ***were not*** parsed by calling `.invalid_assets`" ] }, { "cell_type": "code", "execution_count": 14, "id": "rough-techno", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
INVALID_ASSETTRACEBACK
15/glade/work/mgrover/cesm_test_data/b.e20.B1850...Traceback (most recent call last):\\n File \"/g...
28/glade/work/mgrover/cesm_test_data/b.e20.B1850...Traceback (most recent call last):\\n File \"/g...
34/glade/work/mgrover/cesm_test_data/b.e20.B1850...Traceback (most recent call last):\\n File \"/g...
130/glade/work/mgrover/cesm_test_data/b.e20.B1850...Traceback (most recent call last):\\n File \"/g...
191/glade/work/mgrover/cesm_test_data/b.e20.B1850...Traceback (most recent call last):\\n File \"/g...
\n", "
" ], "text/plain": [ " INVALID_ASSET \\\n", "15 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "28 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "34 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "130 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "191 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "\n", " TRACEBACK \n", "15 Traceback (most recent call last):\\n File \"/g... \n", "28 Traceback (most recent call last):\\n File \"/g... \n", "34 Traceback (most recent call last):\\n File \"/g... \n", "130 Traceback (most recent call last):\\n File \"/g... \n", "191 Traceback (most recent call last):\\n File \"/g... " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.invalid_assets" ] }, { "cell_type": "code", "execution_count": 15, "id": "acting-maple", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PosixPath('/glade/work/mgrover/cesm_test_data/b.e20.B1850.f19_g17.test/atm/hist/b.e20.B1850.f19_g17.test.cam.i.0002-01-01-00000.nc')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.invalid_assets.INVALID_ASSET.values[0]" ] }, { "cell_type": "code", "execution_count": 16, "id": "civic-charleston", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
componentstreamcasedatefrequencyvariablespath
0atmcam.h0b.e20.B1850.f19_g17.test0002-08month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
1atmcam.h0b.e20.B1850.f19_g17.test0001-09month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
2atmcam.h0b.e20.B1850.f19_g17.test0002-07month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
3atmcam.h0b.e20.B1850.f19_g17.test0003-05month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
4atmcam.h0b.e20.B1850.f19_g17.test0002-01month_1[date, datesec, date_written, time_written, nd.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
........................
259icecice.hb.e20.B1850.f19_g17.test0001-08month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
260icecice.hb.e20.B1850.f19_g17.test0001-03month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
261icecice.hb.e20.B1850.f19_g17.test0002-11month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
262icecice.hb.e20.B1850.f19_g17.test0002-10month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
263icecice.hb.e20.B1850.f19_g17.test0003-12month_1[hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat.../glade/work/mgrover/cesm_test_data/b.e20.B1850...
\n", "

259 rows × 7 columns

\n", "
" ], "text/plain": [ " component stream case date frequency \\\n", "0 atm cam.h0 b.e20.B1850.f19_g17.test 0002-08 month_1 \n", "1 atm cam.h0 b.e20.B1850.f19_g17.test 0001-09 month_1 \n", "2 atm cam.h0 b.e20.B1850.f19_g17.test 0002-07 month_1 \n", "3 atm cam.h0 b.e20.B1850.f19_g17.test 0003-05 month_1 \n", "4 atm cam.h0 b.e20.B1850.f19_g17.test 0002-01 month_1 \n", ".. ... ... ... ... ... \n", "259 ice cice.h b.e20.B1850.f19_g17.test 0001-08 month_1 \n", "260 ice cice.h b.e20.B1850.f19_g17.test 0001-03 month_1 \n", "261 ice cice.h b.e20.B1850.f19_g17.test 0002-11 month_1 \n", "262 ice cice.h b.e20.B1850.f19_g17.test 0002-10 month_1 \n", "263 ice cice.h b.e20.B1850.f19_g17.test 0003-12 month_1 \n", "\n", " variables \\\n", "0 [date, datesec, date_written, time_written, nd... \n", "1 [date, datesec, date_written, time_written, nd... \n", "2 [date, datesec, date_written, time_written, nd... \n", "3 [date, datesec, date_written, time_written, nd... \n", "4 [date, datesec, date_written, time_written, nd... \n", ".. ... \n", "259 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "260 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "261 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "262 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "263 [hi, hs, snowfrac, Tsfc, aice, uvel, vvel, uat... \n", "\n", " path \n", "0 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "1 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "2 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "3 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "4 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", ".. ... \n", "259 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "260 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "261 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "262 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "263 /glade/work/mgrover/cesm_test_data/b.e20.B1850... \n", "\n", "[259 rows x 7 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.df" ] }, { "cell_type": "markdown", "id": "charitable-drunk", "metadata": {}, "source": [ "It appears that one of the invalid assets is a `pop.hv` stream, which is a time-invariant dataset we would not neccessarily be interested in looking at. If there is a file you think ***should*** be included in the resultant catalog but isn't, be sure to add it to the `_STREAMS_DICT` used in the [parsing tool](https://github.com/NCAR/ecgtools/blob/main/ecgtools/parsers/cesm.py)! " ] }, { "cell_type": "markdown", "id": "single-storm", "metadata": {}, "source": [ "## Save the Catalog" ] }, { "cell_type": "code", "execution_count": 17, "id": "center-desert", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved catalog location: /glade/work/mgrover/cesm-hist-test.json and /glade/work/mgrover/cesm-hist-test.csv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/glade/u/home/mgrover/miniconda3/envs/hires-marbl/lib/python3.7/site-packages/ipykernel_launcher.py:17: UserWarning: Unable to parse 5 assets/files. A list of these assets can be found in /glade/work/mgrover/invalid_assets_cesm-hist-test.csv.\n" ] } ], "source": [ "b.save(\n", " # File path - could save as .csv (uncompressed csv) or .csv.gz (compressed csv)\n", " \"/glade/work/mgrover/cesm-hist-test.csv\",\n", " # Column name including filepath\n", " path_column_name='path',\n", " # Column name including variables\n", " variable_column_name='variables',\n", " # Data file format - could be netcdf or zarr (in this case, netcdf)\n", " data_format=\"netcdf\",\n", " # Which attributes to groupby when reading in variables using intake-esm\n", " groupby_attrs=[\"component\", \"stream\", \"case\"],\n", " # Aggregations which are fed into xarray when reading in data using intake\n", " aggregations=[\n", " {\n", " \"type\": \"join_existing\",\n", " \"attribute_name\": \"date\",\n", " \"options\": {\"dim\": \"time\", \"coords\": \"minimal\", \"compat\": \"override\"},\n", " }\n", " ],\n", ")" ] }, { "cell_type": "markdown", "id": "healthy-shower", "metadata": {}, "source": [ "## Using the Catalog" ] }, { "cell_type": "markdown", "id": "talented-cooperative", "metadata": {}, "source": [ "You'll notice the resultant filepaths are output when calling `.save` - which you could use within your intake-esm `open_esm_datastore` function.\n", "\n", "### Additional Imports" ] }, { "cell_type": "code", "execution_count": 18, "id": "respected-flood", "metadata": {}, "outputs": [], "source": [ "# Import ast which helps with parsing the list of variables\n", "import ast\n", "\n", "# Import intake-esm\n", "import intake" ] }, { "cell_type": "markdown", "id": "naval-external", "metadata": {}, "source": [ "### Use the catalog to read in data" ] }, { "cell_type": "code", "execution_count": 19, "id": "equal-ordering", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

None catalog with 9 dataset(s) from 259 asset(s):

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique
component6
stream9
case1
date79
frequency4
variables1447
path259
\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "col = intake.open_esm_datastore(\n", " \"/glade/work/mgrover/cesm-hist-test.json\",\n", " csv_kwargs={\"converters\": {\"variables\": ast.literal_eval}},\n", " sep=\"/\",\n", ")\n", "col" ] }, { "cell_type": "code", "execution_count": 20, "id": "beginning-regard", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

None catalog with 1 dataset(s) from 36 asset(s):

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique
component1
stream1
case1
date36
frequency1
variables434
path36
\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cat = col.search(\n", " variables='TEMP',\n", ")\n", "cat" ] }, { "cell_type": "code", "execution_count": 21, "id": "insured-conviction", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--> The keys in the returned dictionary of datasets are constructed as follows:\n", "\t'component/stream/case'\n" ] }, { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 100.00% [1/1 00:00<00:00]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dsets = cat.to_dataset_dict(cdf_kwargs={'use_cftime': True, 'chunks': {'time': 10}})" ] }, { "cell_type": "code", "execution_count": 23, "id": "meaningful-journalism", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ocn/pop.h/b.e20.B1850.f19_g17.test': \n", " Dimensions: (nlat: 384, nlon: 320, time: 36, z_t: 60)\n", " Coordinates:\n", " * time (time) object 0004-01-01 00:00:00 ... 0002-03-01 00:00:00\n", " * z_t (z_t) float32 500.0 1.5e+03 2.5e+03 ... 5.125e+05 5.375e+05\n", " ULONG (nlat, nlon) float64 dask.array\n", " ULAT (nlat, nlon) float64 dask.array\n", " TLONG (nlat, nlon) float64 dask.array\n", " TLAT (nlat, nlon) float64 dask.array\n", " Dimensions without coordinates: nlat, nlon\n", " Data variables:\n", " TEMP (time, z_t, nlat, nlon) float32 dask.array\n", " Attributes:\n", " intake_esm_varname: ['TEMP']\n", " source: CCSM POP2, the CCSM Ocean Component\n", " time_period_freq: month_1\n", " calendar: All years have exactly 365 days.\n", " revision: $Id$\n", " history: none\n", " model_doi_url: https://doi.org/10.5065/D67H1H0V\n", " contents: Diagnostic and Prognostic Variables\n", " cell_methods: cell_methods = time: mean ==> the variable value...\n", " Conventions: CF-1.0; http://www.cgd.ucar.edu/cms/eaton/netcdf...\n", " title: b.e20.B1850.f19_g17.test\n", " intake_esm_dataset_key: ocn/pop.h/b.e20.B1850.f19_g17.test}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dsets" ] }, { "cell_type": "markdown", "id": "center-orbit", "metadata": {}, "source": [ "Let's plot a quick figure from the dataset!" ] }, { "cell_type": "code", "execution_count": 24, "id": "comic-hampshire", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dsets['ocn/pop.h/b.e20.B1850.f19_g17.test'].TEMP.isel(time=0, z_t=0).plot();" ] }, { "cell_type": "markdown", "id": "facial-picking", "metadata": {}, "source": [ "## Conclusion\n", "Having the ability to easily create intake-esm catalogs from history files can be a powerful tool in your analysis toolkit. These data can be read in relatively quickly, easing the ability to quickly take a look at model output or even share your data with others! For more updates on [ecgtools](https://github.com/NCAR/ecgtools), be sure to follow [the ecgtools repository](https://github.com/NCAR/ecgtools) on Github! Have an idea for another helpful parser? Submit an issue!" ] }, { "cell_type": "code", "execution_count": null, "id": "documentary-cable", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "author": "Max Grover", "date": "2021-06-04", "kernelspec": { "display_name": "Python [conda env:miniconda3-hires-marbl]", "language": "python", "name": "conda-env-miniconda3-hires-marbl-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" }, "tags": "intake,cesm", "title": "Building an Intake-esm catalog from CESM2 History Files" }, "nbformat": 4, "nbformat_minor": 5 }