# C3S-512 CDS Data Checker The main function of this Gitlab Project is to join all the efforts done in the data evaluation of the **C**limate **D**ata **S**tore (**CDS**).
The following software is designed to work both with **GRIB** and **NetCDF** files and perform the following data checks:
* Standard compliance and file format * Spatial/Temporal completeness and consistency * Observed/Plausible data ranges ## Dependencies and libraries In order to run, the data checker requires binaries and libraries: ```bash eccodes - version 2.16.0 or higher https://confluence.ecmwf.int/display/ECC/ecCodes+installation cdo - version 1.9.8 or higher https://code.mpimet.mpg.de/projects/cdo/files ``` **Note**: This packages might exist in your apt / yum package repository. It is prefered to use a conda environment
**Please use the versions specified** ## Install & Run ```bash # Create virtual environment conda create -y -n dqc python=3 conda activate dqc conda install -c conda-forge eccodes conda install -c conda-forge cdo # Get code git clone https://earth.bsc.es/gitlab/external/c3s512-wp1-datachecker.git cd c3s512-wp1-datachecker # Install requirements pip install -r requirements.txt pip install . # Run cd dqc_checker python checker.py ``` **Note**: In the following section you will find information on how to write your own **config_file**. ## Configure ```bash - In order to run the checker you must write a simple config (ConfigParser ini format) - There is a general section where general path options are specified - There is a dataset section where dataset dependant information shall be specified - Each config section represents a check/test (ex: file_format or temporal_completeness) - Each config section might have specific parameters related to the specific check (see example below) ``` **Note 1**: Config examples for **ALL** available checks can be found in the **dqc_wrapper/conf** folder.

**Note 2**: The following config checks for temporal consistency. Multiple checks can be stacked in one file. ```` [general] input = /data/dqc_test_data/seasonal/seasonal-monthly-single-levels/2m_temperature fpattern = ecmwf-5_fcmean*.grib log_dir = /my/log/directory res_dir = /my/output/directory forms_dir = /data/cds-forms-c3s [dataset] variable = t2m datatype = fcmean cds_dataset = seasonal-monthly-single-levels cds_variable = 2m_temperature ```` ## Config options (detailed) The **config** is defined in the .ini format compatible with the python ConfigParser package.

Each section represents an independent data **check**. The following example is for **ALL** available tests:

```` [general]: # Directory or file to be checked. input = /data/dqc_test_data/seasonal/seasonal-monthly-single-levels/2m_temperature # If a directory is provided the pattern can be used to filter the files. Can be empty, then every file is taken fpattern = ecmwf-5*.grib # Directory where DQC logs are stored log_dir = /tmp/dqc_logs # Directory where DQC test results are stored (will be created if it does not exist) res_dir = /tmp/dqc_res # Directory with constraints.json per every cds dataset (a.k.a c3s-cds-forms) forms_dir = /data/cds-forms-c3s [dataset] # Variable to analyze (if grib, see grib_dump command, look for cfVarName) **OPTIONAL** variable = t2m # Data type to analyze (if grib, see grib_ls command) **OPTIONAL** datatype = fcmean # Dataset (as available in c3s catalogue form) cds_dataset = seasonal-monthly-single-levels # Variable (form variable) cds_variable = 2m_temperature [file_format]: # No parameters required [standard_compliance]: # No parameters required [spatial_completeness]: # Land/Sea mask if available mask_file = # Variable name within the mask grib file (default is lsm) mask_var = [temporal_completeness] # Origin (for seasonal products, otherwise optional) origin = ecmwf # System (for seasonal products, otherwise optional) system = 5 # Flag indicating if dataset is seasonal (monthly, daily) is_seasonal = [spatial_consistency]: # Resolution of the grid (positive value), typically xinc grid_interval = 1 # Type of Grid (gaussian, lonlat, ...) grid_type = lonlat [temporal_consistency]: # Time step, positive integer value time_step = 1 # Time unit (Hour, Day, Month, Year) or (h,d,m,y) time_granularity = month [valid_ranges] # In case the valid minimum for the data is known (Otherwise, thresholds are set statistically) valid_min = # In case the valid maximum for the data is known (Otherwise, thresholds are set statistically) valid_max = ```` ## Result Each test run produces a result inside the **res_dir** specified in the **general** section.

The result zip file contains a PDF report for each of the tests launched.

The section _result contains (ok/err) indicating sucess and a short message and log location.

```` [spatial_consistency] grid_interval = 0.25 grid_type = lonlat [spatial_consistency_result] res = ok msg = Files are spatially consistent ```` ## Recent updates You can find an updated LOG to track new major modifications here:
* [UPDATE LOG](UPDATE_LOG.md)