!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!
!!! CSO - CAMS Satellite Operator
!!!
!!! Settings for S5p/NO2 processing.
!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


!-----------------------------------------------------------------------
! user specific settings:
!-----------------------------------------------------------------------

! include user specfic settings:
#include cso-user-settings.rc


!======================================================================
!===
!=== Inquire
!===
!======================================================================


!-----------------------------------------------------------------------
! inquire SciHub portal
!-----------------------------------------------------------------------

! Obtain names of all available S5p files.
! Stored as csv with processing type, processor version, filenames, etc.

! inquire full time range:
cso.s5p.no2.inquire-table-scihub.timerange.start        :  ${my.full-timerange.start}
cso.s5p.no2.inquire-table-scihub.timerange.end          :  ${my.full-timerange.end}

!
! server url ; 
! provide login/password in ~/.netrc:
!
!   machine s5phub.copernicus.eu      login s5pguest        password s5pguest
!
cso.s5p.no2.inquire-table-scihub.url                    :  https://s5phub.copernicus.eu/dhus

! target area;
!!~ empty for no limitation:
!cso.s5p.no2.inquire-table-scihub.area                   :  
!~ domain specified as:  west,south:east,north
cso.s5p.no2.inquire-table-scihub.area                   :  ${my.region.west},${my.region.south}:${my.region.east},${my.region.north}

! search query, obtained from interactive download:
!
!   platformname     : Sentinel-5
!   producttype      : L2__NO2___ | L2__CO____    (always 10 characters!)
!   processinglevel  : L2
!
cso.s5p.no2.inquire-table-scihub.query                  :     platformname:Sentinel-5    AND \
                                                                producttype:L2__NO2___    AND \
                                                            processinglevel:L2

! output table, date of today:
cso.s5p.no2.inquire-table-scihub.output.file            :  ${my.work}/Copernicus-inquire/Copernicus_S5p_NO2_scihub__%Y-%m-%d.csv


!!-----------------------------------------------------------------------
!! inquire PAL portal
!!-----------------------------------------------------------------------
!
!! Obtain names of all available S5p files.
!! Stored as csv with processing type, processor version, filenames, etc.
!
!! inquire full time range:
!cso.s5p.no2.inquire-table-pal.timerange.start        :  ${my.full-timerange.start}
!cso.s5p.no2.inquire-table-pal.timerange.end          :  ${my.full-timerange.end}
!
!! server url:
!cso.s5p.no2.inquire-table-pal.url                    :  https://data-portal.s5p-pal.com/cat/sentinel-5p/catalog.json
!
!! product type (always 10 characters!):
!cso.s5p.no2.inquire-table-pal.producttype            :  L2__NO2___
!                                                                
!! target area;
!!!~ empty for no limitation:
!!cso.s5p.no2.inquire-table-pal.area                   :  
!!~ domain specified as:  west,south:east,north
!cso.s5p.no2.inquire-table-pal.area                   :  ${my.region.west},${my.region.south}:${my.region.east},${my.region.north}
!
!! output table, date of today:
!cso.s5p.no2.inquire-table-pal.output.file            :  ${my.work}/Copernicus-inquire/Copernicus_S5p_NO2_pal_%Y-%m-%d.csv


!-----------------------------------------------------------
! overview plot of versions
!-----------------------------------------------------------

! renew existing plots?
cso.s5p.no2.inquire-plot.renew                    :  True

! listing files:
cso.s5p.no2.inquire-plot.file                     :  ${cso.s5p.no2.inquire-table-scihub.output.file}
!!~ specify dates ("yyyy-mm-dd") to use historic tables,
!!  default is table of today:
!cso.s5p.no2.inquire-plot.filedate                 :  2023-08-07

! annote:
cso.s5p.no2.inquire-plot.title                    :  S5p/NO2 %Y-%m-%d

! output figure, date of today:
cso.s5p.no2.inquire-plot.output.file              :  ${my.work}/Copernicus-inquire/Copernicus_S5p_NO2_scihub__%Y-%m-%d.png


!======================================================================
!===
!=== convert (and download)
!===
!======================================================================


! renew existing files (True|False) ?
cso.s5p.no2.convert.renew                  :  True
!cso.s5p.no2.convert.renew                  :  False

! time range:
cso.s5p.no2.convert.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.convert.timerange.end          :  ${my.timerange.end}


!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! input files
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

! listing of available source files,
! created by 'inquire-scihub' job:
cso.s5p.no2.convert.inquire.file                   :  ${my.work}/Copernicus-inquire/Copernicus_S5p_NO2_scihub__%Y-%m-%d.csv
!!~ historic inquire ...
!cso.s5p.no2.convert.inquire.filedate               :  ${cso.s5p.no2.inquire-plot.filedate}

! selection keyword:
my.s5p.no2.selection                                :  C03

! Provide ';' seperated list of to decide if a particular orbit file should be processed.
! If more than one file is available for a particular orbit (from "OFFL" and "RPRO" processing),
! the file with the first match will be used.
! The expressions should include templates '%{header}' for the column values.
! Example to select files from collection '03', preferably from processing 'RPRO' but otherwise from 'OFFL':
!   (%{collection} == '03') and (%{processing} == 'RPRO') ; \
!   (%{collection} == '03') and (%{processing} == 'OFFL')
!
#if "${my.s5p.no2.selection}" == "C03"
cso.s5p.no2.convert.selection                     :  (%{collection} == '03') and (%{processing} == 'RPRO') ; \
                                                     (%{collection} == '03') and (%{processing} == 'OFFL')
#else
#error unsupported my.s5p.no2.selection "${my.s5p.no2.selection}"
#endif

! input directory;
! files are searched here or downloaded to if not present yet;
! supported templates:
!   %{processing}
cso.s5p.no2.convert.input.dir                      :  ${my.work}/Copernicus/S5P/%{processing}/NO2/%Y/%m

! remove downloaded input files after convert?
cso.s5p.no2.convert.downloads.cleanup              :  False

! selection names:
cso.s5p.no2.convert.filters                        :  lons lats valid quality
!~ optionally also:
!    cloud_fraction

