├── .prettierrc.toml ├── .pre-commit-config.yaml ├── collection-spec ├── examples │ ├── sample-collection.json │ ├── sample-pangeo-cmip6-collection.json │ ├── sample-collection-with-catalog-dict.json │ ├── sample-glade-cmip6-netcdf-collection.json │ ├── sample-pangeo-cmip6-zarr-stores.csv │ └── sample-glade-cmip6-netcdf.csv ├── json-schema │ └── collection.json └── collection-spec.md ├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── README.md └── LICENSE /.prettierrc.toml: -------------------------------------------------------------------------------- 1 | tabWidth = 2 2 | semi = false 3 | singleQuote = true 4 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v3.2.0 4 | hooks: 5 | - id: trailing-whitespace 6 | - id: end-of-file-fixer 7 | - id: check-docstring-first 8 | - id: check-json 9 | - id: check-yaml 10 | - id: double-quote-string-fixer 11 | 12 | - repo: https://github.com/prettier/prettier 13 | rev: 2.1.1 14 | hooks: 15 | - id: prettier 16 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "esmcat_version": "0.1.0", 3 | "id": "sample", 4 | "description": "This is a very basic sample ESM collection.", 5 | "catalog_file": "sample_catalog.csv", 6 | "attributes": [ 7 | { 8 | "column_name": "activity_id", 9 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_activity_id.json" 10 | }, 11 | { 12 | "column_name": "source_id", 13 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_source_id.json" 14 | } 15 | ], 16 | "assets": { 17 | "column_name": "path", 18 | "format": "zarr" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: '*' 6 | pull_request: 7 | branches: '*' 8 | 9 | jobs: 10 | validate: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: actions/setup-python@v2 15 | with: 16 | python-version: '3.8' 17 | - uses: actions/setup-node@v2-beta 18 | with: 19 | node-version: '12' 20 | - name: Install Validators 21 | run: | 22 | npm install -g remark-cli remark-validate-links 23 | python -m pip install esmcol-validator 24 | - name: Validate links 25 | run: | 26 | remark -f -u validate-links . 27 | 28 | - name: Validate sample collections 29 | run: | 30 | cd collection-spec/examples 31 | esmcol-validator sample-glade-cmip6-netcdf-collection.json 32 | esmcol-validator sample-pangeo-cmip6-collection.json 33 | esmcol-validator --esmcol-spec-dirs ../json-schema simple-collection-with-catalog-dict.json 34 | linting: 35 | runs-on: ubuntu-latest 36 | steps: 37 | - uses: actions/checkout@v2 38 | - uses: actions/setup-python@v2 39 | - uses: pre-commit/action@v2.0.0 40 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-pangeo-cmip6-collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "esmcat_version": "0.1.0", 3 | "id": "pangeo-cmip6", 4 | "description": "This is an ESM collection for CMIP6 Zarr data residing in Pangeo's Google Storage.", 5 | "catalog_file": "sample-pangeo-cmip6-zarr-stores.csv", 6 | "attributes": [ 7 | { 8 | "column_name": "activity_id", 9 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_activity_id.json" 10 | }, 11 | { 12 | "column_name": "source_id", 13 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_source_id.json" 14 | }, 15 | { 16 | "column_name": "institution_id", 17 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_institution_id.json" 18 | }, 19 | { 20 | "column_name": "experiment_id", 21 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_experiment_id.json" 22 | }, 23 | { "column_name": "member_id", "vocabulary": "" }, 24 | { 25 | "column_name": "table_id", 26 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_table_id.json" 27 | }, 28 | { "column_name": "variable_id", "vocabulary": "" }, 29 | { 30 | "column_name": "grid_label", 31 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_grid_label.json" 32 | } 33 | ], 34 | "assets": { 35 | "column_name": "path", 36 | "format": "zarr" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # PyCharm project settings 98 | .idea/ 99 | 100 | # Rope project settings 101 | .ropeproject 102 | 103 | # mkdocs documentation 104 | /site 105 | 106 | # mypy 107 | .mypy_cache/ 108 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-collection-with-catalog-dict.json: -------------------------------------------------------------------------------- 1 | { 2 | "esmcat_version": "0.1.0", 3 | "id": "aws-cesm1-le", 4 | "description": "This is an ESM collection for CESM1 Large Ensemble Zarr dataset publicly available on Amazon S3 (us-west-2 region)", 5 | "catalog_dict": [ 6 | { 7 | "component": "atm", 8 | "frequency": "daily", 9 | "experiment": "20C", 10 | "variable": "FLNS", 11 | "path": "s3://ncar-cesm-lens/atm/daily/cesmLE-20C-FLNS.zarr" 12 | }, 13 | { 14 | "component": "atm", 15 | "frequency": "daily", 16 | "experiment": "20C", 17 | "variable": "FLNSC", 18 | "path": "s3://ncar-cesm-lens/atm/daily/cesmLE-20C-FLNSC.zarr" 19 | }, 20 | { 21 | "component": "atm", 22 | "frequency": "daily", 23 | "experiment": "20C", 24 | "variable": "FLUT", 25 | "path": "s3://ncar-cesm-lens/atm/daily/cesmLE-20C-FLUT.zarr" 26 | }, 27 | { 28 | "component": "atm", 29 | "frequency": "daily", 30 | "experiment": "20C", 31 | "variable": "FSNS", 32 | "path": "s3://ncar-cesm-lens/atm/daily/cesmLE-20C-FSNS.zarr" 33 | }, 34 | { 35 | "component": "atm", 36 | "frequency": "daily", 37 | "experiment": "20C", 38 | "variable": "FSNSC", 39 | "path": "s3://ncar-cesm-lens/atm/daily/cesmLE-20C-FSNSC.zarr" 40 | } 41 | ], 42 | "attributes": [ 43 | { 44 | "column_name": "component", 45 | "vocabulary": "" 46 | }, 47 | { 48 | "column_name": "frequency", 49 | "vocabulary": "" 50 | }, 51 | { 52 | "column_name": "experiment", 53 | "vocabulary": "" 54 | }, 55 | { 56 | "column_name": "variable", 57 | "vocabulary": "" 58 | } 59 | ], 60 | "assets": { 61 | "column_name": "path", 62 | "format": "zarr" 63 | }, 64 | "aggregation_control": { 65 | "variable_column_name": "variable", 66 | "groupby_attrs": ["component", "experiment", "frequency"], 67 | "aggregations": [ 68 | { 69 | "type": "union", 70 | "attribute_name": "variable", 71 | "options": { 72 | "compat": "override" 73 | } 74 | } 75 | ] 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-glade-cmip6-netcdf-collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "esmcat_version": "0.1.0", 3 | "id": "glade-cmip6", 4 | "description": "This is an ESM collection for CMIP6 data residing on NCAR's GLADE file system.", 5 | "catalog_file": "sample-glade-cmip6-netcdf.csv", 6 | "attributes": [ 7 | { 8 | "column_name": "activity_id", 9 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_activity_id.json" 10 | }, 11 | { 12 | "column_name": "source_id", 13 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_source_id.json" 14 | }, 15 | { 16 | "column_name": "institution_id", 17 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_institution_id.json" 18 | }, 19 | { 20 | "column_name": "experiment_id", 21 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_experiment_id.json" 22 | }, 23 | { "column_name": "member_id", "vocabulary": "" }, 24 | { 25 | "column_name": "table_id", 26 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_table_id.json" 27 | }, 28 | { "column_name": "variable_id", "vocabulary": "" }, 29 | { 30 | "column_name": "grid_label", 31 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_grid_label.json" 32 | }, 33 | { 34 | "column_name": "time_range", 35 | "vocabulary": "" 36 | } 37 | ], 38 | "assets": { 39 | "column_name": "path", 40 | "format": "netcdf" 41 | }, 42 | "aggregation_control": { 43 | "variable_column_name": "variable_id", 44 | "groupby_attrs": [ 45 | "activity_id", 46 | "institution_id", 47 | "source_id", 48 | "experiment_id", 49 | "table_id", 50 | "grid_label" 51 | ], 52 | "aggregations": [ 53 | { 54 | "type": "join_new", 55 | "attribute_name": "member_id", 56 | "options": { "coords": "minimal", "compat": "override" } 57 | }, 58 | { 59 | "type": "join_existing", 60 | "attribute_name": "time_range", 61 | "options": { "dim": "time" } 62 | }, 63 | { 64 | "type": "union", 65 | "attribute_name": "variable_id" 66 | } 67 | ] 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESM Catalog Specification 2 | 3 | [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/NCAR/esm-collection-spec/CI?label=CI&logo=github&style=for-the-badge)](https://github.com/NCAR/esm-collection-spec/actions?query=workflow%3ACI) 4 | [![Zenodo](https://img.shields.io/badge/DOI-10.5281%20%2F%20zenodo.3703320-blue.svg?style=for-the-badge)](https://doi.org/10.5281/zenodo.3703320) 5 | 6 | - [ESM Catalog Specification](#esm-catalog-specification) 7 | - [Background and Related Projects](#background-and-related-projects) 8 | - [The Specification](#the-specification) 9 | - [Intake driver: intake-esm](#intake-driver-intake-esm) 10 | 11 | The Earth System Model Catalog specification describes a way of cataloging large datasets with a homogeneous metadata structure, such as those produced by the Coupled Model Intercomparison Project of the World Climate Research Programme. 12 | It was designed within the Pangeo project, growing out of various ad-hoc attempts at building catalogs of convenience for CMIP6 and related dataset in the months before the [2019 CMIP6 Hackathon](https://cmip6hack.github.io). 13 | 14 | ## Background and Related Projects 15 | 16 | ![Standards](https://imgs.xkcd.com/comics/standards.png) 17 | 18 | via 19 | 20 | We are guilty of creating a new standard rather than reusing one of the many reasonable alternatives already in existence. 21 | Here we try to justify this choice. 22 | 23 | - The [THREDDS Client Catalog Specification 24 | ](https://www.unidata.ucar.edu/software/tds/current/catalog/InvCatalogSpec.html) 25 | is an excellent, full-featured, mature specification aimed at a similar type of datasets. 26 | We probably could have used the THREDDS spec here, and avoided defining a new one. 27 | However, we are not actually planning to use THREDDS. 28 | The spec is in XML and is controlled by Unidata (not open for pull requests). 29 | For the cloud, some innovation is likely needed. 30 | We were looking for something simpler and more open to hacking from the community. 31 | 32 | - [Spatiotemporal Asset Catalog](https://github.com/radiantearth/stac-spec/blob/master/README.md) was very inspirational from a technical point of view. 33 | We love the simplicity of their approach, with lightweight text files optimized for cloud-native operations. 34 | But STAC is aimed at geospatial imagery, which has slightly different attributes and challenges compared to climate model data. 35 | Spatiotemporal assets usually show just a small piece of the real Earth, within the recent historical period. 36 | Climate models generally simulate the whole planet, under hundreds or thousands of different scenarios. Not to mention weird calendars, aquaplanets, exoplanets, etc. 37 | We played around with STAC, but it didn't feel like the right fit. 38 | 39 | - Our ultimate aims are similar to those of the [Earth System Grid Federation Search Tool](https://github.com/ESGF/esg-search). 40 | However, we are not actually running an ESGF node, so it didn't seem sensible to try to use that tool directly. We do, however, optionally reference the same [controlled vocabularies](https://github.com/WCRP-CMIP/CMIP6_CVs) as the ESGF search tool. 41 | 42 | - [AOSPy](https://aospy.readthedocs.io/en/stable/index.html) is a workflow manager aimed at similar data ensembles. 43 | The data model of AOSPy is very similar to the one in ESM Catalog. 44 | However, the actual data catalog is described in python code, rather than text files. 45 | We would love to see AOSPy interoperate with ESM spec by parsing its catalogs and converting them into its objects. 46 | 47 | - [Intake](http://intake.readthedocs.io) is python tool for cataloging and loading data, widely used in the Pangeo community. 48 | The catalogs are described in YAMl, and the content of these YAML files is coupled tightly to the python library. 49 | While intake is very convenient, we thought it was important that the catalog itself be language independent. 50 | We hope that, once the ESM spec is complete enough, an intake driver for parsing it should be easy to implement. 51 | 52 | Ultimately, with sufficient time, we probably could have adopted any of the above tools and made it work for our needs. 53 | The decision to make a new spec was ultimately driven by the timeline of the CMIP6 hackathon--it seemed like the fastest route. 54 | 55 | ## The Specification 56 | 57 | **[collection-spec/](collection-spec/)** directory contains the esm collection core specification plus examples and information about the validation schema and validation tool. 58 | 59 | ## Intake driver: intake-esm 60 | 61 | [Intake-esm](https://github.com/NCAR/intake-esm) is a data cataloging utility built on top of [intake](https://github.com/intake/intake), [pandas](https://pandas.pydata.org/), and [xarray](https://xarray.pydata.org/en/stable/). Intake-esm provides functionality for: 62 | 63 | - Parsing an ESM (Earth System Model) Collection/catalog and 64 | - Loading assets (netCDF files and/or Zarr stores) into xarray datasets. 65 | -------------------------------------------------------------------------------- /collection-spec/json-schema/collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "$id": "collection.json#", 4 | "title": "ESM Collection Specification", 5 | "description": "This object represents Collections in a Earth System Model Catalog.", 6 | "definitions": { 7 | "collection": { 8 | "title": "Collection", 9 | "type": "object", 10 | "properties": { 11 | "esmcat_version": { 12 | "title": "ESM Catalog version", 13 | "type": "string", 14 | "const": "0.1.0" 15 | }, 16 | "id": { 17 | "title": "Identifier", 18 | "type": "string" 19 | }, 20 | "title": { 21 | "title": "Title", 22 | "type": "string" 23 | }, 24 | "description": { 25 | "title": "Description", 26 | "type": "string" 27 | }, 28 | "catalog_file": { 29 | "title": "Catalog File", 30 | "type": "string" 31 | }, 32 | 33 | "catalog_dict": { 34 | "title": "An array of dictionaries that represents the data that would otherwise be in the csv.", 35 | "type": "array" 36 | }, 37 | 38 | "attributes": { 39 | "title": "Attributes", 40 | "description": "Asset attributes", 41 | "type": "array", 42 | "items": { 43 | "$ref": "#/definitions/attribute" 44 | } 45 | }, 46 | "assets": { 47 | "title": "Assets", 48 | "description": "Assets file", 49 | "type": "object", 50 | "required": ["column_name"], 51 | "properties": { 52 | "column_name": { 53 | "title": "Column Name", 54 | "description": "The name of the column containing the path to the asset.", 55 | "type": "string" 56 | }, 57 | "format": { 58 | "title": "Format", 59 | "description": "File format of the assets.", 60 | "type": "string" 61 | }, 62 | "format_column_name": { 63 | "title": "Format Column Name", 64 | "description": "The column name which contains the data format.", 65 | "type": "string" 66 | } 67 | } 68 | }, 69 | "aggregation_control": { 70 | "type": "object", 71 | "required": ["variable_column_name"], 72 | "properties": { 73 | "variable_column_name": { 74 | "title": "Variable Column Name", 75 | "description": "Name of the attribute column in csv file that contains the variable name.", 76 | "type": "string" 77 | }, 78 | "groupby_attrs": { 79 | "title": "Group by attributes", 80 | "description": "Column names (attributes) that define data sets that can be aggegrated.", 81 | "type": "array" 82 | }, 83 | "aggregations": { 84 | "title": "Aggregation operations", 85 | "description": "List of aggregations to apply to query results", 86 | "type": "array", 87 | "items": { 88 | "$ref": "#/definitions/aggregation" 89 | } 90 | } 91 | } 92 | } 93 | }, 94 | "required": [ 95 | "esmcat_version", 96 | "id", 97 | "description", 98 | "attributes", 99 | "assets" 100 | ], 101 | "oneOf": [ 102 | { "required": ["catalog_file"] }, 103 | { "required": ["catalog_dict"] } 104 | ] 105 | }, 106 | "attribute": { 107 | "type": "object", 108 | "required": ["column_name"], 109 | "properties": { 110 | "column_name": { 111 | "title": "Column Name", 112 | "description": "Name of the attribute column in the assets csv file.", 113 | "type": "string" 114 | }, 115 | "vocabulary": { 116 | "title": "Vocabulary", 117 | "description": "Link to the controlled vocabulary for the attribute in the format of a URL.", 118 | "type": "string" 119 | } 120 | } 121 | }, 122 | "aggregation": { 123 | "type": "object", 124 | "required": ["type"], 125 | "properties": { 126 | "type": { 127 | "title": "Type of aggregration", 128 | "description": "Type of aggregation operation to apply.", 129 | "enum": ["join_new", "join_existing", "union"], 130 | "type": "string" 131 | }, 132 | "attribute_name": { 133 | "title": "Name of attribute", 134 | "description": "Name of attribute across which to aggregate.", 135 | "type": "string" 136 | }, 137 | "options": { 138 | "title": "Options", 139 | "description": "Optional aggregration settings that are passed as keywords arguments to xarray.concat or xarray.merge. For `join_existing`, must contain something like {'dim': 'time'}.", 140 | "type": "object" 141 | } 142 | } 143 | } 144 | }, 145 | 146 | "allOf": [ 147 | { 148 | "$ref": "#/definitions/collection" 149 | } 150 | ] 151 | } 152 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-pangeo-cmip6-zarr-stores.csv: -------------------------------------------------------------------------------- 1 | activity_id,institution_id,source_id,experiment_id,member_id,table_id,variable_id,grid_label,path 2 | CMIP,IPSL,IPSL-CM6A-LR,historical,r31i1p1f1,Amon,tas,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r31i1p1f1/Amon/tas/gr/ 3 | CMIP,CNRM-CERFACS,CNRM-CM6-1,historical,r3i1p1f2,Amon,rsds,gr,gs://cmip6/CMIP/CNRM-CERFACS/CNRM-CM6-1/historical/r3i1p1f2/Amon/rsds/gr/ 4 | ScenarioMIP,MIROC,MIROC-ES2L,ssp245,r1i1p1f2,Amon,hurs,gn,gs://cmip6/ScenarioMIP/MIROC/MIROC-ES2L/ssp245/r1i1p1f2/Amon/hurs/gn/ 5 | ScenarioMIP,CCCma,CanESM5,ssp585,r2i1p1f1,Amon,rsut,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp585/r2i1p1f1/Amon/rsut/gn/ 6 | CMIP,IPSL,IPSL-CM6A-LR,historical,r17i1p1f1,Amon,tauu,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r17i1p1f1/Amon/tauu/gr/ 7 | CMIP,IPSL,IPSL-CM6A-LR,historical,r1i1p1f1,Amon,evspsbl,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r1i1p1f1/Amon/evspsbl/gr/ 8 | ScenarioMIP,NCAR,CESM2-WACCM,ssp585,r1i1p1f1,Oyr,si,gr,gs://cmip6/ScenarioMIP/NCAR/CESM2-WACCM/ssp585/r1i1p1f1/Oyr/si/gr/ 9 | ScenarioMIP,CCCma,CanESM5,ssp245,r7i1p2f1,Amon,rsut,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp245/r7i1p2f1/Amon/rsut/gn/ 10 | ScenarioMIP,CNRM-CERFACS,CNRM-CM6-1,ssp585,r6i1p1f2,Amon,rlut,gr,gs://cmip6/ScenarioMIP/CNRM-CERFACS/CNRM-CM6-1/ssp585/r6i1p1f2/Amon/rlut/gr/ 11 | ScenarioMIP,CNRM-CERFACS,CNRM-ESM2-1,ssp245,r3i1p1f2,Amon,vas,gr,gs://cmip6/ScenarioMIP/CNRM-CERFACS/CNRM-ESM2-1/ssp245/r3i1p1f2/Amon/vas/gr/ 12 | ScenarioMIP,MOHC,UKESM1-0-LL,ssp370,r3i1p1f2,Amon,tasmin,gn,gs://cmip6/ScenarioMIP/MOHC/UKESM1-0-LL/ssp370/r3i1p1f2/Amon/tasmin/gn/ 13 | CMIP,NCAR,CESM2-WACCM,historical,r3i1p1f1,Amon,ch4,gn,gs://cmip6/CMIP/NCAR/CESM2-WACCM/historical/r3i1p1f1/Amon/ch4/gn/ 14 | CMIP,IPSL,IPSL-CM6A-LR,historical,r2i1p1f1,Amon,rsutcs,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r2i1p1f1/Amon/rsutcs/gr/ 15 | ScenarioMIP,MIROC,MIROC-ES2L,ssp585,r1i1p1f2,Ofx,areacello,gn,gs://cmip6/ScenarioMIP/MIROC/MIROC-ES2L/ssp585/r1i1p1f2/Ofx/areacello/gn/ 16 | CMIP,IPSL,IPSL-CM6A-LR,historical,r31i1p1f1,Ofx,basin,gn,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r31i1p1f1/Ofx/basin/gn/ 17 | CMIP,NCAR,CESM2,historical,r9i1p1f1,Oyr,calc,gn,gs://cmip6/CMIP/NCAR/CESM2/historical/r9i1p1f1/Oyr/calc/gn/ 18 | ScenarioMIP,IPSL,IPSL-CM6A-LR,ssp585,r1i1p1f1,Omon,volo,gn,gs://cmip6/ScenarioMIP/IPSL/IPSL-CM6A-LR/ssp585/r1i1p1f1/Omon/volo/gn/ 19 | CMIP,NCAR,CESM2-WACCM,abrupt-4xCO2,r1i1p1f1,Oyr,phyp,gr,gs://cmip6/CMIP/NCAR/CESM2-WACCM/abrupt-4xCO2/r1i1p1f1/Oyr/phyp/gr/ 20 | CMIP,NUIST,NESM3,historical,r4i1p1f1,Amon,prw,gn,gs://cmip6/CMIP/NUIST/NESM3/historical/r4i1p1f1/Amon/prw/gn/ 21 | CMIP,CCCma,CanESM5,historical,r20i1p2f1,Oyr,fgco2,gn,gs://cmip6/CMIP/CCCma/CanESM5/historical/r20i1p2f1/Oyr/fgco2/gn/ 22 | CMIP,NASA-GISS,GISS-E2-1-G,historical,r6i1p1f1,Amon,vas,gn,gs://cmip6/CMIP/NASA-GISS/GISS-E2-1-G/historical/r6i1p1f1/Amon/vas/gn/ 23 | ScenarioMIP,CCCma,CanESM5,ssp370,r22i1p2f1,Amon,tas,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp370/r22i1p2f1/Amon/tas/gn/ 24 | CMIP,CNRM-CERFACS,CNRM-ESM2-1,historical,r4i1p1f2,Amon,psl,gr,gs://cmip6/CMIP/CNRM-CERFACS/CNRM-ESM2-1/historical/r4i1p1f2/Amon/psl/gr/ 25 | LUMIP,CNRM-CERFACS,CNRM-ESM2-1,deforest-globe,r1i1p1f2,Amon,wap,gr,gs://cmip6/LUMIP/CNRM-CERFACS/CNRM-ESM2-1/deforest-globe/r1i1p1f2/Amon/wap/gr/ 26 | CMIP,IPSL,IPSL-CM6A-LR,historical,r30i1p1f1,Lmon,ra,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r30i1p1f1/Lmon/ra/gr/ 27 | CMIP,NCAR,CESM2,esm-piControl,r1i1p1f1,Oyr,phydiat,gr,gs://cmip6/CMIP/NCAR/CESM2/esm-piControl/r1i1p1f1/Oyr/phydiat/gr/ 28 | CMIP,MIROC,MIROC-ES2L,historical,r1i1p1f2,Omon,sos,gn,gs://cmip6/CMIP/MIROC/MIROC-ES2L/historical/r1i1p1f2/Omon/sos/gn/ 29 | CMIP,CCCma,CanESM5,historical,r10i1p1f1,Amon,prw,gn,gs://cmip6/CMIP/CCCma/CanESM5/historical/r10i1p1f1/Amon/prw/gn/ 30 | CMIP,CCCma,CanESM5,historical,r12i1p1f1,Amon,huss,gn,gs://cmip6/CMIP/CCCma/CanESM5/historical/r12i1p1f1/Amon/huss/gn/ 31 | CMIP,IPSL,IPSL-CM6A-LR,historical,r23i1p1f1,Amon,tasmax,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r23i1p1f1/Amon/tasmax/gr/ 32 | ScenarioMIP,CCCma,CanESM5,ssp126,r13i1p2f1,Amon,pr,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp126/r13i1p2f1/Amon/pr/gn/ 33 | CMIP,CCCma,CanESM5,historical,r10i1p1f1,Lmon,nbp,gn,gs://cmip6/CMIP/CCCma/CanESM5/historical/r10i1p1f1/Lmon/nbp/gn/ 34 | ScenarioMIP,CCCma,CanESM5,ssp126,r7i1p2f1,Amon,vas,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp126/r7i1p2f1/Amon/vas/gn/ 35 | CMIP,NCAR,CESM2,historical,r5i1p1f1,Lmon,gpp,gn,gs://cmip6/CMIP/NCAR/CESM2/historical/r5i1p1f1/Lmon/gpp/gn/ 36 | CMIP,IPSL,IPSL-CM6A-LR,historical,r7i1p1f1,Lmon,lai,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/historical/r7i1p1f1/Lmon/lai/gr/ 37 | CMIP,BCC,BCC-ESM1,historical,r1i1p1f1,Omon,vo,gn,gs://cmip6/CMIP/BCC/BCC-ESM1/historical/r1i1p1f1/Omon/vo/gn/ 38 | CMIP,NCAR,CESM2,historical,r7i1p1f1,Amon,hurs,gn,gs://cmip6/CMIP/NCAR/CESM2/historical/r7i1p1f1/Amon/hurs/gn/ 39 | CMIP,NCAR,CESM2,historical,r1i1p1f1,Oyr,dissic,gn,gs://cmip6/CMIP/NCAR/CESM2/historical/r1i1p1f1/Oyr/dissic/gn/ 40 | CMIP,NOAA-GFDL,GFDL-ESM4,piControl,r1i1p1f1,Amon,pr,gr1,gs://cmip6/CMIP/NOAA-GFDL/GFDL-ESM4/piControl/r1i1p1f1/Amon/pr/gr1/ 41 | ScenarioMIP,CCCma,CanESM5,ssp126,r5i1p2f1,Amon,ts,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp126/r5i1p2f1/Amon/ts/gn/ 42 | ScenarioMIP,CCCma,CanESM5,ssp245,r21i1p1f1,Amon,tas,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp245/r21i1p1f1/Amon/tas/gn/ 43 | CMIP,BCC,BCC-ESM1,historical,r2i1p1f1,Amon,ts,gn,gs://cmip6/CMIP/BCC/BCC-ESM1/historical/r2i1p1f1/Amon/ts/gn/ 44 | CMIP,NASA-GISS,GISS-E2-1-G,historical,r6i1p1f1,Amon,rlutcs,gn,gs://cmip6/CMIP/NASA-GISS/GISS-E2-1-G/historical/r6i1p1f1/Amon/rlutcs/gn/ 45 | LUMIP,IPSL,IPSL-CM6A-LR,deforest-globe,r2i1p1f1,Amon,rlut,gr,gs://cmip6/LUMIP/IPSL/IPSL-CM6A-LR/deforest-globe/r2i1p1f1/Amon/rlut/gr/ 46 | ScenarioMIP,CCCma,CanESM5,ssp245,r4i1p2f1,Lmon,mrso,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp245/r4i1p2f1/Lmon/mrso/gn/ 47 | CMIP,CCCma,CanESM5,historical,r21i1p1f1,Amon,tauu,gn,gs://cmip6/CMIP/CCCma/CanESM5/historical/r21i1p1f1/Amon/tauu/gn/ 48 | CMIP,IPSL,IPSL-CM6A-LR,piControl,r1i1p1f1,Amon,tauu,gr,gs://cmip6/CMIP/IPSL/IPSL-CM6A-LR/piControl/r1i1p1f1/Amon/tauu/gr/ 49 | ScenarioMIP,CCCma,CanESM5,ssp585,r5i1p2f1,Ofx,deptho,gn,gs://cmip6/ScenarioMIP/CCCma/CanESM5/ssp585/r5i1p2f1/Ofx/deptho/gn/ 50 | DAMIP,NASA-GISS,GISS-E2-1-G,hist-GHG,r3i1p1f1,Amon,ts,gn,gs://cmip6/DAMIP/NASA-GISS/GISS-E2-1-G/hist-GHG/r3i1p1f1/Amon/ts/gn/ 51 | CMIP,NASA-GISS,GISS-E2-1-G,historical,r10i1p1f1,Amon,rsdt,gn,gs://cmip6/CMIP/NASA-GISS/GISS-E2-1-G/historical/r10i1p1f1/Amon/rsdt/gn/ 52 | -------------------------------------------------------------------------------- /collection-spec/examples/sample-glade-cmip6-netcdf.csv: -------------------------------------------------------------------------------- 1 | ,activity_id,institution_id,source_id,experiment_id,member_id,table_id,variable_id,grid_label,path,time_range 2 | 0,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r22i1p1f1,day,psl,gr,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r22i1p1f1/day/psl/gr/v20190625/psl/psl_day_EC-Earth3_historical_r22i1p1f1_gr_19430101-19431231.nc,19430101-19431231 3 | 1,PAMIP,NCAR,CESM2,pdSST-futAntSIC,r88i1p1f1,day,pr,gn,/glade/collections/cmip/CMIP6/PAMIP/NCAR/CESM2/pdSST-futAntSIC/r88i1p1f1/day/pr/gn/v20190614/pr_day_CESM2_pdSST-futAntSIC_r88i1p1f1_gn_20000601-20010601.nc,20000601-20010601 4 | 2,CMIP,NASA-GISS,GISS-E2-1-G,historical,r6i1p1f1,Amon,rldscs,gn,/glade/collections/cmip/CMIP6/CMIP/NASA-GISS/GISS-E2-1-G/historical/r6i1p1f1/Amon/rldscs/gn/v20180829/rldscs/rldscs_Amon_GISS-E2-1-G_historical_r6i1p1f1_gn_190101-195012.nc,190101-195012 5 | 3,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r22i1p1f1,Omon,friver,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r22i1p1f1/Omon/friver/gn/v20190625/friver/friver_Omon_EC-Earth3_historical_r22i1p1f1_gn_190101-190112.nc,190101-190112 6 | 4,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r21i1p1f1,Omon,wfo,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r21i1p1f1/Omon/wfo/gn/v20190725/wfo/wfo_Omon_EC-Earth3_historical_r21i1p1f1_gn_191101-191112.nc,191101-191112 7 | 5,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r24i1p1f1,LImon,snm,gr,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r24i1p1f1/LImon/snm/gr/v20190411/snm/snm_LImon_EC-Earth3_historical_r24i1p1f1_gr_187801-187812.nc,187801-187812 8 | 6,CMIP,IPSL,IPSL-CM6A-LR,historical,r30i1p1f1,SImon,sivols,gn,/glade/collections/cmip/CMIP6/CMIP/IPSL/IPSL-CM6A-LR/historical/r30i1p1f1/SImon/sivols/gn/v20180803/sivols/sivols_SImon_IPSL-CM6A-LR_historical_r30i1p1f1_gn_185001-201412.nc,185001-201412 9 | 7,CMIP,NCAR,CESM2,historical,r1i1p1f1,Lmon,nbp,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2/historical/r1i1p1f1/Lmon/nbp/gn/v20190308/nbp_Lmon_CESM2_historical_r1i1p1f1_gn_185001-201412.nc,185001-201412 10 | 8,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r24i1p1f1,Omon,friver,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r24i1p1f1/Omon/friver/gn/v20190725/friver/friver_Omon_EC-Earth3_historical_r24i1p1f1_gn_198401-198412.nc,198401-198412 11 | 9,CMIP,BCC,BCC-ESM1,amip,r1i1p1f1,Amon,evspsbl,gn,/glade/collections/cmip/CMIP6/CMIP/BCC/BCC-ESM1/amip/r1i1p1f1/Amon/evspsbl/gn/v20190202/evspsbl/evspsbl_Amon_BCC-ESM1_amip_r1i1p1f1_gn_197901-201412.nc,197901-201412 12 | 10,CMIP,CCCma,CanESM5,piControl,r1i1p1f1,Omon,no3,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/piControl/r1i1p1f1/Omon/no3/gn/v20190429/no3/no3_Omon_CanESM5_piControl_r1i1p1f1_gn_604101-605012.nc,604101-605012 13 | 11,CMIP,NCAR,CESM2-WACCM,abrupt-4xCO2,r1i1p1f1,Eday,loaddust,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2-WACCM/abrupt-4xCO2/r1i1p1f1/Eday/loaddust/gn/v20190425/loaddust_Eday_CESM2-WACCM_abrupt-4xCO2_r1i1p1f1_gn_00700101-00791231.nc,00700101-00791231 14 | 12,CMIP,CNRM-CERFACS,CNRM-CM6-1,historical,r2i1p1f2,6hrPlev,hus,gr,/glade/collections/cmip/CMIP6/CMIP/CNRM-CERFACS/CNRM-CM6-1/historical/r2i1p1f2/6hrPlev/hus/gr/v20181126/hus/hus_6hrPlev_CNRM-CM6-1_historical_r2i1p1f2_gr_196001010300-196912312100.nc,196001010300-196912312100 15 | 13,CMIP,NCAR,CESM2-WACCM,historical,r3i1p1f1,Eday,loadso4,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2-WACCM/historical/r3i1p1f1/Eday/loadso4/gn/v20190227/loadso4_Eday_CESM2-WACCM_historical_r3i1p1f1_gn_19300101-19391231.nc,19300101-19391231 16 | 14,CMIP,AWI,AWI-CM-1-1-MR,piControl,r1i1p1f1,Amon,hur,gn,/glade/collections/cmip/CMIP6/CMIP/AWI/AWI-CM-1-1-MR/piControl/r1i1p1f1/Amon/hur/gn/v20181218/hur/hur_Amon_AWI-CM-1-1-MR_piControl_r1i1p1f1_gn_280401-280412.nc,280401-280412 17 | 15,CMIP,MOHC,UKESM1-0-LL,abrupt-4xCO2,r1i1p1f2,AERmon,mmroa,gn,/glade/collections/cmip/CMIP6/CMIP/MOHC/UKESM1-0-LL/abrupt-4xCO2/r1i1p1f2/AERmon/mmroa/gn/v20190406/mmroa/mmroa_AERmon_UKESM1-0-LL_abrupt-4xCO2_r1i1p1f2_gn_185001-189912.nc,185001-189912 18 | 16,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r24i1p1f1,Omon,soga,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r24i1p1f1/Omon/soga/gn/v20190411/soga/soga_Omon_EC-Earth3_historical_r24i1p1f1_gn_186701-186712.nc,186701-186712 19 | 17,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r11i1p1f1,Omon,ficeberg,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r11i1p1f1/Omon/ficeberg/gn/v20190710/ficeberg/ficeberg_Omon_EC-Earth3_historical_r11i1p1f1_gn_189701-189712.nc,189701-189712 20 | 18,CMIP,NOAA-GFDL,GFDL-CM4,piControl,r1i1p1f1,Omon,sob,gn,/glade/collections/cmip/CMIP6/CMIP/NOAA-GFDL/GFDL-CM4/piControl/r1i1p1f1/Omon/sob/gn/v20180701/sob/sob_Omon_GFDL-CM4_piControl_r1i1p1f1_gn_039101-041012.nc,039101-041012 21 | 19,CMIP,NASA-GISS,GISS-E2-1-G,amip,r5i1p3f1,Emon,sconcss,gn,/glade/collections/cmip/CMIP6/CMIP/NASA-GISS/GISS-E2-1-G/amip/r5i1p3f1/Emon/sconcss/gn/v20190522/sconcss/sconcss_Emon_GISS-E2-1-G_amip_r5i1p3f1_gn_185001-190012.nc,185001-190012 22 | 20,CMIP,CCCma,CanESM5,historical,r1i1p1f1,Amon,rsdt,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/historical/r1i1p1f1/Amon/rsdt/gn/v20190429/rsdt/rsdt_Amon_CanESM5_historical_r1i1p1f1_gn_185001-201412.nc,185001-201412 23 | 21,CMIP,NASA-GISS,GISS-E2-1-G,piControl,r1i1p1f1,CFmon,cltisccp,gn,/glade/collections/cmip/CMIP6/CMIP/NASA-GISS/GISS-E2-1-G/piControl/r1i1p1f1/CFmon/cltisccp/gn/v20180824/cltisccp/cltisccp_CFmon_GISS-E2-1-G_piControl_r1i1p1f1_gn_440101-445012.nc,440101-445012 24 | 22,PAMIP,NCAR,CESM2,pdSST-piArcSIC,r67i1p1f1,day,rlut,gn,/glade/collections/cmip/CMIP6/PAMIP/NCAR/CESM2/pdSST-piArcSIC/r67i1p1f1/day/rlut/gn/v20190528/rlut_day_CESM2_pdSST-piArcSIC_r67i1p1f1_gn_20000601-20010601.nc,20000601-20010601 25 | 23,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r2i1p1f1,Omon,so,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r2i1p1f1/Omon/so/gn/v20190408/so/so_Omon_EC-Earth3_historical_r2i1p1f1_gn_191201-191212.nc,191201-191212 26 | 24,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r15i1p1f1,Emon,ps,gr,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r15i1p1f1/Emon/ps/gr/v20190710/ps/ps_Emon_EC-Earth3_historical_r15i1p1f1_gr_194801-194812.nc,194801-194812 27 | 25,CMIP,NCAR,CESM2,abrupt-4xCO2,r1i1p1f1,SImon,sisnthick,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2/abrupt-4xCO2/r1i1p1f1/SImon/sisnthick/gn/v20190927/sisnthick_SImon_CESM2_abrupt-4xCO2_r1i1p1f1_gn_000101-015012.nc,000101-015012 28 | 26,CMIP,CCCma,CanESM5,historical,r19i1p1f1,Omon,so,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/historical/r19i1p1f1/Omon/so/gn/v20190429/so/so_Omon_CanESM5_historical_r19i1p1f1_gn_186101-187012.nc,186101-187012 29 | 27,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r2i1p1f1,Emon,orog,gr,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r2i1p1f1/Emon/orog/gr/v20190408/orog/orog_Emon_EC-Earth3_historical_r2i1p1f1_gr_200301-200312.nc,200301-200312 30 | 28,CMIP,SNU,SAM0-UNICON,1pctCO2,r1i1p1f1,Amon,tauv,gn,/glade/collections/cmip/CMIP6/CMIP/SNU/SAM0-UNICON/1pctCO2/r1i1p1f1/Amon/tauv/gn/v20190323/tauv/tauv_Amon_SAM0-UNICON_1pctCO2_r1i1p1f1_gn_194001-194912.nc,194001-194912 31 | 29,CMIP,NCAR,CESM2,abrupt-4xCO2,r1i1p1f1,Lmon,mrfso,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2/abrupt-4xCO2/r1i1p1f1/Lmon/mrfso/gn/v20190927/mrfso_Lmon_CESM2_abrupt-4xCO2_r1i1p1f1_gn_090001-094912.nc,090001-094912 32 | 30,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r24i1p1f1,Omon,tob,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r24i1p1f1/Omon/tob/gn/v20190411/tob/tob_Omon_EC-Earth3_historical_r24i1p1f1_gn_200001-200012.nc,200001-200012 33 | 31,CMIP,IPSL,IPSL-CM6A-LR,historical,r18i1p1f1,Amon,cli,gr,/glade/collections/cmip/CMIP6/CMIP/IPSL/IPSL-CM6A-LR/historical/r18i1p1f1/Amon/cli/gr/v20180803/cli/cli_Amon_IPSL-CM6A-LR_historical_r18i1p1f1_gr_185001-201412.nc,185001-201412 34 | 32,CMIP,NCAR,CESM2,esm-piControl,r1i1p1f1,Lmon,rh,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2/esm-piControl/r1i1p1f1/Lmon/rh/gn/v20190723/rh_Lmon_CESM2_esm-piControl_r1i1p1f1_gn_010101-015012.nc,010101-015012 35 | 33,CMIP,EC-Earth-Consortium,EC-Earth3-Veg,piControl,r1i1p1f1,Omon,masso,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3-Veg/piControl/r1i1p1f1/Omon/masso/gn/v20190619/masso/masso_Omon_EC-Earth3-Veg_piControl_r1i1p1f1_gn_190701-190712.nc,190701-190712 36 | 34,CMIP,NASA-GISS,GISS-E2-1-G,amip,r3i1p3f1,AERmon,mmrso4,gn,/glade/collections/cmip/CMIP6/CMIP/NASA-GISS/GISS-E2-1-G/amip/r3i1p3f1/AERmon/mmrso4/gn/v20190522/mmrso4/mmrso4_AERmon_GISS-E2-1-G_amip_r3i1p3f1_gn_200101-201412.nc,200101-201412 37 | 35,CMIP,EC-Earth-Consortium,EC-Earth3,historical,r24i1p1f1,Omon,tos,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3/historical/r24i1p1f1/Omon/tos/gn/v20190411/tos/tos_Omon_EC-Earth3_historical_r24i1p1f1_gn_193001-193012.nc,193001-193012 38 | 36,CMIP,IPSL,IPSL-CM6A-LR,historical,r30i1p1f1,Omon,wmo,gn,/glade/collections/cmip/CMIP6/CMIP/IPSL/IPSL-CM6A-LR/historical/r30i1p1f1/Omon/wmo/gn/v20180803/wmo/wmo_Omon_IPSL-CM6A-LR_historical_r30i1p1f1_gn_185001-194912.nc,185001-194912 39 | 37,CMIP,CCCma,CanESM5,historical,r6i1p1f1,Omon,chl,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/historical/r6i1p1f1/Omon/chl/gn/v20190429/chl/chl_Omon_CanESM5_historical_r6i1p1f1_gn_189101-190012.nc,189101-190012 40 | 38,CMIP,CCCma,CanESM5,historical,r7i1p1f1,Omon,hfds,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/historical/r7i1p1f1/Omon/hfds/gn/v20190306/hfds/hfds_Omon_CanESM5_historical_r7i1p1f1_gn_185001-201412.nc,185001-201412 41 | 39,CMIP,NCAR,CESM2-WACCM,piControl,r1i1p1f1,Eday,hus,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2-WACCM/piControl/r1i1p1f1/Eday/hus/gn/v20190320/hus_Eday_CESM2-WACCM_piControl_r1i1p1f1_gn_01800101-01891231.nc,01800101-01891231 42 | 40,CMIP,CCCma,CanESM5,piControl,r1i1p1f1,SImon,siconc,gn,/glade/collections/cmip/CMIP6/CMIP/CCCma/CanESM5/piControl/r1i1p1f1/SImon/siconc/gn/v20190429/siconc/siconc_SImon_CanESM5_piControl_r1i1p1f1_gn_540101-560012.nc,540101-560012 43 | 41,LS3MIP,NCAR,CESM2,land-hist-princeton,r1i1p1f1,LImon,tsn,gn,/glade/collections/cmip/CMIP6/LS3MIP/NCAR/CESM2/land-hist-princeton/r1i1p1f1/LImon/tsn/gn/v20190802/tsn_LImon_CESM2_land-hist-princeton_r1i1p1f1_gn_185001-189912.nc,185001-189912 44 | 42,CMIP,EC-Earth-Consortium,EC-Earth3-Veg,piControl,r1i1p1f1,SImon,sispeed,gn,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3-Veg/piControl/r1i1p1f1/SImon/sispeed/gn/v20190619/sispeed/sispeed_SImon_EC-Earth3-Veg_piControl_r1i1p1f1_gn_230501-230512.nc,230501-230512 45 | 43,CMIP,BCC,BCC-CSM2-MR,historical,r3i1p1f1,Amon,clivi,gn,/glade/collections/cmip/CMIP6/CMIP/BCC/BCC-CSM2-MR/historical/r3i1p1f1/Amon/clivi/gn/v20190311/clivi/clivi_Amon_BCC-CSM2-MR_historical_r3i1p1f1_gn_185001-201412.nc,185001-201412 46 | 44,CMIP,BCC,BCC-ESM1,1pctCO2,r1i1p1f1,Omon,uo,gn,/glade/collections/cmip/CMIP6/CMIP/BCC/BCC-ESM1/1pctCO2/r1i1p1f1/Omon/uo/gn/v20190611/uo/uo_Omon_BCC-ESM1_1pctCO2_r1i1p1f1_gn_198001-198912.nc,198001-198912 47 | 45,CMIP,EC-Earth-Consortium,EC-Earth3-Veg,historical,r1i1p1f1,Lmon,cVeg,gr,/glade/collections/cmip/CMIP6/CMIP/EC-Earth-Consortium/EC-Earth3-Veg/historical/r1i1p1f1/Lmon/cVeg/gr/v20190605/cVeg/cVeg_Lmon_EC-Earth3-Veg_historical_r1i1p1f1_gr_200601-200612.nc,200601-200612 48 | 46,CMIP,SNU,SAM0-UNICON,piControl,r1i1p1f1,Omon,tosga,gn,/glade/collections/cmip/CMIP6/CMIP/SNU/SAM0-UNICON/piControl/r1i1p1f1/Omon/tosga/gn/v20190323/tosga/tosga_Omon_SAM0-UNICON_piControl_r1i1p1f1_gn_044201-045112.nc,044201-045112 49 | 47,CMIP,NCAR,CESM2,1pctCO2,r1i1p1f1,ImonGre,mrroLi,gn,/glade/collections/cmip/CMIP6/CMIP/NCAR/CESM2/1pctCO2/r1i1p1f1/ImonGre/mrroLi/gn/v20190425/mrroLi_ImonGre_CESM2_1pctCO2_r1i1p1f1_gn_005101-010012.nc,005101-010012 50 | 48,PAMIP,NCAR,CESM2,pdSST-pdSIC,r77i1p1f1,Lmon,gpp,gn,/glade/collections/cmip/CMIP6/PAMIP/NCAR/CESM2/pdSST-pdSIC/r77i1p1f1/Lmon/gpp/gn/v20190430/gpp_Lmon_CESM2_pdSST-pdSIC_r77i1p1f1_gn_200006-200105.nc,200006-200105 51 | 49,CMIP,IPSL,IPSL-CM6A-LR,historical,r21i1p1f1,Omon,physios,gn,/glade/collections/cmip/CMIP6/CMIP/IPSL/IPSL-CM6A-LR/historical/r21i1p1f1/Omon/physios/gn/v20180803/physios/physios_Omon_IPSL-CM6A-LR_historical_r21i1p1f1_gn_185001-201412.nc,185001-201412 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /collection-spec/collection-spec.md: -------------------------------------------------------------------------------- 1 | # ESM Collection Specification 2 | 3 | - [ESM Collection Specification](#esm-collection-specification) 4 | - [Overview](#overview) 5 | - [Collection Specification](#collection-specification) 6 | - [Catalog](#catalog) 7 | - [Assets (Data Files)](#assets-data-files) 8 | - [Catalog fields](#catalog-fields) 9 | - [Attribute Object](#attribute-object) 10 | - [Assets Object](#assets-object) 11 | - [Aggregation Control Object](#aggregation-control-object) 12 | - [Aggregation Object](#aggregation-object) 13 | - [Examples](#examples) 14 | - [Python Validator](#python-validator) 15 | - [Installation](#installation) 16 | - [Usage](#usage) 17 | 18 | ## Overview 19 | 20 | This document explains the structure and content of an ESM Collection. 21 | A collection provides metadata about the catalog, telling us what we expect to find inside and how to open it. 22 | The collection is described is a single json file, inspired by the STAC spec. 23 | 24 | The ESM Collection specification consists of three parts: 25 | 26 | ### Collection Specification 27 | 28 | The _collection_ specification provides metadata about the catalog, telling us what we expect to find inside and how to open it. 29 | The descriptor is a single json file, inspired by the [STAC spec](https://github.com/radiantearth/stac-spec). 30 | 31 | ```json 32 | { 33 | "esmcat_version": "0.1.0", 34 | "id": "sample", 35 | "description": "This is a very basic sample ESM collection.", 36 | "catalog_file": "sample_catalog.csv", 37 | "attributes": [ 38 | { 39 | "column_name": "activity_id", 40 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_activity_id.json" 41 | }, 42 | { 43 | "column_name": "source_id", 44 | "vocabulary": "https://raw.githubusercontent.com/WCRP-CMIP/CMIP6_CVs/master/CMIP6_source_id.json" 45 | } 46 | ], 47 | "assets": { 48 | "column_name": "path", 49 | "format": "zarr" 50 | } 51 | } 52 | ``` 53 | 54 | ### Catalog 55 | 56 | The collection points to a single catalog. 57 | A catalog is a CSV file. 58 | The meaning of the columns in the csv file is defined by the parent collection. 59 | 60 | ```csv 61 | activity_id,source_id,path 62 | CMIP,ACCESS-CM2,gs://pangeo-data/store1.zarr 63 | CMIP,GISS-E2-1-G,gs://pangeo-data/store1.zarr 64 | ``` 65 | 66 | ### Assets (Data Files) 67 | 68 | The data assets can be either netCDF or Zarr. 69 | They should be either [URIs](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) or full filesystem paths. 70 | 71 | ## Catalog fields 72 | 73 | | Element | Type | Description | 74 | | ------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 75 | | esmcat_version | string | **REQUIRED.** The ESM Catalog version the collection implements. | 76 | | id | string | **REQUIRED.** Identifier for the collection. | 77 | | title | string | A short descriptive one-line title for the collection. | 78 | | description | string | **REQUIRED.** Detailed multi-line description to fully explain the collection. [CommonMark 0.28](http://commonmark.org/) syntax MAY be used for rich text representation. | 79 | | catalog_file | string | **REQUIRED.** Path to a the CSV file with the catalog contents. | 80 | | catalog_dict | array | If specified, it is mutually exclusive with `catalog_file`. An array of dictionaries that represents the data that would otherwise be in the csv. | 81 | | attributes | [[Attribute Object](#attribute-object)] | **REQUIRED.** A list of attribute columns in the data set. | 82 | | assets | [Assets Object](#assets-object) | **REQUIRED.** Description of how the assets (data files) are referenced in the CSV catalog file. | 83 | | aggregation_control | [Aggregation Control Object](#aggregation-control-object) | **OPTIONAL.** Description of how to support aggregation of multiple assets into a single xarray data set. | 84 | 85 | ### Attribute Object 86 | 87 | An attribute object describes a column in the catalog CSV file. 88 | The column names can optionally be associated with a controlled vocabulary, such as the [CMIP6 CVs](https://github.com/WCRP-CMIP/CMIP6_CVs), which explain how to interpret the attribute values. 89 | 90 | | Element | Type | Description | 91 | | ----------- | ------ | -------------------------------------------------------------------------------------- | 92 | | column_name | string | **REQUIRED.** The name of the attribute column. Must be in the header of the CSV file. | 93 | | vocabulary | string | Link to the controlled vocabulary for the attribute in the format of a URL. | 94 | 95 | ### Assets Object 96 | 97 | An assets object describes the columns in the CSV file relevant for opening the actual data files. 98 | 99 | | Element | Type | Description | 100 | | ------------------ | ------ | ---------------------------------------------------------------------------------------------------------------------------------- | 101 | | column_name | string | **REQUIRED.** The name of the column containing the path to the asset. Must be in the header of the CSV file. | 102 | | format | string | The data format. Valid values are `netcdf` and `zarr`. If specified, it means that all data in the catalog is the same type. | 103 | | format_column_name | string | The column name which contains the data format, allowing for variable data types in one catalog. Mutually exclusive with `format`. | 104 | 105 | ### Aggregation Control Object 106 | 107 | An aggregation control object defines neccessary information to use when aggregating multiple assets into a single xarray data set. 108 | 109 | | Element | Type | Description | 110 | | -------------------- | ------------------------------------------- | --------------------------------------------------------------------------------------- | 111 | | variable_column_name | string | **REQUIRED.** Name of the attribute column in csv file that contains the variable name. | 112 | | groupby_attrs | array | Column names (attributes) that define data sets that can be aggegrated. | 113 | | aggregations | [[Aggregation Object](#aggregation-object)] | **OPTIONAL.** List of aggregations to apply to query results | 114 | 115 | ### Aggregation Object 116 | 117 | An aggregation object describes types of operations done during the aggregation of multiple assets into a single xarray data set. 118 | 119 | | Element | Type | Description | 120 | | -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 121 | | type | string | **REQUIRED.** Type of aggregation operation to apply. Valid values include: `join_new`, `join_existing`, `union` | 122 | | attribute_name | string | Name of attribute (column) across which to aggregate. | 123 | | options | object | **OPTIONAL.** Aggregration settings that are passed as keywords arguments to [`xarray.concat()`](https://xarray.pydata.org/en/stable/generated/xarray.concat.html) or [`xarray.merge()`](https://xarray.pydata.org/en/stable/generated/xarray.merge.html#xarray.merge). For `join_existing`, it must contain the name of the existing dimension to use (for e.g.: something like `{'dim': 'time'}`). | 124 | 125 | ## Examples 126 | 127 | - **[examples/](examples/)** directory contains examples of esm collections. 128 | 129 | - **[intake-esm-datastore](https://github.com/NCAR/intake-esm-datastore/tree/master/catalogs)** repository contains another set of real world esm collections. 130 | 131 | ## Python Validator 132 | 133 | ### Installation 134 | 135 | The [Python validator for the esm-collection-spec](https://github.com/NCAR/esmcol-validator) can be installed in any of the following ways: 136 | 137 | Using Pip via PyPI: 138 | 139 | ```bash 140 | python -m pip install esmcol-validator 141 | ``` 142 | 143 | Using Conda: 144 | 145 | ```bash 146 | conda install -c conda-forge esmcol-validator 147 | ``` 148 | 149 | Or from the source repository: 150 | 151 | ```bash 152 | python -m pip install git+https://github.com/NCAR/esmcol-validator.git 153 | ``` 154 | 155 | ### Usage 156 | 157 | ```bash 158 | $ esmcol-validator --help 159 | Usage: esmcol-validator [OPTIONS] ESMCOL_FILE 160 | 161 | A utility that allows users to validate esm-collection json files against 162 | the esm-collection-spec. 163 | 164 | Options: 165 | --esmcol-spec-dirs TEXT 166 | --version TEXT [default: master] 167 | --verbose [default: False] 168 | --timer [default: False] 169 | --log-level TEXT [default: CRITICAL] 170 | --help Show this message and exit. 171 | ``` 172 | 173 | Example: 174 | 175 | ```bash 176 | $ esmcol-validator sample-pangeo-cmip6-collection.json 177 | {'collections': {'valid': 1, 'invalid': 0}, 'catalog_files': {'valid': 1, 'invalid': 0}, 'unknown': 0} 178 | { 179 | "collections": { 180 | "valid": 1, 181 | "invalid": 0 182 | }, 183 | "catalog_files": { 184 | "valid": 1, 185 | "invalid": 0 186 | }, 187 | "unknown": 0 188 | } 189 | ``` 190 | --------------------------------------------------------------------------------