esgf-qa 0.3.0__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/HISTORY.rst +30 -0
  2. esgf_qa-0.5.0/MANIFEST.in +21 -0
  3. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/PKG-INFO +47 -31
  4. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/README.md +45 -31
  5. esgf_qa-0.5.0/esgf_qa/_constants.py +93 -0
  6. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa/_version.py +3 -3
  7. esgf_qa-0.5.0/esgf_qa/cluster_results.py +467 -0
  8. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa/con_checks.py +209 -11
  9. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa/run_qa.py +356 -463
  10. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/PKG-INFO +47 -31
  11. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/SOURCES.txt +8 -3
  12. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/requires.txt +2 -0
  13. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/top_level.txt +2 -0
  14. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/pyproject.toml +15 -11
  15. esgf_qa-0.5.0/tests/test_cli.py +271 -0
  16. esgf_qa-0.5.0/tests/test_cluster_results.py +166 -0
  17. esgf_qa-0.5.0/tests/test_con_checks.py +263 -0
  18. esgf_qa-0.5.0/tests/test_qaviewer.py +147 -0
  19. esgf_qa-0.5.0/tests/test_run_dummy_qa.py +191 -0
  20. esgf_qa-0.5.0/tests/test_run_qa.py +181 -0
  21. esgf_qa-0.3.0/.gitignore +0 -13
  22. esgf_qa-0.3.0/MANIFEST.in +0 -7
  23. esgf_qa-0.3.0/docs/esgf-qa_Logo.png +0 -0
  24. esgf_qa-0.3.0/esgf_qa/_constants.py +0 -31
  25. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/LICENSE +0 -0
  26. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/display_qc_results.html +0 -0
  27. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa/__init__.py +0 -0
  28. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa/qaviewer.py +0 -0
  29. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/dependency_links.txt +0 -0
  30. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/esgf_qa.egg-info/entry_points.txt +0 -0
  31. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/fonts/Inter-Regular.woff2 +0 -0
  32. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/fonts/Inter-SemiBold.woff2 +0 -0
  33. {esgf_qa-0.3.0 → esgf_qa-0.5.0}/setup.cfg +0 -0
@@ -1,3 +1,33 @@
1
+ 0.5.0 (2026-02-06)
2
+ ------------------
3
+
4
+ New Features
5
+ ^^^^^^^^^^^^
6
+
7
+ * Allowing to limit the number of parallel processes with the ``-P <max_processes>`` command line parameter.
8
+ * Generally, any ``cc-plugin`` is now supported.
9
+ * Creation of dataset-ids now supports a variety of projects. The list can be updated if needed.
10
+ * Information on found files and organization into datasets now stored to disk rather than being output to stdout.
11
+
12
+ 0.4.0 (2025-11-05)
13
+ ------------------
14
+
15
+ New Features
16
+ ^^^^^^^^^^^^
17
+
18
+ * Allowing checker options to be specified via command line for all checkers.
19
+ * Improved support of ``cc-plugin-wcrp``: enabled inter-file/dataset consistency & continuity checks.
20
+
21
+ Bug Fixes
22
+ ^^^^^^^^^
23
+
24
+ * Time continuity check: No longer throwing exception on unsupported time coordinates.
25
+
26
+ Breaking Changes
27
+ ^^^^^^^^^^^^^^^^
28
+
29
+ * No longer allowing respecification of checkers and options when resuming QA run (commit 3d2e082d40aef7c512ce828b1e4600ef81176e37).
30
+
1
31
  0.3.0 (2025-10-17)
2
32
  ------------------
3
33
 
@@ -0,0 +1,21 @@
1
+ include LICENSE
2
+ include README.md
3
+
4
+ recursive-include tests *.py
5
+ recursive-include fonts *
6
+
7
+ global-exclude __pycache__ *.py[co]
8
+
9
+ # Exclude GitHub workflows and metadata
10
+ prune .github
11
+
12
+ # Exclude CI environment
13
+ prune ci
14
+
15
+ # Exclude documentation
16
+ prune docs
17
+
18
+ # Exclude project config files
19
+ exclude mkdocs.yml
20
+ exclude .pre-commit-config.yaml
21
+ exclude .gitignore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esgf-qa
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: QA based on compliance-checker
5
5
  Author-email: Martin Schupfner <schupfner@dkrz.de>
6
6
  Maintainer-email: Martin Schupfner <schupfner@dkrz.de>
@@ -21,6 +21,7 @@ Requires-Dist: cf_xarray
21
21
  Requires-Dist: compliance-checker>=5.3.0
22
22
  Requires-Dist: dask
23
23
  Requires-Dist: netCDF4