! filter settings:
cso.s5p.no2.convert.filter.lons.var                :  PRODUCT/longitude
cso.s5p.no2.convert.filter.lons.type               :  minmax
cso.s5p.no2.convert.filter.lons.minmax             :  ${my.region.west} ${my.region.east}
cso.s5p.no2.convert.filter.lons.units              :  degrees_east

! filter settings:
cso.s5p.no2.convert.filter.lats.var                :  PRODUCT/latitude
cso.s5p.no2.convert.filter.lats.type               :  minmax
cso.s5p.no2.convert.filter.lats.minmax             :  ${my.region.south} ${my.region.north}
cso.s5p.no2.convert.filter.lats.units              :  degrees_north

! skip pixel with "no data", use the "qa_value" variable to check:
cso.s5p.no2.convert.filter.valid.var               :  PRODUCT/qa_value
cso.s5p.no2.convert.filter.valid.type              :  valid

! Comment in "PRODUCT/qa_value" variable:
!   "A continuous quality descriptor, 
!   varying between 0 (no data) and 1 (full quality data). 
!   Recommend to ignore data with qa_value < 0.5" 
! Tests suggest that better threshold is 0.54,
! this removes the kernels with very high values.
! 0.75 is the recommended use so what we will use here
cso.s5p.no2.convert.filter.quality.var             :  PRODUCT/qa_value
cso.s5p.no2.convert.filter.quality.type            :  min
cso.s5p.no2.convert.filter.quality.min             :  0.75
cso.s5p.no2.convert.filter.quality.units           :  1

!! recommended 0.3 cloud fraction max (https://agupubs.onlinelibrary.wiley.com/doi/full/10.1029/2018GL081095)
!cso.s5p.no2.convert.filter.cloud_fraction.var      :  PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/cloud_fraction_crb_nitrogendioxide_window
!cso.s5p.no2.convert.filter.cloud_fraction.type     :  max
!cso.s5p.no2.convert.filter.cloud_fraction.max      :  0.3
!cso.s5p.no2.convert.filter.cloud_fraction.units    :  1



!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! output files
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

! output directory and filename:
! - times are taken from mid of selection, rounded to hours
! - use '%{processing}' for the processing name
! - use '%{orbit}' for orbit number
cso.s5p.no2.convert.output.filename            :  ${my.work}/CSO-data/${my.region}/S5p/NO2/${my.s5p.no2.selection}/%Y/%m/S5p_NO2_%{orbit}.nc

! pack variables on output:
cso.s5p.no2.convert.output.packed              :  True
! zlib compression level, 0 for no compression:
cso.s5p.no2.convert.output.complevel           :  1

! global attributes:
cso.s5p.no2.convert.output.attrs               :  format Conventions \
                                                     author institution email
!
cso.s5p.no2.convert.output.attr.format         :  ${my.cso.format}
cso.s5p.no2.convert.output.attr.Conventions    :  ${my.cso.convention}
cso.s5p.no2.convert.output.attr.author         :  ${my.attr.author}
cso.s5p.no2.convert.output.attr.institution    :  ${my.attr.institution}
cso.s5p.no2.convert.output.attr.email          :  ${my.attr.email}

! no need to swap layes:
cso.s5p.no2.convert.swap_layers                :  False


! ~ variables

! which fields to be put out ?
cso.s5p.no2.convert.output.vars    :  longitude longitude_bounds \
                                       latitude  latitude_bounds \
                                       track_longitude track_longitude_bounds \
                                       track_latitude  track_latitude_bounds \
                                       time \
                                       qa_value \
                                       pressure kernel_trop amf amf_trop nla \
                                       vcd vcd_errvar \
                                       cloud_fraction cloud_radiance_fraction

! ... optional ...
!                                       ground_pixel \
!                                       cloud_pressure_crb \
!                                       surface_albedo \
!                                       viewing_zenith_angle \
!                                       viewing_azimuth_angle \
!                                       solar_azimuth_angle \
!                                       solar_zenith_angle \
!                                       surface_classification \
!                                       snow_ice_flag

! 
! Describe per variable:
! * .dims :  dimensions list:
!     pixel       : selected pixels
!     corner      : number of footprint bounds (probably 4)
!     layer       : number of layers in atmospheric profile (layers in kernel)
!     layeri      : number of layer interfaces in atmospheric profile (layer+1)
!     retr        : number of layers in retrieval product (1 for columns) ;
!                   for error covariance use (retr,retr0) to avoid repeated dimensions
!     track_scan  : original scan index   in 2D track
!     track_pixel : original ground pixel in 2D track
! * .specal  : keyword to select special processing
!     * None                     : no special processing (default)
!     * track_longitude          : longitudes at centers of original 2D track
!     * track_latitude           : latitudes  at centers of original 2D track
!     * track_longitude_bounds   : longitude bounds at centers of original 2D track
!     * track_latitude_bounds    : latitude  bounds at centers of original 2D track
! * .units   : target units if different from original
! * .oper    : special postprocessing, currently supported:
!     * square      :  fill variable with squared valued (used to form variance from standard deviation)
! In case no special processing is needed:
! * .from : original variable (group path and variable name)
!

! center longitudes; remove bounds attribute, no coordinate ...
cso.s5p.no2.convert.output.var.longitude.dims                   :   pixel
cso.s5p.no2.convert.output.var.longitude.from                   :   PRODUCT/longitude
cso.s5p.no2.convert.output.var.longitude.attrs                  :   { 'bounds' : None }
! center latitudes; remove bounds attribute, no coordinate ...
cso.s5p.no2.convert.output.var.latitude.dims                    :   pixel
cso.s5p.no2.convert.output.var.latitude.from                    :   PRODUCT/latitude
cso.s5p.no2.convert.output.var.latitude.attrs                   :   { 'bounds' : None }

! corner longitudes; no units in file:
cso.s5p.no2.convert.output.var.longitude_bounds.dims            :   pixel corner
cso.s5p.no2.convert.output.var.longitude_bounds.from            :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds
cso.s5p.no2.convert.output.var.longitude_bounds.units           :   degrees_east
! corner latitudes, no units in file:
cso.s5p.no2.convert.output.var.latitude_bounds.dims             :   pixel corner
cso.s5p.no2.convert.output.var.latitude_bounds.from             :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds
cso.s5p.no2.convert.output.var.latitude_bounds.units            :   degrees_north

! original track:
!~ center lon; remove bounds attribute, no coordinate ...
cso.s5p.no2.convert.output.var.track_longitude.dims             :   track_scan track_pixel
cso.s5p.no2.convert.output.var.track_longitude.special          :   track_longitude
cso.s5p.no2.convert.output.var.track_longitude.from             :   PRODUCT/longitude
cso.s5p.no2.convert.output.var.track_longitude.attrs            :   { 'bounds' : None }
!~ center lat; remove bounds attribute, no coordinate ...
cso.s5p.no2.convert.output.var.track_latitude.dims              :   track_scan track_pixel
cso.s5p.no2.convert.output.var.track_latitude.special           :   track_latitude
cso.s5p.no2.convert.output.var.track_latitude.from              :   PRODUCT/latitude
cso.s5p.no2.convert.output.var.track_latitude.attrs             :   { 'bounds' : None }
!~ corner lons
cso.s5p.no2.convert.output.var.track_longitude_bounds.dims      :   track_scan track_pixel corner
cso.s5p.no2.convert.output.var.track_longitude_bounds.special   :   track_longitude_bounds
cso.s5p.no2.convert.output.var.track_longitude_bounds.from      :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds
cso.s5p.no2.convert.output.var.track_longitude_bounds.units     :   degrees_east
!~ corner lats
cso.s5p.no2.convert.output.var.track_latitude_bounds.dims       :   track_scan track_pixel corner
cso.s5p.no2.convert.output.var.track_latitude_bounds.special    :   track_latitude_bounds
cso.s5p.no2.convert.output.var.track_latitude_bounds.from       :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds
cso.s5p.no2.convert.output.var.track_latitude_bounds.units      :   degrees_north

! time value per scan line
cso.s5p.no2.convert.output.var.time.dims                        :   pixel
cso.s5p.no2.convert.output.var.time.special                     :   time-delta
cso.s5p.no2.convert.output.var.time.tref                        :   PRODUCT/time
cso.s5p.no2.convert.output.var.time.dt                          :   PRODUCT/delta_time

! vertical column density:
cso.s5p.no2.convert.output.var.vcd.dims                         :   pixel retr
cso.s5p.no2.convert.output.var.vcd.from                         :   PRODUCT/nitrogendioxide_tropospheric_column
cso.s5p.no2.convert.output.var.vcd.attrs                        :   { 'ancillary_variables' : None }

! error variance in vertical column density (after application of kernel),
! fill with single element 'covariance matrix', from square of standard error:
! use dims with different names to avoid that cf-checker complains:
cso.s5p.no2.convert.output.var.vcd_errvar.dims                  :   pixel retr retr0
cso.s5p.no2.convert.output.var.vcd_errvar.special               :   square
cso.s5p.no2.convert.output.var.vcd_errvar.from                  :   PRODUCT/nitrogendioxide_tropospheric_column_precision_kernel
!~ skip standard name, modifier "standard_error" is not valid anymore:
cso.s5p.no2.convert.output.var.vcd_errvar.attrs                 :   { 'standard_name' : None }

! Convert from hybride coefficient bounds in (2,nlev) aray to 3D half level pressure:
cso.s5p.no2.convert.output.var.pressure.dims                    :   pixel layeri
cso.s5p.no2.convert.output.var.pressure.special                 :   hybounds_to_pressure
cso.s5p.no2.convert.output.var.pressure.sp                      :   PRODUCT/SUPPORT_DATA/INPUT_DATA/surface_pressure
cso.s5p.no2.convert.output.var.pressure.hyab                    :   PRODUCT/tm5_constant_a
cso.s5p.no2.convert.output.var.pressure.hybb                    :   PRODUCT/tm5_constant_b
cso.s5p.no2.convert.output.var.pressure.units                   :   Pa

! (total) airmass factor:
cso.s5p.no2.convert.output.var.amf.dims                         :   pixel retr
cso.s5p.no2.convert.output.var.amf.from                         :   PRODUCT/air_mass_factor_total
cso.s5p.no2.convert.output.var.amf.attrs                        :   { 'coordinates' : None, 'ancillary_variables' : None }

! tropospheric airmass factor:
cso.s5p.no2.convert.output.var.amf_trop.dims                    :   pixel retr
cso.s5p.no2.convert.output.var.amf_trop.from                    :   PRODUCT/air_mass_factor_troposphere
cso.s5p.no2.convert.output.var.amf_trop.attrs                   :   { 'coordinates' : None, 'ancillary_variables' : None }

! number of apriori layers in retrieval layer,
! enforce that it is stored as a short integer:
cso.s5p.no2.convert.output.var.nla.dims                         :   pixel retr
cso.s5p.no2.convert.output.var.nla.dtype                        :   i2
cso.s5p.no2.convert.output.var.nla.from                         :   PRODUCT/tm5_tropopause_layer_index
cso.s5p.no2.convert.output.var.nla.attrs                        :   { 'coordinates' : None, 'ancillary_variables' : None }

! description:
!   kernel := averaging_kernel * amf/amf_trop
! for layers up to l_trop, zero above
cso.s5p.no2.convert.output.var.kernel_trop.dims                 :   pixel layer retr
cso.s5p.no2.convert.output.var.kernel_trop.special              :   kernel_trop
cso.s5p.no2.convert.output.var.kernel_trop.avk                  :   PRODUCT/averaging_kernel
cso.s5p.no2.convert.output.var.kernel_trop.amf                  :   PRODUCT/air_mass_factor_total
cso.s5p.no2.convert.output.var.kernel_trop.amft                 :   PRODUCT/air_mass_factor_troposphere
cso.s5p.no2.convert.output.var.kernel_trop.troplayer            :   PRODUCT/tm5_tropopause_layer_index
cso.s5p.no2.convert.output.var.kernel_trop.attrs                :   { 'coordinates' : None, 'ancillary_variables' : None }

! cloud property:
cso.s5p.no2.convert.output.var.cloud_fraction.dims             :   pixel
cso.s5p.no2.convert.output.var.cloud_fraction.from             :   PRODUCT/SUPPORT_DATA/INPUT_DATA/cloud_fraction_crb
cso.s5p.no2.convert.output.var.cloud_fraction.attrs            :   { 'coordinates' : None, 'source' : None }

! cloud property:
cso.s5p.no2.convert.output.var.cloud_radiance_fraction.dims    :   pixel
cso.s5p.no2.convert.output.var.cloud_radiance_fraction.from    :   PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/cloud_radiance_fraction_nitrogendioxide_window
cso.s5p.no2.convert.output.var.cloud_radiance_fraction.attrs   :   { 'coordinates' : None, 'ancillary_variables' : None }

! quality flag:
cso.s5p.no2.convert.output.var.qa_value.dims                   :   pixel
cso.s5p.no2.convert.output.var.qa_value.from                   :   PRODUCT/qa_value
!~ skip some attributes, cf-checker complains ...
cso.s5p.no2.convert.output.var.qa_value.attrs                  :   { 'valid_min' : None, 'valid_max' : None }

!! description:
!cso.s5p.no2.convert.output.var.cloud_pressure_crb.from          :   PRODUCT/SUPPORT_DATA/INPUT_DATA/cloud_pressure_crb
!cso.s5p.no2.convert.output.var.cloud_pressure_crb.units         :   Pa
!cso.s5p.no2.convert.output.var.cloud_pressure_crb.dims          :   pixel

!! description:
!cso.s5p.no2.convert.output.var.surface_albedo.from              :   PRODUCT/SUPPORT_DATA/INPUT_DATA/surface_albedo_nitrogendioxide_window
!cso.s5p.no2.convert.output.var.surface_albedo.units             :   1
!cso.s5p.no2.convert.output.var.surface_albedo.dims              :   pixel

!! description:
!cso.s5p.no2.convert.output.var.viewing_zenith_angle.from        :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/viewing_zenith_angle
!cso.s5p.no2.convert.output.var.viewing_zenith_angle.units       :   degree
!cso.s5p.no2.convert.output.var.viewing_zenith_angle.dims        :   pixel

!! description:
!cso.s5p.no2.convert.output.var.viewing_azimuth_angle.from       :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/viewing_azimuth_angle
!cso.s5p.no2.convert.output.var.viewing_azimuth_angle.units      :   degree
!cso.s5p.no2.convert.output.var.viewing_azimuth_angle.dims       :   pixel

!! description:
!cso.s5p.no2.convert.output.var.solar_azimuth_angle.from         :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_azimuth_angle
!cso.s5p.no2.convert.output.var.solar_azimuth_angle.units        :   degree
!cso.s5p.no2.convert.output.var.solar_azimuth_angle.dims         :   pixel

!! description:
!cso.s5p.no2.convert.output.var.solar_zenith_angle.from          :   PRODUCT/SUPPORT_DATA/GEOLOCATIONS/solar_zenith_angle
!cso.s5p.no2.convert.output.var.solar_zenith_angle.units         :   degree
!cso.s5p.no2.convert.output.var.solar_zenith_angle.dims          :   pixel

!! description:
!cso.s5p.no2.convert.output.var.snow_ice_flag.from               :   PRODUCT/SUPPORT_DATA/INPUT_DATA/snow_ice_flag
!cso.s5p.no2.convert.output.var.snow_ice_flag.units              :   None
!cso.s5p.no2.convert.output.var.snow_ice_flag.dims               :   pixel

!! description:
!cso.s5p.no2.convert.output.var.surface_classification.from      :  PRODUCT/SUPPORT_DATA/INPUT_DATA/surface_classification
!cso.s5p.no2.convert.output.var.surface_classification.units     :  None
!cso.s5p.no2.convert.output.var.surface_classification.dims      :   pixel

!! for traceback:
!cso.s5p.no2.convert.output.var.orbit_number.special             :   orbit_number
!cso.s5p.no2.convert.output.var.orbit_number.units               :   1
!cso.s5p.no2.convert.output.var.orbit_number.dims                :   pixel

!! for traceback:
!cso.s5p.no2.convert.output.var.image_number.special             :   scan_number
!cso.s5p.no2.convert.output.var.image_number.units               :   1
!cso.s5p.no2.convert.output.var.image_number.dims                :   pixel

!! for traceback:
!cso.s5p.no2.convert.output.var.ground_pixel.dims                :   track_pixel
!cso.s5p.no2.convert.output.var.ground_pixel.special             :   ground_pixel
!cso.s5p.no2.convert.output.var.ground_pixel.from                :   PRODUCT/ground_pixel




!======================================================================
!===
!=== listing
!===
!======================================================================

! csv file that will hold records per file with:
! - timerange of pixels in file
! - orbit number
cso.s5p.no2.listing.file                :  ${my.work}/CSO-data/${my.region}/S5p/NO2/${my.s5p.no2.selection}__listing.csv

! renew table if file already exists?
cso.s5p.no2.listing.renew               :  True

! time range:
cso.s5p.no2.listing.timerange.start     :  ${my.timerange.start}
cso.s5p.no2.listing.timerange.end       :  ${my.timerange.end}

! filename filters relative to listing file that should be scanned for orbit files;
! names could include time templates ;
! if same orbit is found in multiple directories, the first found is used;
! remove existing table for safety to ensure that this is done correctly ...
cso.s5p.no2.listing.patterns            :  ${my.s5p.no2.selection}/%Y/%m/S5p_*.nc

! extra columns to be added, read from global attributes:
cso.s5p.no2.listing.xcolumns            :  orbit


!======================================================================
!===
!=== catalogue
!===
!======================================================================

! listing file with filenames/timerange.
cso.s5p.no2.catalogue.input.listing               :  ${cso.s5p.no2.listing.file}

! time range:
cso.s5p.no2.catalogue.timerange.start             :  ${my.timerange.start}
cso.s5p.no2.catalogue.timerange.end               :  ${my.timerange.end}

! target filenames; templates:
! - time values
! - %{orbit}   : from listing
! - %{varname} for variable
cso.s5p.no2.catalogue.output.file                 :  ${my.work}/CSO-data-catalogue/${my.region}/S5p/NO2/${my.s5p.no2.selection}/%Y/%m/%d/S5p_NO2_%{orbit}__%{varname}.png

! map domain (west east south north)
cso.s5p.no2.catalogue.domain                      :  ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north}