24
+ Requires-Dist: packaging
24
25
  Requires-Dist: pandas
25
26
  Requires-Dist: textual
26
27
  Requires-Dist: xarray
@@ -38,6 +39,7 @@ Requires-Dist: flake8-print; extra == "dev"
38
39
  Requires-Dist: pre-commit; extra == "dev"
39
40
  Requires-Dist: pytest>=7.0.0; extra == "dev"
40
41
  Requires-Dist: pytest-flake8; extra == "dev"
42
+ Requires-Dist: pytest-asyncio; extra == "dev"
41
43
  Requires-Dist: ruff>=0.1.0; extra == "dev"
42
44
  Requires-Dist: twine; extra == "dev"
43
45
  Requires-Dist: wheel; extra == "dev"
@@ -45,34 +47,36 @@ Dynamic: license-file
45
47
 
46
48
  [![PyPI version](https://img.shields.io/pypi/v/esgf-qa.svg)](https://pypi.org/project/esgf-qa/)
47
49
 
48
- # esgf-qa: Quality Assurance Workflow Based on `compliance-checker` and `cc-plugin-wcrp`
49
- <img src="docs/esgf-qa_Logo.png" align="left" width="120">
50
+ # esgf-qa
51
+ ### Quality Assurance Workflow Based on `compliance-checker` and `cc-plugin-wcrp` (or other cc-plugins)
52
+ <img src="https://raw.githubusercontent.com/ESGF/esgf-qa/master/docs/esgf-qa_Logo.png" align="left" width="120">
50
53
 
51
- `esgf-qa` makes use of the frameworks and [CF](https://cfconventions.org/)-compliance checks of the
52
- [ioos/compliance-checker](https://github.com/ioos/compliance-checker) and extensions coming with
54
+ `esgf-qa` provides a flexible quality assurance (QA) workflow for evaluating dataset compliance using the
55
+ [ioos/compliance-checker](https://github.com/ioos/compliance-checker) framework
56
+ (including [CF](https://cfconventions.org/) compliance checks)
57
+ and any community plugins (`cc-plugin`s), such as
53
58
  [ESGF/cc-plugin-wcrp](https://github.com/ESGF/cc-plugin-wcrp) and
54
59
  [euro-cordex/cc-plugin-cc6](https://github.com/euro-cordex/cc-plugin-cc6).
55
60
 
56
- This tool is designed to run the desired file-based QC tests with
57
- [ioos/compliance-checker](https://github.com/ioos/compliance-checker) and
58
- [euro-cordex/cc-plugin-wcrp](https://github.com/euro-cordex/cc-plugin-wcrp),
59
- to conduct additional dataset-based checks (such as time axis continuity and
60
- consistency checks) as well as to summarize the test results.
61
+ The tool executes file-based quality control (QC) tests through the Compliance Checker,
62
+ and, where applicable, performs additional dataset-level checks to test inter-file time-axis continuity
63
+ and consistency in variable, coordinate and attribute definitions.
64
+ Results from both file- and dataset-level checks are aggregated, summarized, and clustered for easier interpretation.
61
65
 
62
- `esgf-qa` is mainly aimed at a QA workflow testing compliance with various WCRP Project Specifications (see below).
63
- However, it is generally applicable to test for compliance with the CF conventions through application of the IOOS Compliance Checker,
64
- and it is easily extendable for any `cc-plugin` and for projects defining CORDEX or CMIP style CMOR-tables.
66
+ ### Currently supported checkers
67
+
68
+ While `esgf-qa` has been primarily developed for workflows assessing compliance with WCRP project data specifications
69
+ (e.g., CMIP, CORDEX), it can also be used for general CF-compliance testing and generally supports any
70
+ `cc-plugin`. It can be easily extended to support any projects following CORDEX- or CMIP-style CMOR table conventions.
65
71
 
66
72
  | Standard | Checker Name |
67
73
  | ---------------------------------------------------------------------------------------------------- | ------------ |
68
- | [cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv) | wcrp_cordex_cmip6, cc6 |
69
- | [cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables) | wcrp_cordex_cmip6, cc6 |
70
- | [CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069) | wcrp_cordex_cmip6, cc6 |
71
- | [CMIP6 DRS](https://wcrp-cmip.github.io/WGCM_Infrastructure_Panel/Papers/CMIP6_global_attributes_filenames_CVs_v6.2.7.pdf) | wcrp_cmip6 / plugin_cmip6 |
72
- | [cmip6-cmor-tables](https://github.com/PCMDI/cmip6-cmor-tables) (esgvoc) | wcrp_cmip6 / plugin_cmip6 |
73
- | [CMIP6 CVs](https://github.com/WCRP-CMIP/CMIP6_CVs) (esgvoc) | wcrp_cmip6 / plugin_cmip6 |
74
- | [EERIE CMOR Tables & CV](https://github.com/eerie-project/dreq_tools) | eerie |
75
- | Custom MIP | mip |
74
+ | [CF Conventions](https://cfconventions.org/) (shipped with [ioos/compliance-checker](https://github.com/ioos/compliance-checker)) | cf |
75
+ | [WCRP CMIP6](https://pcmdi.llnl.gov/CMIP6/):<br><ul><li>[CMIP6 DRS](https://wcrp-cmip.github.io/WGCM_Infrastructure_Panel/Papers/CMIP6_global_attributes_filenames_CVs_v6.2.7.pdf)</li><li>[CMIP6 CVs](https://github.com/WCRP-CMIP/CMIP6_CVs) (esgvoc)</li></li><li>[cmip6-cmor-tables](https://github.com/PCMDI/cmip6-cmor-tables) (esgvoc)</li></ul> | wcrp_cmip6 |
76
+ | [WCRP CORDEX-CMIP6](https://cordex.org/):<br><ul><li>[CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069)</li><li>[cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv) (esgvoc)</li><li>[cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables) (esgvoc)</li></ul> | wcrp_cordex_cmip6 |
77
+ | [WCRP CORDEX-CMIP6](https://cordex.org/):<br><ul><li>[CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069)</li><li>[cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv)</li><li>[cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables)</li></ul> | cc6 |
78
+ | [EERIE](https://eerie-project.eu/):<br>[EERIE CMOR Tables & CV](https://github.com/eerie-project/dreq_tools) | eerie |
79
+ | Custom MIP (CMOR/MIP tables have to be specified) | mip |
76
80
 
77
81
  ## Installation
78
82
 
@@ -109,35 +113,41 @@ esgvoc install
109
113
 
110
114
  - Test your installation
111
115
 
112
- The following command should now also list the `esgf-qc` checks next to all `cc_plugin_cc6` and `compliance_checker` checks:
116
+ The following command should now also list the `cc-plugin-wcrp` checks next to all `cc_plugin_cc6` and `compliance_checker` checks:
113
117
  ```
114
118
  cchecker.py -l
115
119
  ```
116
120
 
121
+ The following command should now list the necessary projects with metadata sources for `esgvoc`:
122
+ ```
123
+ esgvoc status
124
+ ```
125
+
117
126
  ## Usage
118
127
 
119
128
  ```shell
120
- $ esgqa [-h] [-o <OUTPUT_DIR>] [-t <TEST>] [-O OPTION] [-i <INFO>] [-r] [-C] <parent_dir>
129
+ $ esgqa [-h] [-P <parallel_processes>] [-o <OUTPUT_DIR>] [-t <TEST>] [-O OPTION] [-i <INFO>] [-r] [-C] <parent_dir>
121
130
  ```
122
131
 
123
132
  - positional arguments:
124
133
  - `parent_dir`: Parent directory to scan for netCDF-files to check
125
134
  - options:
126
135
  - `-h, --help`: show this help message and exit
136
+ - `-P, --parallel_processes`: Specify the maximum number of parallel processes. Default: 0 (= number of cores).
127
137
  - `-o, --output_dir OUTPUT_DIR`: Directory to store QA results. Needs to be non-existing or empty or from previous QA run. If not specified, will store results in `./cc-qa-check-results/YYYYMMDD-HHmm_<hash>`.
128
- - `-t, --test TEST`: The test to run ('wcrp_cmip6:latest', 'wcrp_cordex_cmip6':latest' or 'cf:<version>', can be specified multiple times, eg.: '-t wcrp_cmip6:latest -t cf:1.7') - default: running latest CF checks 'cf:latest'.
129
- - `-O, --option OPTION`: Additional options to be passed to the checkers. Format: '<checker>:<option_name>[:<option_value>]'. Multiple invocations possible.
138
+ - `-t, --test TEST`: The test to run (eg. `'wcrp_cmip6:latest'`, `'wcrp_cordex_cmip6:latest'` or `'cf:<version>'`, can be specified multiple times, eg.: `'-t wcrp_cmip6:latest -t cf:1.7'`) - default: running latest CF checks `'cf:latest'`. If the version is omitted, `latest` will be used.
139
+ - `-O, --option OPTION`: Additional options to be passed to the checkers. Format: `'<checker>:<option_name>[:<option_value>]'`. Multiple invocations possible.
130
140
  - `-i, --info INFO`: Information used to tag the QA results, eg. the simulation id to identify the checked run. Suggested is the original experiment-id you gave the run.
131
- - `-r, --resume`: Specify to continue a previous QC run. Requires the <output_dir> argument to be set.
141
+ - `-r, --resume`: Specify to continue a previous QC run. Requires the `<output_dir>` argument to be set.
132
142
  - `-C, --include_consistency_checks`: Include basic consistency and continuity checks. When using the `wcrp-*`, `cc6`, `mip` or `eerie` checkers, they are included by default.
133
143
 
134
144
  ### Example Usage
135
145
 
136
146
  ```shell
137
- $ esgqa -t wcrp_cordex_cmip6:latest -t cf:1.11 -o QA_results/IAEVALL02_2025-10-20 -i "IAEVALL02" ESGF_Buff/IAEVALL02/CORDEX-CMIP6
147
+ $ esgqa -P 8 -t wcrp_cordex_cmip6:latest -t cf:1.11 -o QA_results/IAEVALL02_2025-10-20 -i "IAEVALL02" ESGF_Buff/IAEVALL02/CORDEX-CMIP6
138
148
  ```
139
149
 
140
- To resume at a later date, eg. if the QA run did not finish in time or more files have been added to the <parent_dir>
150
+ To resume at a later date, eg. if the QA run did not finish in time or more files have been added to the `<parent_dir>`
141
151
  (note, that the last modification date of files is NOT taken into account - once a certain file path has been checked
142
152
  it will be marked as checked and checks will only be repeated if runtime errors occured):
143
153
 
@@ -148,7 +158,7 @@ $ esgqa -o QA_results/IAEVALL02_2025-10-20 -r
148
158
  For a custom MIP with defined CMOR tables (`"mip"` is not a placeholder but an actual basic checker of the `cc_plugin_cc6`):
149
159
 
150
160
  ```shell
151
- $ esgqa -o /path/to/test/results -t "mip:latest" -O "mip:tables:/path/to/mip_cmor_tables/Tables" /path/to/MIP/datasets/`
161
+ $ esgqa -o /path/to/test/results -t "mip:latest" -O "mip:tables:/path/to/mip_cmor_tables/Tables" /path/to/MIP/datasets/
152
162
  ```
153
163
 
154
164
  For CF checks and basic time and consistency / continuity checks:
@@ -164,8 +174,13 @@ The results will be stored in two `json` files:
164
174
 
165
175
  ### Web view
166
176
  The clustered results can be viewed using the following website:
167
- [https://cmiphub.dkrz.de/info/display_qc_results.html](https://cmiphub.dkrz.de/info/display_qc_results.html).
177
+
178
+ - DKRZ: [https://cmiphub.dkrz.de/info/display_qc_results.html](https://cmiphub.dkrz.de/info/display_qc_results.html).
179
+ - IPSL: coming soon
180
+
168
181
  This website runs entirely in the user's browser using JavaScript, without requiring interaction with a web server.
182
+ You can select one of the recent QA runs conducted at the respective site or select a local QA run result file to be displayed.
183
+
169
184
  Alternatively, you can open the included `display_qc_results.html` file directly in your browser.
170
185
  While the web view also supports the full (unclustered) results, it is recommended to not use the web view for files greater than a few MegaBytes.
171
186
 
@@ -188,8 +203,9 @@ in the GitLab Repository [qa-results](https://gitlab.dkrz.de/udag/qa-results). Y
188
203
 
189
204
  This project is licensed under the Apache License 2.0, and includes the Inter font, which is licensed under the SIL Open Font License 1.1. See the [LICENSE](./LICENSE) file for more details.
190
205
 
206
+
191
207
  > [!NOTE]
192
- > **This project was originally developed by [DKRZ](https://www.dkrz.de)** under the name **cc-qa** (see [DKRZ GitLab](https://gitlab.dkrz.de/udag/cc-qa)), with funding from the German Ministry of Research, Technology and Space ([BMFTR](https://www.bmftr.bund.de/en), reference `01LP2326E`).
208
+ > **This project was originally developed by [DKRZ](https://www.dkrz.de)** under the name **cc-qa** (see [DKRZ GitLab](https://gitlab.dkrz.de/udag/cc-qa)), with funding from the _German Ministry of Research, Technology and Space_ ([BMFTR](https://www.bmftr.bund.de/en), reference `01LP2326E`).
193
209
  > It has since been renamed to **esgf-qa** and is now maintained under the **Earth System Grid Federation (ESGF)** organization on GitHub.
194
210
  >
195
211
  > If you previously used `cc-qa`, please update your installations as described above.
@@ -1,33 +1,35 @@
1
1
  [![PyPI version](https://img.shields.io/pypi/v/esgf-qa.svg)](https://pypi.org/project/esgf-qa/)
2
2
 
3
- # esgf-qa: Quality Assurance Workflow Based on `compliance-checker` and `cc-plugin-wcrp`
4
- <img src="docs/esgf-qa_Logo.png" align="left" width="120">
5
-
6
- `esgf-qa` makes use of the frameworks and [CF](https://cfconventions.org/)-compliance checks of the
7
- [ioos/compliance-checker](https://github.com/ioos/compliance-checker) and extensions coming with
3
+ # esgf-qa
4
+ ### Quality Assurance Workflow Based on `compliance-checker` and `cc-plugin-wcrp` (or other cc-plugins)
5
+ <img src="https://raw.githubusercontent.com/ESGF/esgf-qa/master/docs/esgf-qa_Logo.png" align="left" width="120">
6
+
7
+ `esgf-qa` provides a flexible quality assurance (QA) workflow for evaluating dataset compliance using the
8
+ [ioos/compliance-checker](https://github.com/ioos/compliance-checker) framework
9
+ (including [CF](https://cfconventions.org/) compliance checks)
10
+ and any community plugins (`cc-plugin`s), such as
8
11
  [ESGF/cc-plugin-wcrp](https://github.com/ESGF/cc-plugin-wcrp) and
9
12
  [euro-cordex/cc-plugin-cc6](https://github.com/euro-cordex/cc-plugin-cc6).
10
13
 
11
- This tool is designed to run the desired file-based QC tests with
12
- [ioos/compliance-checker](https://github.com/ioos/compliance-checker) and
13
- [euro-cordex/cc-plugin-wcrp](https://github.com/euro-cordex/cc-plugin-wcrp),
14
- to conduct additional dataset-based checks (such as time axis continuity and
15
- consistency checks) as well as to summarize the test results.
14
+ The tool executes file-based quality control (QC) tests through the Compliance Checker,
15
+ and, where applicable, performs additional dataset-level checks to test inter-file time-axis continuity
16
+ and consistency in variable, coordinate and attribute definitions.
17
+ Results from both file- and dataset-level checks are aggregated, summarized, and clustered for easier interpretation.
18
+
19
+ ### Currently supported checkers
16
20
 
17
- `esgf-qa` is mainly aimed at a QA workflow testing compliance with various WCRP Project Specifications (see below).
18
- However, it is generally applicable to test for compliance with the CF conventions through application of the IOOS Compliance Checker,
19
- and it is easily extendable for any `cc-plugin` and for projects defining CORDEX or CMIP style CMOR-tables.
21
+ While `esgf-qa` has been primarily developed for workflows assessing compliance with WCRP project data specifications
22
+ (e.g., CMIP, CORDEX), it can also be used for general CF-compliance testing and generally supports any
23
+ `cc-plugin`. It can be easily extended to support any projects following CORDEX- or CMIP-style CMOR table conventions.
20
24
 
21
25
  | Standard | Checker Name |
22
26
  | ---------------------------------------------------------------------------------------------------- | ------------ |
23
- | [cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv) | wcrp_cordex_cmip6, cc6 |
24
- | [cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables) | wcrp_cordex_cmip6, cc6 |
25
- | [CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069) | wcrp_cordex_cmip6, cc6 |
26
- | [CMIP6 DRS](https://wcrp-cmip.github.io/WGCM_Infrastructure_Panel/Papers/CMIP6_global_attributes_filenames_CVs_v6.2.7.pdf) | wcrp_cmip6 / plugin_cmip6 |
27
- | [cmip6-cmor-tables](https://github.com/PCMDI/cmip6-cmor-tables) (esgvoc) | wcrp_cmip6 / plugin_cmip6 |
28
- | [CMIP6 CVs](https://github.com/WCRP-CMIP/CMIP6_CVs) (esgvoc) | wcrp_cmip6 / plugin_cmip6 |
29
- | [EERIE CMOR Tables & CV](https://github.com/eerie-project/dreq_tools) | eerie |
30
- | Custom MIP | mip |
27
+ | [CF Conventions](https://cfconventions.org/) (shipped with [ioos/compliance-checker](https://github.com/ioos/compliance-checker)) | cf |
28
+ | [WCRP CMIP6](https://pcmdi.llnl.gov/CMIP6/):<br><ul><li>[CMIP6 DRS](https://wcrp-cmip.github.io/WGCM_Infrastructure_Panel/Papers/CMIP6_global_attributes_filenames_CVs_v6.2.7.pdf)</li><li>[CMIP6 CVs](https://github.com/WCRP-CMIP/CMIP6_CVs) (esgvoc)</li></li><li>[cmip6-cmor-tables](https://github.com/PCMDI/cmip6-cmor-tables) (esgvoc)</li></ul> | wcrp_cmip6 |
29
+ | [WCRP CORDEX-CMIP6](https://cordex.org/):<br><ul><li>[CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069)</li><li>[cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv) (esgvoc)</li><li>[cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables) (esgvoc)</li></ul> | wcrp_cordex_cmip6 |
30
+ | [WCRP CORDEX-CMIP6](https://cordex.org/):<br><ul><li>[CORDEX-CMIP6 Archive Specifications](https://doi.org/10.5281/zenodo.10961069)</li><li>[cordex-cmip6-cv](https://github.com/WCRP-CORDEX/cordex-cmip6-cv)</li><li>[cordex-cmip6-cmor-tables](https://github.com/WCRP-CORDEX/cordex-cmip6-cmor-tables)</li></ul> | cc6 |
31
+ | [EERIE](https://eerie-project.eu/):<br>[EERIE CMOR Tables & CV](https://github.com/eerie-project/dreq_tools) | eerie |
32
+ | Custom MIP (CMOR/MIP tables have to be specified) | mip |
31
33
 
32
34
  ## Installation
33
35
 
@@ -64,35 +66,41 @@ esgvoc install
64
66
 
65
67
  - Test your installation
66
68
 
67
- The following command should now also list the `esgf-qc` checks next to all `cc_plugin_cc6` and `compliance_checker` checks:
69
+ The following command should now also list the `cc-plugin-wcrp` checks next to all `cc_plugin_cc6` and `compliance_checker` checks:
68
70
  ```
69
71
  cchecker.py -l
70
72
  ```
71
73
 
74
+ The following command should now list the necessary projects with metadata sources for `esgvoc`:
75
+ ```
76
+ esgvoc status
77
+ ```
78
+
72
79
  ## Usage
73
80
 
74
81
  ```shell
75
- $ esgqa [-h] [-o <OUTPUT_DIR>] [-t <TEST>] [-O OPTION] [-i <INFO>] [-r] [-C] <parent_dir>
82
+ $ esgqa [-h] [-P <parallel_processes>] [-o <OUTPUT_DIR>] [-t <TEST>] [-O OPTION] [-i <INFO>] [-r] [-C] <parent_dir>
76
83
  ```
77
84
 
78
85
  - positional arguments:
79
86
  - `parent_dir`: Parent directory to scan for netCDF-files to check
80
87
  - options:
81
88
  - `-h, --help`: show this help message and exit
89
+ - `-P, --parallel_processes`: Specify the maximum number of parallel processes. Default: 0 (= number of cores).
82
90
  - `-o, --output_dir OUTPUT_DIR`: Directory to store QA results. Needs to be non-existing or empty or from previous QA run. If not specified, will store results in `./cc-qa-check-results/YYYYMMDD-HHmm_<hash>`.
83
- - `-t, --test TEST`: The test to run ('wcrp_cmip6:latest', 'wcrp_cordex_cmip6':latest' or 'cf:<version>', can be specified multiple times, eg.: '-t wcrp_cmip6:latest -t cf:1.7') - default: running latest CF checks 'cf:latest'.
84
- - `-O, --option OPTION`: Additional options to be passed to the checkers. Format: '<checker>:<option_name>[:<option_value>]'. Multiple invocations possible.
91
+ - `-t, --test TEST`: The test to run (eg. `'wcrp_cmip6:latest'`, `'wcrp_cordex_cmip6:latest'` or `'cf:<version>'`, can be specified multiple times, eg.: `'-t wcrp_cmip6:latest -t cf:1.7'`) - default: running latest CF checks `'cf:latest'`. If the version is omitted, `latest` will be used.
92
+ - `-O, --option OPTION`: Additional options to be passed to the checkers. Format: `'<checker>:<option_name>[:<option_value>]'`. Multiple invocations possible.
85
93
  - `-i, --info INFO`: Information used to tag the QA results, eg. the simulation id to identify the checked run. Suggested is the original experiment-id you gave the run.
86
- - `-r, --resume`: Specify to continue a previous QC run. Requires the <output_dir> argument to be set.
94
+ - `-r, --resume`: Specify to continue a previous QC run. Requires the `<output_dir>` argument to be set.
87
95
  - `-C, --include_consistency_checks`: Include basic consistency and continuity checks. When using the `wcrp-*`, `cc6`, `mip` or `eerie` checkers, they are included by default.
88
96
 
89
97
  ### Example Usage
90
98
 
91
99
  ```shell
92
- $ esgqa -t wcrp_cordex_cmip6:latest -t cf:1.11 -o QA_results/IAEVALL02_2025-10-20 -i "IAEVALL02" ESGF_Buff/IAEVALL02/CORDEX-CMIP6
100
+ $ esgqa -P 8 -t wcrp_cordex_cmip6:latest -t cf:1.11 -o QA_results/IAEVALL02_2025-10-20 -i "IAEVALL02" ESGF_Buff/IAEVALL02/CORDEX-CMIP6
93
101
  ```
94
102
 
95
- To resume at a later date, eg. if the QA run did not finish in time or more files have been added to the <parent_dir>
103
+ To resume at a later date, eg. if the QA run did not finish in time or more files have been added to the `<parent_dir>`
96
104
  (note, that the last modification date of files is NOT taken into account - once a certain file path has been checked
97
105
  it will be marked as checked and checks will only be repeated if runtime errors occured):
98
106
 
@@ -103,7 +111,7 @@ $ esgqa -o QA_results/IAEVALL02_2025-10-20 -r
103
111
  For a custom MIP with defined CMOR tables (`"mip"` is not a placeholder but an actual basic checker of the `cc_plugin_cc6`):
104
112
 
105
113
  ```shell
106
- $ esgqa -o /path/to/test/results -t "mip:latest" -O "mip:tables:/path/to/mip_cmor_tables/Tables" /path/to/MIP/datasets/`
114
+ $ esgqa -o /path/to/test/results -t "mip:latest" -O "mip:tables:/path/to/mip_cmor_tables/Tables" /path/to/MIP/datasets/
107
115
  ```
108
116
 
109
117
  For CF checks and basic time and consistency / continuity checks:
@@ -119,8 +127,13 @@ The results will be stored in two `json` files:
119
127
 
120
128
  ### Web view
121
129
  The clustered results can be viewed using the following website:
122
- [https://cmiphub.dkrz.de/info/display_qc_results.html](https://cmiphub.dkrz.de/info/display_qc_results.html).
130
+
131
+ - DKRZ: [https://cmiphub.dkrz.de/info/display_qc_results.html](https://cmiphub.dkrz.de/info/display_qc_results.html).
132
+ - IPSL: coming soon
133
+
123
134
  This website runs entirely in the user's browser using JavaScript, without requiring interaction with a web server.
135
+ You can select one of the recent QA runs conducted at the respective site or select a local QA run result file to be displayed.
136
+
124
137
  Alternatively, you can open the included `display_qc_results.html` file directly in your browser.
125
138
  While the web view also supports the full (unclustered) results, it is recommended to not use the web view for files greater than a few MegaBytes.
126
139
 
@@ -143,8 +156,9 @@ in the GitLab Repository [qa-results](https://gitlab.dkrz.de/udag/qa-results). Y
143
156
 
144
157
  This project is licensed under the Apache License 2.0, and includes the Inter font, which is licensed under the SIL Open Font License 1.1. See the [LICENSE](./LICENSE) file for more details.
145
158
 
159
+
146
160
  > [!NOTE]
147
- > **This project was originally developed by [DKRZ](https://www.dkrz.de)** under the name **cc-qa** (see [DKRZ GitLab](https://gitlab.dkrz.de/udag/cc-qa)), with funding from the German Ministry of Research, Technology and Space ([BMFTR](https://www.bmftr.bund.de/en), reference `01LP2326E`).
161
+ > **This project was originally developed by [DKRZ](https://www.dkrz.de)** under the name **cc-qa** (see [DKRZ GitLab](https://gitlab.dkrz.de/udag/cc-qa)), with funding from the _German Ministry of Research, Technology and Space_ ([BMFTR](https://www.bmftr.bund.de/en), reference `01LP2326E`).
148
162
  > It has since been renamed to **esgf-qa** and is now maintained under the **Earth System Grid Federation (ESGF)** organization on GitHub.
149
163
  >
150
164
  > If you previously used `cc-qa`, please update your installations as described above.
@@ -0,0 +1,93 @@
1
+ from datetime import timedelta
2
+
3
+ # Mapping of checker names to project names for better readability
4
+ checker_dict = {
5
+ "cc6": "CORDEX-CMIP6",
6
+ "cf": "CF-Conventions",
7
+ "mip": "MIP",
8
+ # "wcrp-cmip5": "CMIP5",
9
+ "wcrp_cmip6": "CMIP6",
10
+ # "wcrp_cmip7aft: "CMIP7-AFT",
11
+ "wcrp_cmip7": "CMIP7",
12
+ # "wcrp_cordex": "CORDEX",
13
+ "wcrp_cordex_cmip6": "CORDEX-CMIP6",
14
+ # "obs4mips": "Obs4MIPs",
15
+ # "input4mips": "Input4MIPs",
16
+ }
17
+ checker_dict_ext = {
18
+ # "pcons": "ParentConsistency"
19
+ "cons": "Consistency",
20
+ "cont": "Continuity",
21
+ "comp": "Compatibility",
22
+ **checker_dict,
23
+ }
24
+ checker_release_versions = {}
25
+
26
+ # Checkers for which consistency checks should be run
27
+ checker_supporting_consistency_checks = [
28
+ "wcrp_cmip7",
29
+ "wcrp_cmip6",
30
+ "wcrp_cordex_cmip6",
31
+ "cc6",
32
+ "mip",
33
+ ]
34
+
35
+ # DRS parent directory names (for identifying project root and building dataset id)
36
+ supported_project_ids = [
37
+ "cmip7",
38
+ "cmip6plus",
39
+ "cmip6",
40
+ "cmip5",
41
+ "cordex",
42
+ "cordex-cmip6",
43
+ "cordex-fpsconv",
44
+ "obs4mips",
45
+ "input4mips",
46
+ "c3scordex",
47
+ "c3scmip5",
48
+ "c3scmip6",
49
+ "c3s-ipcc-ar6-atlas",
50
+ "c3satlas",
51
+ "c3s-cica-atlas",
52
+ "c3satlas_v1",
53
+ "c3s-atlas-dataset",
54
+ "c3satlas_v2",
55
+ "eerie",
56
+ "happi",
57
+ "cosmo-rea",
58
+ ]
59
+
60
+ # Definition of maximum permitted deviations from the given frequency
61
+ deltdic = {}
62
+ deltdic["monmax"] = timedelta(days=31.01).total_seconds()
63
+ deltdic["monmin"] = timedelta(days=27.99).total_seconds()
64
+ deltdic["mon"] = timedelta(days=31).total_seconds()
65
+ deltdic["daymax"] = timedelta(days=1.01).total_seconds()
66
+ deltdic["daymin"] = timedelta(days=0.99).total_seconds()
67
+ deltdic["day"] = timedelta(days=1).total_seconds()
68
+ deltdic["1hrmin"] = timedelta(hours=0.99).total_seconds()
69
+ deltdic["1hrmax"] = timedelta(hours=1.01).total_seconds()
70
+ deltdic["1hr"] = timedelta(hours=1).total_seconds()
71
+ deltdic["3hrmin"] = timedelta(hours=2.99).total_seconds()
72
+ deltdic["3hrmax"] = timedelta(hours=3.01).total_seconds()
73
+ deltdic["3hr"] = timedelta(hours=3).total_seconds()
74
+ deltdic["6hrmin"] = timedelta(hours=5.99).total_seconds()
75
+ deltdic["6hrmax"] = timedelta(hours=6.01).total_seconds()
76
+ deltdic["6hr"] = timedelta(hours=6).total_seconds()
77
+ deltdic["yrmax"] = timedelta(days=366.01).total_seconds()
78
+ deltdic["yrmin"] = timedelta(days=359.99).total_seconds()
79
+ deltdic["yr"] = timedelta(days=360).total_seconds()
80
+ deltdic["subhr"] = timedelta(seconds=600).total_seconds()
81
+ deltdic["subhrmax"] = timedelta(seconds=601).total_seconds()
82
+ deltdic["subhrmin"] = timedelta(seconds=599).total_seconds()
83
+ deltdic["dec"] = timedelta(days=3600).total_seconds()
84
+ deltdic["decmax"] = timedelta(days=3599.99).total_seconds()
85
+ deltdic["decmin"] = timedelta(days=3660.01).total_seconds()
86
+ deltdic["cen"] = timedelta(days=36000).total_seconds()
87
+ deltdic["cenmax"] = timedelta(days=35999.99).total_seconds()
88
+ deltdic["cenmin"] = timedelta(days=36600.01).total_seconds()
89
+ # CMIP-style frequencies for "time: point":
90
+ for l_freq in ["subhr", "1hr", "3hr", "6hr", "day", "mon", "yr"]:
91
+ deltdic[l_freq + "Pt"] = deltdic[l_freq]
92
+ deltdic[l_freq + "Ptmax"] = deltdic[l_freq + "max"]
93
+ deltdic[l_freq + "Ptmin"] = deltdic[l_freq + "min"]
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.3.0'
32
- __version_tuple__ = version_tuple = (0, 3, 0)
31
+ __version__ = version = '0.5.0'
32
+ __version_tuple__ = version_tuple = (0, 5, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g82bd8eb5f'
34
+ __commit_id__ = commit_id = 'g2b7e7f7fe'