! figure size (inches), default is (8,6):
cso.s5p.no2.catalogue.figsize                     :  ${my.region.figsize}

! renew existing files?
!cso.s5p.no2.catalogue.renew                       :  False
cso.s5p.no2.catalogue.renew                       :  True

! variables to be plotted:
cso.s5p.no2.catalogue.vars                        :  vcd vcd_errvar qa_value \
                                                      amf amf_trop nla \
                                                      cloud_fraction cloud_radiance_fraction

!! color for no-data values in track, default '0.8' (gray):
!cso.s5p.no2.catalogue.color_nan                   :  white

!! extra keyword arguments for map:
!cso.s5p.no2.catalogue.map                         :  resolution='h'

! convert units:
cso.s5p.no2.catalogue.var.vcd.units                         :  umol/m2
! style:
cso.s5p.no2.catalogue.var.vcd.vmin                          :   0.0
cso.s5p.no2.catalogue.var.vcd.vmax                          :  100.0

! show error as std.dev, convert to vcd units:
cso.s5p.no2.catalogue.var.vcd_errvar.units                  :  umol/m2
! style:
cso.s5p.no2.catalogue.var.vcd_errvar.vmax                   :  100.0

! style:
cso.s5p.no2.catalogue.var.amf.vmin                          :   0.0
cso.s5p.no2.catalogue.var.amf.vmax                          :   4.0

! style:
cso.s5p.no2.catalogue.var.amf_trop.vmin                     :   0.0
cso.s5p.no2.catalogue.var.amf_trop.vmax                     :   4.0

! style:
cso.s5p.no2.catalogue.var.nla.vmin                          :   1
cso.s5p.no2.catalogue.var.nla.vmax                          :   34

! style:
cso.s5p.no2.catalogue.var.qa_value.vmin                     :   0.5
cso.s5p.no2.catalogue.var.qa_value.vmax                     :   1.0
cso.s5p.no2.catalogue.var.qa_value.colors                   :   ['red','yellow','green']

! style:
cso.s5p.no2.catalogue.var.cloud_fraction.vmax               :   1.0
cso.s5p.no2.catalogue.var.cloud_fraction.colors             :   ['blue','cyan','white']

! style:
cso.s5p.no2.catalogue.var.cloud_radiance_fraction.vmax      :   1.0
cso.s5p.no2.catalogue.var.cloud_radiance_fraction.colors    :   ['blue','cyan','white']


!-----------------------------------------------------------
! catalogue index
!-----------------------------------------------------------

! target location:
cso.s5p.no2.catalogue-index.outdir                    :  ${my.work}/CSO-data-catalogue/${my.region}/S5p/NO2/${my.s5p.no2.selection}

! title:
cso.s5p.no2.catalogue-index.header                    :  CSO catalogue
! show info on created page?
cso.s5p.no2.catalogue-index.info                      :  True

! create new page for each value?
cso.s5p.no2.catalogue-index.newpage                   :  True

! content type:
cso.s5p.no2.catalogue-index.type                      :  list
! define row values:
cso.s5p.no2.catalogue-index.name                      :  date
cso.s5p.no2.catalogue-index.values                    :  TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' )

! create new page for each value:
cso.s5p.no2.catalogue-index.date.newpage                   :  True
! content type:
cso.s5p.no2.catalogue-index.date.type                      :  table-row
! define row values:
cso.s5p.no2.catalogue-index.date.name                      :  orbit
cso.s5p.no2.catalogue-index.date.values                    :  CsvFile( '%{date[0:4]}/%{date[4:6]}/%{date[6:8]}/orbits.csv' )

! content type:
cso.s5p.no2.catalogue-index.date.orbit.type                :  table-col
! define column values:
cso.s5p.no2.catalogue-index.date.orbit.name                :  var
cso.s5p.no2.catalogue-index.date.orbit.values              :  ${cso.s5p.no2.catalogue.vars}

! content type:
cso.s5p.no2.catalogue-index.date.orbit.var.type            :  img
! define image:
cso.s5p.no2.catalogue-index.date.orbit.var.img             :  %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_NO2_%{orbit}__%{var}.png
cso.s5p.no2.catalogue-index.date.orbit.var.kwargs          :  height=300



!======================================================================
!===
!=== gridded orbits
!===
!======================================================================


!-----------------------------------------------------------
! gridded orbits
!-----------------------------------------------------------

! time range:
cso.s5p.no2.gridded.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.gridded.timerange.end          :  ${my.timerange.end}
! create one gridded file per hour:
cso.s5p.no2.gridded.timerange.step         :  hour

! renew existing files?
cso.s5p.no2.gridded.renew                  :  True

! target directory, incl. subdir for resolution and filters:
my.gridded.dir                              :  ${my.work}/CSO-gridded/${my.region}__r01x01/S5p/NO2/${my.s5p.no2.selection}__${my.s5p.no2.gridded-selection}

!~

! grid definition:
!~ same as pixel selection on conversion:
cso.s5p.no2.gridded.grid.west              :  ${my.region.west}
cso.s5p.no2.gridded.grid.east              :  ${my.region.east}
cso.s5p.no2.gridded.grid.south             :  ${my.region.south}
cso.s5p.no2.gridded.grid.north             :  ${my.region.north}
! resolution:
cso.s5p.no2.gridded.grid.dlon              :  0.1
cso.s5p.no2.gridded.grid.dlat              :  0.1

! level of recursive splitting of footprint into triangles,
! and assignment of centroids to grid cells;
! for 4-corner footprints, number of centroids is:
!  1 (levels=0), 4 (1), 8 (2), 16 (3), 64 (5), 256 (7)
cso.s5p.no2.gridded.mapping.levels         :  5

!~

! keywords for source files; 
! the first one should have the footprints;
! here the only source are the converted files:
cso.s5p.no2.gridded.sources                  :  data

! input files for each source type:
!~ here: specify listing file, 
!  this is only supported for a single source
cso.s5p.no2.gridded.source.data.listing      :  ${cso.s5p.no2.listing.file}
!!~ alternative: filename patterns with time templates,
!!  but here the source files do not have time stamps
!cso.s5p.no2.gridded.source.data.filenames    :  ${my.work}/CSO-data/S5p/RPRO/NO2/${my.region}/%Y/%m/S5p_*.nc

!~

! filter description:
my.s5p.no2.gridded-selection                 :  qa08

! switch:
#if "${my.s5p.no2.gridded-selection}" == "qa08"

! keywords for filters:
cso.s5p.no2.gridded.filters                  :  quality

! minimum quality value required:
cso.s5p.no2.gridded.filter.quality.var       :  qa_value
cso.s5p.no2.gridded.filter.quality.type      :  min
cso.s5p.no2.gridded.filter.quality.min       :  0.8
cso.s5p.no2.gridded.filter.quality.units     :  1

#else
#error unsupported  my.s5p.no2.gridded-selection "${my.s5p.no2.gridded-selection}"
#endif

        
!~

! target file, might contain templates:
!   %Y,%m,etc     : time values
cso.s5p.no2.gridded.output.file              :  ${my.gridded.dir}/%Y/%m/S5p_NO2_%Y%m%d_%H%M_gridded.nc

! pack floats as short values?
cso.s5p.no2.gridded.output.packed            :  True
! zlib compression level (default 1, 0 for no compression):
cso.s5p.no2.gridded.output.complevel         :  1

! data variables to be created:
cso.s5p.no2.gridded.output.vars              :  yr

! input variables:
!   data:vcd    : variable "vcd" from source "data"
cso.s5p.no2.gridded.output.yr.source         :  data:vcd


!-----------------------------------------------------------
! catalogue of gridded fields
!-----------------------------------------------------------

! time range:
cso.s5p.no2.gridded-catalogue.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.gridded-catalogue.timerange.end          :  ${my.timerange.end}
! create one gridded file per hour:
cso.s5p.no2.gridded-catalogue.timerange.step         :  hour

! renew existing files?
!cso.s5p.no2.gridded-catalogue.renew                  :  True
cso.s5p.no2.gridded-catalogue.renew                  :  False

! target directory for catalogue:
cso.s5p.no2.gridded-catalogue.output.dir             :  ${my.gridded.dir}/catalogue

! input files:
cso.s5p.no2.gridded-catalogue.input.file             :  ${my.gridded.dir}/%Y/%m/S5p_NO2_%Y%m%d_%H%M_gridded.nc
!!~ idem for daily average:
!cso.s5p.no2.gridded-catalogue.input.file             :  ${my.gridded.dir}/S5p_NO2_%Y%m%d_aver_gridded.nc

! target files, time tempates and variable name are replaced:
cso.s5p.no2.gridded-catalogue.output.file            :  ${my.gridded.dir}/catalogue/%Y/%m/%d/S5p_NO2_%Y%m%d_%H%M_gridded_%{var}.png
!!~ idem for daily average:
!cso.s5p.no2.gridded-catalogue.output.file            :  ${my.gridded.dir}/catalogue/%Y/%m/%d/S5p_NO2_%Y%m%d_aver_gridded_%{var}.png

! figure size (inches), default is (8,6):
cso.s5p.no2.gridded-catalogue.figsize                :  (6,6)

! variables to be plotted:
cso.s5p.no2.gridded-catalogue.vars                   :  yr

! variable:
cso.s5p.no2.gridded-catalogue.var.yr.source          :  yr
! convert units:
cso.s5p.no2.gridded-catalogue.var.yr.units           :  umol/m2
! style:
cso.s5p.no2.gridded-catalogue.var.yr.vmin            :   0.0
cso.s5p.no2.gridded-catalogue.var.yr.vmax            : 100.0




!-----------------------------------------------------------
! gridded catalogue index
!-----------------------------------------------------------

! target location:
cso.s5p.no2.gridded-catalogue-index.outdir                    :  ${cso.s5p.no2.gridded-catalogue.output.dir}

! title:
cso.s5p.no2.gridded-catalogue-index.header                    :  CSO catalogue
! show info on created page?
cso.s5p.no2.gridded-catalogue-index.info                      :  True

! create new page for each value?
cso.s5p.no2.gridded-catalogue-index.newpage                   :  True

! content type:
cso.s5p.no2.gridded-catalogue-index.type                      :  list
! define row values:
cso.s5p.no2.gridded-catalogue-index.name                      :  date
cso.s5p.no2.gridded-catalogue-index.values                    :  TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' )

! create new page for each value:
cso.s5p.no2.gridded-catalogue-index.date.newpage              :  True
! content type:
cso.s5p.no2.gridded-catalogue-index.date.type                 :  table-row
! define row values:
cso.s5p.no2.gridded-catalogue-index.date.name                 :  time
cso.s5p.no2.gridded-catalogue-index.date.values               :  Range( 0, 23, 1, '%2.2i00' )

! content type:
cso.s5p.no2.gridded-catalogue-index.date.time.type            :  table-col
! define column values:
cso.s5p.no2.gridded-catalogue-index.date.time.name            :  var
cso.s5p.no2.gridded-catalogue-index.date.time.values          :  ${cso.s5p.no2.gridded-catalogue.vars}

! content type:
cso.s5p.no2.gridded-catalogue-index.date.time.var.type        :  img
! define image:
cso.s5p.no2.gridded-catalogue-index.date.time.var.img         :  %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_NO2_%{date}_%{time}_gridded_%{var}.png
cso.s5p.no2.gridded-catalogue-index.date.time.var.kwargs      :  height=300



!======================================================================
!===
!=== simulation catalogue
!===
!======================================================================


!-----------------------------------------------------------
! simulation catalogue
!-----------------------------------------------------------

! time range:
cso.s5p.no2.sim-catalogue.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.sim-catalogue.timerange.end          :  ${my.timerange.end}
cso.s5p.no2.sim-catalogue.timerange.step         :  hour

! input files:
cso.s5p.no2.sim-catalogue.input.data.file        :  ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_data.nc
cso.s5p.no2.sim-catalogue.input.state.file       :  ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_state.nc

! target files, time tempates and variable name are replaced:
cso.s5p.no2.sim-catalogue.output.file            :  ${my.work}/CSO-data-sim-catalogue/S5p/NO2/${my.region}/%Y/%m/%d/S5p_NO2_%Y%m%d_%H%M_%{var}.png

! map domain used for simulations (west east south north):
cso.s5p.no2.sim-catalogue.domain                 :  ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north}

! figure size (inches), default is (8,6):
cso.s5p.no2.sim-catalogue.figsize                :  ${my.region.figsize}

! renew existing files?
cso.s5p.no2.sim-catalogue.renew                  :  False
!cso.s5p.no2.sim-catalogue.renew                  :  True

! variables to be plotted:
cso.s5p.no2.sim-catalogue.vars                   :  yr ys yr_m ys_m

! variable:
cso.s5p.no2.sim-catalogue.var.yr.source          :  data:yr
! convert units:
cso.s5p.no2.sim-catalogue.var.yr.units           :  umol/m2
! style:
cso.s5p.no2.sim-catalogue.var.yr.vmin            :   0.0
cso.s5p.no2.sim-catalogue.var.yr.vmax            : 100.0

! variable:
cso.s5p.no2.sim-catalogue.var.ys.source          :  state:ys
! convert units:
cso.s5p.no2.sim-catalogue.var.ys.units           :  umol/m2
! style:
cso.s5p.no2.sim-catalogue.var.ys.vmin            :   0.0
cso.s5p.no2.sim-catalogue.var.ys.vmax            : 100.0

! variable:
cso.s5p.no2.sim-catalogue.var.yr_m.source        :  state:yr_m
! convert units:
cso.s5p.no2.sim-catalogue.var.yr_m.units         :  umol/m2
! style:
cso.s5p.no2.sim-catalogue.var.yr_m.vmin          :   0.0
cso.s5p.no2.sim-catalogue.var.yr_m.vmax          : 100.0

! variable:
cso.s5p.no2.sim-catalogue.var.ys_m.source        :  state:ys_m
! convert units:
cso.s5p.no2.sim-catalogue.var.ys_m.units         :  umol/m2
! style:
cso.s5p.no2.sim-catalogue.var.ys_m.vmin          :   0.0
cso.s5p.no2.sim-catalogue.var.ys_m.vmax          : 100.0



!-----------------------------------------------------------
! sim catalogue index
!-----------------------------------------------------------

! target location:
cso.s5p.no2.sim-catalogue-index.outdir                    :  ${my.work}/CSO-sim-catalogue

! title:
cso.s5p.no2.sim-catalogue-index.header                    :  CSO catalogue
! show info on created page?
cso.s5p.no2.sim-catalogue-index.info                      :  True

! create new page for each value?
cso.s5p.no2.sim-catalogue-index.newpage                   :  True

! content type:
cso.s5p.no2.sim-catalogue-index.type                      :  list
! define row values:
cso.s5p.no2.sim-catalogue-index.name                      :  date
cso.s5p.no2.sim-catalogue-index.values                    :  TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' )

! create new page for each value:
cso.s5p.no2.sim-catalogue-index.date.newpage              :  True
! content type:
cso.s5p.no2.sim-catalogue-index.date.type                 :  table-row
! define row values:
cso.s5p.no2.sim-catalogue-index.date.name                 :  time
cso.s5p.no2.sim-catalogue-index.date.values               :  Range( 0, 23, 1, '%2.2i00' )

! content type:
cso.s5p.no2.sim-catalogue-index.date.time.type            :  table-col
! define column values:
cso.s5p.no2.sim-catalogue-index.date.time.name            :  var
cso.s5p.no2.sim-catalogue-index.date.time.values          :  ${cso.s5p.no2.sim-catalogue.vars}

! content type:
cso.s5p.no2.sim-catalogue-index.date.time.var.type        :  img
! define image:
cso.s5p.no2.sim-catalogue-index.date.time.var.img         :  %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_NO2_%{date}_%{time}_%{var}.png
cso.s5p.no2.sim-catalogue-index.date.time.var.kwargs      :  height=300



!======================================================================
!===
!=== gridded simulated orbits
!===
!======================================================================


!-----------------------------------------------------------
! gridded orbits
!-----------------------------------------------------------

! time range:
cso.s5p.no2.sim-gridded.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.sim-gridded.timerange.end          :  ${my.timerange.end}

! renew existing files?
cso.s5p.no2.sim-gridded.renew                  :  True

! keyword used for subdir for resolution and filters:
my.gridded.subdir                           :  ${my.region}__r01x01__qa08

!~

! testing ..
my.gridded.region                           :  ${my.region}
! grid definition:
!~ same as pixel selection on conversion:
cso.s5p.no2.sim-gridded.grid.west              :  ${my.region.west}
cso.s5p.no2.sim-gridded.grid.east              :  ${my.region.east}
cso.s5p.no2.sim-gridded.grid.south             :  ${my.region.south}
cso.s5p.no2.sim-gridded.grid.north             :  ${my.region.north}
! resolution:
cso.s5p.no2.sim-gridded.grid.dlon              :  0.1
cso.s5p.no2.sim-gridded.grid.dlat              :  0.1

!~

! keywords for source files; 
! the first one should have the footprints:
cso.s5p.no2.sim-gridded.sources                :  data state

! input files for each source type:
cso.s5p.no2.sim-gridded.source.data            :  ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_data.nc
cso.s5p.no2.sim-gridded.source.state           :  ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_state.nc

!~

! keywords for filters:
cso.s5p.no2.sim-gridded.filters                  :  quality

! minimum quality value required:
cso.s5p.no2.sim-gridded.filter.quality.var       :  qa_value
cso.s5p.no2.sim-gridded.filter.quality.type      :  min
cso.s5p.no2.sim-gridded.filter.quality.min       :  0.8
cso.s5p.no2.sim-gridded.filter.quality.units     :  1
        
!~

! target file, might contain templates:
!   %Y,%m,etc     : time values
!   %{basename}   : basename (without extension) of first source file
cso.s5p.no2.sim-gridded.output.file              :  ${my.work}/CSO-gridded/${my.gridded.subdir}/%Y/%m/CSO_output_%Y%m%d_%H%M_gridded.nc

! data variables to be created:
cso.s5p.no2.sim-gridded.output.vars              :  yr ys yr_m ys_m

! input variables:
!   data:yr    : from data file
!   state:ys    : from state file
cso.s5p.no2.sim-gridded.output.yr.source         :  data:yr
cso.s5p.no2.sim-gridded.output.ys.source         :  state:ys
cso.s5p.no2.sim-gridded.output.yr_m.source       :  state:yr_m
cso.s5p.no2.sim-gridded.output.ys_m.source       :  state:ys_m


!-----------------------------------------------------------
! catalogue of gridded fields
!-----------------------------------------------------------

! time range:
cso.s5p.no2.sim-gridded-catalogue.timerange.start        :  ${my.timerange.start}
cso.s5p.no2.sim-gridded-catalogue.timerange.end          :  ${my.timerange.end}

! renew existing files?
cso.s5p.no2.sim-gridded-catalogue.renew                  :  True
!cso.s5p.no2.sim-gridded-catalogue.renew                  :  False

! target directory for catalogue:
cso.s5p.no2.sim-gridded-catalogue.output.dir             :  ${my.work}/CSO-gridded/${my.gridded.subdir}/catalogue

! input files:
cso.s5p.no2.sim-gridded-catalogue.input.file             :  ../%Y/%m/CSO_output_%Y%m%d_%H%M_gridded.nc
!!~ idem for daily average:
!cso.s5p.no2.sim-gridded-catalogue.input.file             :  ../CSO_output_%Y%m%d_aver_gridded.nc

! target files, time tempates and variable name are replaced:
cso.s5p.no2.sim-gridded-catalogue.output.file            :  %Y/%m/%d/S5p_RPRO_NO2_%Y%m%d_%H%M_gridded_%{var}.png
!!~ idem for daily average:
!cso.s5p.no2.sim-gridded-catalogue.output.file            :  %Y/%m/%d/S5p_RPRO_NO2_%Y%m%d_aver_gridded_%{var}.png

! figure size (inches), default is (8,6):
cso.s5p.no2.sim-gridded-catalogue.figsize                :  (6,6)

! variables to be plotted:
cso.s5p.no2.sim-gridded-catalogue.vars                   :  yr ys yr_m ys_m

! variable:
cso.s5p.no2.sim-gridded-catalogue.var.yr.source          :  yr
! convert units:
cso.s5p.no2.sim-gridded-catalogue.var.yr.units           :  umol/m2
! style:
cso.s5p.no2.sim-gridded-catalogue.var.yr.vmin            :   0.0
cso.s5p.no2.sim-gridded-catalogue.var.yr.vmax            : 100.0

! variable:
cso.s5p.no2.sim-gridded-catalogue.var.ys.source          :  ys
! convert units:
cso.s5p.no2.sim-gridded-catalogue.var.ys.units           :  umol/m2
! style:
cso.s5p.no2.sim-gridded-catalogue.var.ys.vmin            :   0.0
cso.s5p.no2.sim-gridded-catalogue.var.ys.vmax            : 100.0

! variable:
cso.s5p.no2.sim-gridded-catalogue.var.yr_m.source        :  yr_m
! convert units:
cso.s5p.no2.sim-gridded-catalogue.var.yr_m.units         :  umol/m2
! style:
cso.s5p.no2.sim-gridded-catalogue.var.yr_m.vmin          :   0.0
cso.s5p.no2.sim-gridded-catalogue.var.yr_m.vmax          : 100.0

! variable:
cso.s5p.no2.sim-gridded-catalogue.var.ys_m.source        :  ys_m
! convert units:
cso.s5p.no2.sim-gridded-catalogue.var.ys_m.units         :  umol/m2
! style:
cso.s5p.no2.sim-gridded-catalogue.var.ys_m.vmin          :   0.0
cso.s5p.no2.sim-gridded-catalogue.var.ys_m.vmax          : 100.0



!-----------------------------------------------------------
! gridded catalogue index
!-----------------------------------------------------------

! target location:
cso.s5p.no2.sim-gridded-catalogue-index.outdir                    :  ${cso.s5p.no2.sim-gridded-catalogue.output.dir}

! title:
cso.s5p.no2.sim-gridded-catalogue-index.header                    :  CSO catalogue
! show info on created page?
cso.s5p.no2.sim-gridded-catalogue-index.info                      :  True

! create new page for each value?
cso.s5p.no2.sim-gridded-catalogue-index.newpage                   :  True

! content type:
cso.s5p.no2.sim-gridded-catalogue-index.type                      :  list
! define row values:
cso.s5p.no2.sim-gridded-catalogue-index.name                      :  date
cso.s5p.no2.sim-gridded-catalogue-index.values                    :  TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' )

! create new page for each value:
cso.s5p.no2.sim-gridded-catalogue-index.date.newpage              :  True
! content type:
cso.s5p.no2.sim-gridded-catalogue-index.date.type                 :  table-row
! define row values:
cso.s5p.no2.sim-gridded-catalogue-index.date.name                 :  time
cso.s5p.no2.sim-gridded-catalogue-index.date.values               :  Range( 0, 23, 1, '%2.2i00' )

! content type:
cso.s5p.no2.sim-gridded-catalogue-index.date.time.type            :  table-col
! define column values:
cso.s5p.no2.sim-gridded-catalogue-index.date.time.name            :  var
cso.s5p.no2.sim-gridded-catalogue-index.date.time.values          :  ${cso.s5p.no2.sim-gridded-catalogue.vars}

! content type:
cso.s5p.no2.sim-gridded-catalogue-index.date.time.var.type        :  img
! define image:
cso.s5p.no2.sim-gridded-catalogue-index.date.time.var.img         :  %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_RPRO_NO2_%{date}_%{time}_gridded_%{var}.png
cso.s5p.no2.sim-gridded-catalogue-index.date.time.var.kwargs      :  height=300


!======================================================================
!===
!=== end
!===
!======================================================================


