diff --git a/config/CrIS/cso-cris-nh3.rc b/config/CrIS/cso-cris-nh3.rc new file mode 100644 index 0000000000000000000000000000000000000000..9988dbd0d1929cf6f04998b433f7f5d7d8b915dd --- /dev/null +++ b/config/CrIS/cso-cris-nh3.rc @@ -0,0 +1,987 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! +!!! CSO CrIS/NH3 Processing +!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +!----------------------------------------------------------------------- +! user specific settings: +!----------------------------------------------------------------------- + +! include user specfic settings: +#include cso-user-settings.rc + + +!----------------------------------------------------------------------- +! multi-product +!----------------------------------------------------------------------- + +! instrument selection: +#if "${MY_PRODUCT}" in ["cris1-nh3"] +my.instrument : CrIS1 +my.platform : snpp +#elif "${MY_PRODUCT}" in ["cris2-nh3"] +my.instrument : CrIS2 +my.platform : noaa20 +#else +#error unsupported product '${MY_PRODUCT}' +#endif + +! current version available: +my.version : v1_6_4 + +! local archive: +my.arch.dir : ${my.work}/ECCC/${my.instrument} + + +!====================================================================== +!=== +!=== Inquire +!=== +!====================================================================== + + +!----------------------------------------------------------------------- +! inquire portal +!----------------------------------------------------------------------- + +! Obtain names of all available CrIS files. +! Stored as csv with processing type, processor version, filenames, etc. + +! renew table if file already exists? +cso.inquire-table-cris.renew : True + +! full time range: +cso.inquire-table-cris.timerange.start : ${my.inquire.timerange.start} +cso.inquire-table-cris.timerange.end : ${my.inquire.timerange.end} + +! archive location: +cso.inquire-table-cris.url : https://hpfx.collab.science.gc.ca/~mas001/satellite_ext/cris/${my.platform}/nh3/${my.version}/global + +!! user/password settings for this server: +!cso.inquire-table-cris.netrc : ${HOME}/.netrc + +! csv file that will hold records per file with: +! - timerange of pixels in file +! - orbit number +cso.inquire-table-cris.output.file : ${my.arch.dir}/inquire/inquire_%Y-%m-%d.csv + + + +!----------------------------------------------------------- +! overview plot of versions +!----------------------------------------------------------- + +! renew existing plots? +cso.inquire-plot.renew : True + +! listing files: +cso.inquire-plot.file : ${cso.inquire-table-cris.output.file} +cso.inquire-plot.filedate : 2026-02-19 + +! listing table type: S5P VIIRS CrIS +cso.inquire-plot.filetype : CrIS + +! annote: +cso.inquire-plot.title : ${my.instrument}-NH3 (archive %Y-%m-%d) + +! output figure, eventually use templates for time values: +cso.inquire-plot.output.file : ${my.arch.dir}/inquire/inquire_%Y-%m-%d.png + + +!====================================================================== +!=== +!=== convert +!=== +!====================================================================== + + +! renew existing files (True|False) ? +cso.convert.renew : True +!cso.convert.renew : False + +! time range: +cso.convert.timerange.start : ${my.timerange.start} +cso.convert.timerange.end : ${my.timerange.end} + + + +!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +! input files +!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +! listing file with input data: +cso.convert.input.listing : ${cso.inquire-table-cris.output.file} +!cso.convert.input.listing.filedate : 2026-02-19 + +! Provide ';' seperated list of to decide if a particular orbit file should be processed. +! If more than one file is available for a particular day (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 processing 'OFFL' but otherwise from 'NRT': +! %{stream} == 'OFFL' ; %{stream} == 'NRT' +! +cso.convert.selection : %{stream} == 'OFFL' ; %{stream} == 'NRT' + +! input directory; +! files are searched here or downloaded to if not present yet: +cso.convert.downloads.dir : ${my.arch.dir}/download + +! remove files extracted from collection files after convert? +cso.convert.downloads.cleanup.extracts : True +!!~ TESTING ... +!cso.convert.downloads.cleanup.extracts : False + +! only extract datafiles that overlap with target region (w/e/s/n): +cso.convert.downloads.region : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} + + +! +! * pixel selection +! + +! selection names: +cso.convert.filters : lons lats daytime landfraction pressure valid cloud_flag quality + +! filter settings: +cso.convert.filter.lons.var : Longitude +cso.convert.filter.lons.type : minmax +cso.convert.filter.lons.minmax : ${my.region.west} ${my.region.east} +cso.convert.filter.lons.units : degrees_east + +! filter settings: +cso.convert.filter.lats.var : Latitude +cso.convert.filter.lats.type : minmax +cso.convert.filter.lats.minmax : ${my.region.south} ${my.region.north} +cso.convert.filter.lats.units : degrees_north + +! 1 gives daytime obs, 0 nighttime +cso.convert.filter.daytime.var : Daylight_Flag +cso.convert.filter.daytime.type : equal +cso.convert.filter.daytime.value : 1 +cso.convert.filter.daytime.units : 1 + +! exclude water pixels, at least 80% land +cso.convert.filter.landfraction.var : LandFraction +cso.convert.filter.landfraction.type : min +cso.convert.filter.landfraction.min : 0.5 +cso.convert.filter.landfraction.units : 1 + +! exclude pixels over mountains; +! "surface" pressure in profile should be at least 900 mbar (~1000m) +cso.convert.filter.pressure.var : pressure +cso.convert.filter.pressure.type : min-of-max-in-profile +cso.convert.filter.pressure.min : 900.0 +cso.convert.filter.pressure.units : hPa + +! some pixels have incorrect meteo values ("tm", "zm", and "h2o" variables) +! with values of about 9.969e36 ; remove these pixels based on the "zm" profiles: +cso.convert.filter.valid.var : zm +cso.convert.filter.valid.type : max +cso.convert.filter.valid.max : 1e36 +cso.convert.filter.valid.units : km + +!2.1. Quality Flags +!CFPR currently generates a Quality_Flag (QF) variable for each observation, ranging from -1 (did not converge) to 5, +!which is determined by applying a series of quality checks on the retrievals. Each QF value can be considered as a step, +!with higher values implying that all the conditions for lower QF values have also been met. The QF values are listed below: +! +! * -1 +! Retrieval did not converge +! Flag indicating that the retrieval did not converge. Often these are not written into the product files. +! * 1 +! Retrieval converged +! Flag indicating that the retrieval converged is specified number of iterations. +! * 2 +! Large outlier flag +! Quality flag 1 & profile retrieved value less than 200 ppbv. +! * 3 +! Retrieval quality flag +! Quality flag 2 & chi-squared less than 20 +! * 4 +! More conservative retrieval quality flag +! Quality flag 3 & signal-to-noise >= 1 and thermal contrast > 0 +! * 5 +! More conservative retrieval quality flag with information content +! Quality flag 4 & also filtered to have a minimum degree-of-freedom for signal of 0.1 +! +! Following recomendations, use pixels with quality flag >= 5 +cso.convert.filter.quality.var : Quality_Flag +cso.convert.filter.quality.type : min +cso.convert.filter.quality.min : 5 +cso.convert.filter.quality.units : 1 + +! Cloud_Flag values: +! -1 : no cloud information +! 0 : clear retrieval [selected] +! 1 : cloudy retrieval +! 2 : smoke plume +! 3 : cloud-free pixels below the detection limit [selected] +! Note that thick-cloud pixels are not retrieved anyhow. +! Following recomendations, reject pixels with Cloud_Flag==1 +! However, also "smoke" pixels were found to have too high prior, so also reject these. +! For safety, only include pixels that are clearly cloud-free. +cso.convert.filter.cloud_flag.var : Cloud_Flag +cso.convert.filter.cloud_flag.type : in +cso.convert.filter.cloud_flag.value : 0 3 + + +!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +! output files +!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +! output filename: +cso.convert.output.filename : ${my.arch.dir}/${my.version}/${my.region}/%Y/%m/${my.instrument}_NH3_%Y%m%d.nc + + + +! global attributes: +cso.convert.output.attrs : format Conventions \ + author institution email +! +cso.convert.output.attr.format : ${my.cso.format} +cso.convert.output.attr.Conventions : ${my.cso.convention} +cso.convert.output.attr.author : ${my.attr.author} +cso.convert.output.attr.institution : ${my.attr.institution} +cso.convert.output.attr.email : ${my.attr.email} + +! ~ variables + +! which fields to be put out ? +cso.convert.output.vars : longitude latitude pixel_bounds time \ + pressure hpressure altitude isfc pressure_sfc landfraction \ + tot_col tot_col_meas_errvar tot_col_total_errvar xr yr \ + xa ya \ + log_kernel lin_kernel A \ + quality_flag cloud_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) +! layer0 : 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 : longiudes at centers of original 2D track +! * track_latitude : latiudes at centers of original 2D track +! * track_longitude_bounds : longiude bounds at centers of original 2D track +! * track_latitude_bounds : latiude 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) +! + +! ~ footprints + +! description: +cso.convert.output.var.longitude.dims : pixel +cso.convert.output.var.longitude.from : Longitude +cso.convert.output.var.longitude.units : degrees_east +cso.convert.output.var.longitude.attrs : { 'standard_name' : 'longitude' } + +! description: +cso.convert.output.var.latitude.dims : pixel +cso.convert.output.var.latitude.from : Latitude +cso.convert.output.var.latitude.units : degrees_north +cso.convert.output.var.latitude.attrs : { 'standard_name' : 'latitude' } + + +! corner longitudes and latitudes: +cso.convert.output.var.pixel_bounds.dims : pixel corner +cso.convert.output.var.pixel_bounds.special : pixel_bounds_cris +!~ input variables: +cso.convert.output.var.pixel_bounds.from.range : SatelliteRange +cso.convert.output.var.pixel_bounds.from.zenith : SatelliteZenithAngle +cso.convert.output.var.pixel_bounds.from.azimuth : SatelliteAzimuthAngle +cso.convert.output.var.pixel_bounds.from.lon : Longitude +cso.convert.output.var.pixel_bounds.from.lat : Latitude +! target variables; +cso.convert.output.var.pixel_bounds.out.lon : longitude_bounds +cso.convert.output.var.pixel_bounds.out.lat : latitude_bounds + +! ~ time + +! time value per pixel: +cso.convert.output.var.time.dims : pixel +cso.convert.output.var.time.special : datetime64 +cso.convert.output.var.time.from : mdate + +! ~ pressure and altitude + +! description: +cso.convert.output.var.pressure.dims : pixel layer +cso.convert.output.var.pressure.from : pressure +cso.convert.output.var.pressure.units : Pa + +! retrieved surface conc; +! this is the lowest value that is not nan: +cso.convert.output.var.pressure_sfc.dims : pixel +cso.convert.output.var.pressure_sfc.special : surface_non_fill +cso.convert.output.var.pressure_sfc.from : pressure +cso.convert.output.var.pressure_sfc.units : Pa + +! half level pressures: +! - lowest pressure +! - mid of pressure levels +! - 0.0 Pa at top +cso.convert.output.var.hpressure.dims : pixel layeri +cso.convert.output.var.hpressure.special : pressure_to_hpressure +cso.convert.output.var.hpressure.from : pressure +cso.convert.output.var.hpressure.units : Pa + +! altitude +cso.convert.output.var.altitude.dims : pixel layer +cso.convert.output.var.altitude.from : zm +cso.convert.output.var.altitude.units : m + +! land fraction +cso.convert.output.var.landfraction.dims : pixel +cso.convert.output.var.landfraction.from : LandFraction +cso.convert.output.var.landfraction.units : 1 + +! 0-based index of surface layer: +cso.convert.output.var.isfc.dims : pixel +cso.convert.output.var.isfc.special : sfc_layer_index +cso.convert.output.var.isfc.from : pressure + +! ~ retrieved + +! description: +cso.convert.output.var.tot_col.dims : pixel retr +cso.convert.output.var.tot_col.from : tot_col +cso.convert.output.var.tot_col.units : mol m-2 + +! description: +cso.convert.output.var.tot_col_meas_errvar.dims : pixel retr retr0 +cso.convert.output.var.tot_col_meas_errvar.from : tot_col_meas_error +cso.convert.output.var.tot_col_meas_errvar.special : square +cso.convert.output.var.tot_col_meas_errvar.units : mol m-2 + +! description: +cso.convert.output.var.tot_col_total_errvar.dims : pixel retr retr0 +cso.convert.output.var.tot_col_total_errvar.from : tot_col_total_error +cso.convert.output.var.tot_col_total_errvar.special : square +cso.convert.output.var.tot_col_total_errvar.units : mol m-2 + +! retrieved profile: +cso.convert.output.var.xr.dims : pixel retr_profile +cso.convert.output.var.xr.from : xretv +cso.convert.output.var.xr.units : ppmv + +! retrieved surface conc; +! this is the lowest value that is not nan: +cso.convert.output.var.xr_sfc.special : surface_non_fill +cso.convert.output.var.xr_sfc.from : xretv +cso.convert.output.var.xr_sfc.units : ppmv +cso.convert.output.var.xr_sfc.dims : pixel layer + +! retrieved profile as column; +! requires an earlier computed variable on layers and "half-level pressure" variable: +cso.convert.output.var.yr.dims : pixel retr +cso.convert.output.var.yr.special : vcd +cso.convert.output.var.yr.profiles : xr +cso.convert.output.var.yr.hp : hpressure +cso.convert.output.var.yr.units : mol m-2 +cso.convert.output.var.yr.attrs : { 'long_name' : 'Retrieved Species Total Column (computed from retrieved profile)' } + +! ~ prior + +! a priori profile: +cso.convert.output.var.xa.dims : pixel layer +cso.convert.output.var.xa.from : xa +cso.convert.output.var.xa.units : ppmv + +! a priori surface conc; +! this is the lowest value that is not nan: +cso.convert.output.var.xa_sfc.special : surface_non_fill +cso.convert.output.var.xa_sfc.from : xa +cso.convert.output.var.xa_sfc.units : ppmv +cso.convert.output.var.xa_sfc.dims : pixel layer + +! apriori profile as column; +! requires an earlier computed "half-level pressure" variable: +cso.convert.output.var.ya.dims : pixel retr +cso.convert.output.var.ya.special : vcd +cso.convert.output.var.ya.profiles : xa +cso.convert.output.var.ya.hp : hpressure +cso.convert.output.var.ya.units : mol m-2 +cso.convert.output.var.ya.attrs : { 'long_name' : 'Apriori Species Total Column (computed from apriori profile)' } + +! ~ kernels + +! kernel: +cso.convert.output.var.log_kernel.dims : pixel layer retr_profile +cso.convert.output.var.log_kernel.from : avg_kernel +cso.convert.output.var.log_kernel.units : 1 +cso.convert.output.var.log_kernel.attrs : { 'long_units' : 'ln(ppmv)/ln(ppmv)' } + +! linearization from units "ln(ppmv)/ln(ppmv)" to "ppmv/ppmv": +! kernel := averaging_kernel * amf/amft +cso.convert.output.var.lin_kernel.dims : pixel layer retr_profile +cso.convert.output.var.lin_kernel.special : linearize_kernel +cso.convert.output.var.lin_kernel.avk : avg_kernel +cso.convert.output.var.lin_kernel.apri : xa +cso.convert.output.var.lin_kernel.units : 1 +cso.convert.output.var.lin_kernel.attrs : { 'long_name' : 'linearized averaging kernel matrix in ppmv/ppmv' } + +! linearized kernel as profile +cso.convert.output.var.A.dims : pixel layer retr +cso.convert.output.var.A.special : vcd +cso.convert.output.var.A.profiles : lin_kernel +cso.convert.output.var.A.hp : hpressure +cso.convert.output.var.A.units : 1 +cso.convert.output.var.A.attrs : { 'long_name' : 'linearized averaging kernel profile in (mol/m2)/ppmv' } + +! ~ flags + +! Quality flag: +cso.convert.output.var.quality_flag.dims : pixel +cso.convert.output.var.quality_flag.from : Quality_Flag +cso.convert.output.var.quality_flag.units : 1 +cso.convert.output.var.quality_flag.dtype : i1 +cso.convert.output.var.quality_flag.attrs : { 'long_name' : 'quality flag' } + +! Cloud_Flag: +cso.convert.output.var.cloud_flag.dims : pixel +cso.convert.output.var.cloud_flag.from : Cloud_Flag +cso.convert.output.var.cloud_flag.units : 1 +cso.convert.output.var.cloud_flag.dtype : i1 +cso.convert.output.var.cloud_flag.attrs : { 'long_name' : 'cloud flag' } + + + +!====================================================================== +!=== +!=== listing +!=== +!====================================================================== + +! csv file that will hold records per file with: +! - timerange of pixels in file +! - orbit number +cso.listing.file : ${my.arch.dir}/${my.version}/${my.region}/listing.csv + +! renew table if file already exists? +cso.listing.renew : True + +! time range: +cso.listing.timerange.start : ${my.timerange.start} +cso.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.listing.patterns : %Y/%m/${my.instrument}_*.nc + + + +!====================================================================== +!=== +!=== catalogue +!=== +!====================================================================== + +! target directory for catalogue: +cso.catalogue.output.dir : ${my.work}/CSO/catalogue + +! listing file with filenames/timerange. +cso.catalogue.input.listing : ${cso.listing.file} + +! target filenames; templates: +! - time values +! - %{varname} for variable +cso.catalogue.output.file : ${my.work}/CSO-data-catalogue/${my.instrument}/%Y/%m/${my.instrument}_NH3_%Y%m%d__%{varname}.png + +! time range: +cso.catalogue.timerange.start : ${my.timerange.start} +cso.catalogue.timerange.end : ${my.timerange.end} + +! map domain (west east south north) +!cso.catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} +! ~ zooom: +cso.catalogue.domain : 7 12 54 60 +!!~ TESTING TJK domain: +!cso.catalogue.domain : 67 75.5 36.5 41.5 + +! figure size (inches), default is (8,6): +cso.catalogue.figsize : ${my.region.figsize} + +! renew existing files? +cso.catalogue.renew : True +!cso.catalogue.renew : False + +! variables to be plotted: +cso.catalogue.vars : yr ya quality_flag cloud_flag landfraction + +! convert units: +cso.catalogue.var.tot_col.units : umol/m2 +! style: +cso.catalogue.var.tot_col.vmin : 0.0 +cso.catalogue.var.tot_col.vmax : 500.0 + +! convert units: +cso.catalogue.var.yr.units : umol/m2 +! style: +cso.catalogue.var.yr.vmin : 0.0 +cso.catalogue.var.yr.vmax : 500.0 + +! convert units: +cso.catalogue.var.ya.units : umol/m2 +! style: +cso.catalogue.var.ya.vmin : 0.0 +cso.catalogue.var.ya.vmax : 500.0 + +! quality flags from 1 to 5: +cso.catalogue.var.quality_flag.vmin : 0.5 +cso.catalogue.var.quality_flag.vmax : 5.5 +cso.catalogue.var.quality_flag.colors : ["cyan","blue","yellow","orange","green"] +cso.catalogue.var.quality_flag.ncolor : 5 + +! style: +cso.catalogue.var.cloud_flag.vmin : -1.5 +cso.catalogue.var.cloud_flag.vmax : 3.5 +cso.catalogue.var.cloud_flag.colors : ['gray','green','orange','red','magenta'] +cso.catalogue.var.cloud_flag.ncolor : 5 + +! style: +cso.catalogue.var.landfraction.colors : ["blue","cyan","yellow","green"] +cso.catalogue.var.landfraction.ncolor : 4 + + +!----------------------------------------------------------- +! catalogue index +!----------------------------------------------------------- + +! target location: +cso.catalogue-index.outdir : ${my.work}/CSO-data-catalogue/${my.instrument} + +! title: +cso.catalogue-index.header : CSO catalogue +! show info on created page? +cso.catalogue-index.info : True + +! create new page for each value? +cso.catalogue-index.newpage : True + +! content type: +cso.catalogue-index.type : list +! define row values: +cso.catalogue-index.name : month +cso.catalogue-index.values : TimeSeries( ${cso.catalogue.timerange.start}, ${cso.catalogue.timerange.end}, 1 month, %Y-%m ) + +! create new page for each value: +cso.catalogue-index.month.newpage : True +! content type: +cso.catalogue-index.month.type : table-row +! define row values: +cso.catalogue-index.month.name : date +cso.catalogue-index.month.values : TimeSeries( %{month}, %{month}, 1 day, %Y%m%d ) + +! content type: +cso.catalogue-index.month.date.type : table-col +! define column values: +cso.catalogue-index.month.date.name : var +cso.catalogue-index.month.date.values : ${cso.catalogue.vars} + +! content type: +cso.catalogue-index.month.date.var.type : img +! define image: +cso.catalogue-index.month.date.var.img : %{date[0:4]}/%{date[4:6]}/CrIS2_NH3_%{date}__%{var}.png +cso.catalogue-index.month.date.var.kwargs : height=300 + + + + +!====================================================================== +!=== +!=== simulation catalogue +!=== +!====================================================================== + + +!----------------------------------------------------------- +! simulation catalogue +!----------------------------------------------------------- + +! time range: +cso.sim-catalogue.timerange.start : ${my.timerange.start} +cso.sim-catalogue.timerange.end : ${my.timerange.end} + +! listing with "data" and "state" files: +cso.sim-catalogue.input.listing : ${CSO_PREFIX}/oper/listing.csv + +! target directory for figures: +! - time values : average time of pixels in file +! full filenames includes "basename" of simulation files (without "_data.nc" or "_state.nc") +! and the variable name: +! /_.png +cso.sim-catalogue.output.dir : ${my.work}/CSO-sim-catalogue/%Y/%m + +!! domain of converted data: +!cso.sim-catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} +! map domain used for simulations (west east south north): +cso.sim-catalogue.domain : -10 30 35 65 +!!~ globe: +!cso.sim-catalogue.domain : -180 180 -90 90 + +! figure size (inches), default is (8,6): +cso.sim-catalogue.figsize : ${my.region.figsize} + +! format for timestamp in title, here just the day: +cso.sim-catalogue.title.tfmt : %Y-%m-%d + +! renew existing files? +!cso.sim-catalogue.renew : False +cso.sim-catalogue.renew : True + +! variables to be plotted: +cso.sim-catalogue.vars : yr ys ya + +! variable: +cso.sim-catalogue.var.yr.source : data:yr +! annote: +cso.sim-catalogue.var.yr.long_name : CrIS NH3 retrieval +! convert units: +cso.sim-catalogue.var.yr.units : umol/m2 +! style: +cso.sim-catalogue.var.yr.vmin : 0.0 +cso.sim-catalogue.var.yr.vmax : 500.0 +cso.sim-catalogue.var.yr.cmap : colors="hot_r" + +! variable: +cso.sim-catalogue.var.ys.source : state:ys +! annote: +cso.sim-catalogue.var.ys.long_name : EMEP CrIS NH3 simulation +! convert units: +cso.sim-catalogue.var.ys.units : umol/m2 +! style: +cso.sim-catalogue.var.ys.vmin : ${cso.sim-catalogue.var.yr.vmin} +cso.sim-catalogue.var.ys.vmax : ${cso.sim-catalogue.var.yr.vmax} +cso.sim-catalogue.var.ys.cmap : ${cso.sim-catalogue.var.yr.cmap} + +! variable: +cso.sim-catalogue.var.ya.source : data:ya +! annote: +cso.sim-catalogue.var.ya.long_name : CrIS NH3 prior +! convert units: +cso.sim-catalogue.var.ya.units : umol/m2 +! style: +cso.sim-catalogue.var.ya.vmin : ${cso.sim-catalogue.var.yr.vmin} +cso.sim-catalogue.var.ya.vmax : ${cso.sim-catalogue.var.yr.vmax} +cso.sim-catalogue.var.ya.cmap : ${cso.sim-catalogue.var.yr.cmap} + + + +!----------------------------------------------------------- +! sim catalogue index +!----------------------------------------------------------- + +! target location: +cso.sim-catalogue-index.outdir : ${my.work}/CSO-sim-catalogue/index + +! title: +cso.sim-catalogue-index.header : CSO catalogue +! show info on created page? +cso.sim-catalogue-index.info : True + +! create new page for each value? +cso.sim-catalogue-index.newpage : True + +! content type: +cso.sim-catalogue-index.type : list +! define row values: +cso.sim-catalogue-index.name : month +cso.sim-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 month', '%Y-%m' ) + +! create new page for each value: +cso.sim-catalogue-index.month.newpage : True +! content type: +cso.sim-catalogue-index.month.type : table-row +! define row values: +cso.sim-catalogue-index.month.name : basename +cso.sim-catalogue-index.month.values : CsvFile( '../%{month[0:4]}/%{month[5:7]}/basenames.csv' ) + +! content type: +cso.sim-catalogue-index.month.basename.type : table-col +! define column values: +cso.sim-catalogue-index.month.basename.name : var +cso.sim-catalogue-index.month.basename.values : ${cso.sim-catalogue.vars} + +! content type: +cso.sim-catalogue-index.month.basename.var.type : img +! define image: +cso.sim-catalogue-index.month.basename.var.img : ../%{month[0:4]}/%{month[5:7]}/%{basename}_%{var}.png +cso.sim-catalogue-index.month.basename.var.kwargs : height=400 + + + +!====================================================================== +!=== +!=== gridded simulated orbits +!=== +!====================================================================== + + +!----------------------------------------------------------- +! gridded orbits +!----------------------------------------------------------- + +! time range: +cso.sim-gridded.timerange.start : ${my.timerange.start} +cso.sim-gridded.timerange.end : ${my.timerange.end} +! step is one of: hour | day | month +cso.sim-gridded.timerange.step : monthly +!cso.sim-gridded.timerange.step : hour + +! renew existing files? +cso.sim-gridded.renew : True +!cso.sim-gridded.renew : False + +! target directory, incl. subdir for resolution and filters: +my.sim-gridded.dir : ${my.work}/CSO-sim-gridded/r02x02 + +!~ + +! grid definition: +!!~ same as pixel selection on conversion: +!cso.sim-gridded.grid.west : ${my.region.west} +!cso.sim-gridded.grid.east : ${my.region.east} +!cso.sim-gridded.grid.south : ${my.region.south} +!cso.sim-gridded.grid.north : ${my.region.north} +!! resolution: +!cso.sim-gridded.grid.dlon : 0.1 +!cso.sim-gridded.grid.dlat : 0.1 +! +!~ observation operator tutorial: +cso.sim-gridded.grid.west : -10 +cso.sim-gridded.grid.east : 30 +cso.sim-gridded.grid.south : 35 +cso.sim-gridded.grid.north : 65 +! resolution: +cso.sim-gridded.grid.dlon : 0.2 +cso.sim-gridded.grid.dlat : 0.2 + +! 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.sim-gridded.mapping.levels : 5 + +!~ + +! keywords for source files; +! the first one should have the footprints: +cso.sim-gridded.sources : data state + +! listing file for simulation output: +! - time templates are evaluated +! - index column is assumed to be "filename" and holds the name of the "data" file, +! for the other sources ("state" etc) there should be columns "filename_state" etc. +cso.sim-gridded.source.listing : ${CSO_PREFIX}/oper/listing.csv + +!~ + +! keywords for filters: +!cso.sim-gridded.filters : quality +cso.sim-gridded.filters : + +!! minimum quality value required: +!cso.sim-gridded.filter.quality.var : qa_value +!cso.sim-gridded.filter.quality.type : min +!cso.sim-gridded.filter.quality.min : 0.8 +!cso.sim-gridded.filter.quality.units : 1 + +!~ + +! output frequency: +! hourly (default) | daily | monthly | yearly +cso.sim-gridded.output.freq : monthly + +! keywords for output files: +cso.sim-gridded.output.files : all + +! target file, might contain templates: +! %Y,%m,etc : time values +! %{basename} : basename (without extension) of first source file +cso.sim-gridded.output.all.filename : ${my.sim-gridded.dir}/CSO_output_%Y%m_gridded_${cso.sim-gridded.timerange.step}.nc + +! data variables to be created: +!cso.sim-gridded.output.all.vars : yr ys +cso.sim-gridded.output.all.vars : yr ys mod_col xrc_log xrc_lin + +! input variables: +! data:yr : from data file +! state:ys : from state file +cso.sim-gridded.output.all.yr.source : data:yr +cso.sim-gridded.output.all.ys.source : state:ys +cso.sim-gridded.output.all.mod_col.source : state:mod_col +cso.sim-gridded.output.all.xrc_log.source : state:xrc_log +cso.sim-gridded.output.all.xrc_lin.source : state:xrc_lin + +! remove last dimension ("retr") if equal to 1? +cso.sim-gridded.output.squeeze : False + + +!----------------------------------------------------------- +! catalogue of gridded simulations +!----------------------------------------------------------- + +! time range: +cso.sim-gridded-catalogue.timerange.start : ${my.timerange.start} +cso.sim-gridded-catalogue.timerange.end : ${my.timerange.end} + +! time resolutions: +!cso.sim-gridded-catalogue.timerange.steps : monthly yearly +cso.sim-gridded-catalogue.timerange.steps : monthly + +! renew existing files? +cso.sim-gridded-catalogue.renew : True +!cso.sim-gridded-catalogue.renew : False + +! target files, time tempates and variable name are replaced: +cso.sim-gridded-catalogue.monthly.output.file : ${my.sim-gridded.dir}__catalogue/CrIS_NH3_%Y%m_gridded_%{var}.png +cso.sim-gridded-catalogue.yearly.output.file : ${my.sim-gridded.dir}__catalogue/CrIS_NH3_%Y_gridded_%{var}.png + +! figure size (inches), default is (8,6): +cso.sim-gridded-catalogue.figsize : ${my.region.figsize} + +! input files: +#for VAR in ${cso.sim-gridded-catalogue.vars} +cso.sim-gridded-catalogue.monthly.var.VAR.input.file : ${my.sim-gridded.dir}/CSO_output_%Y%m_gridded_monthly.nc +cso.sim-gridded-catalogue.yearly.var.VAR.input.file : ${my.sim-gridded.dir}/CSO_output_%Y_gridded_yearly.nc +#endfor + +! variables to be plotted: +cso.sim-gridded-catalogue.vars : yr ys ys-yr mod_col xrc_log xrc_lin + +! variable: +cso.sim-gridded-catalogue.var.yr.input.var : yr +! annote: +cso.sim-gridded-catalogue.var.yr.long_name : CrIS NH3 retrieval +! convert units: +cso.sim-gridded-catalogue.var.yr.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.yr.vmin : 0.0 +cso.sim-gridded-catalogue.var.yr.vmax : 300.0 +cso.sim-gridded-catalogue.var.yr.cmap : colors="hot_r" + +! variable: +cso.sim-gridded-catalogue.var.ys.input.var : ys +! annote: +cso.sim-gridded-catalogue.var.ys.long_name : EMEP CrIS NH3 simulation +! convert units: +cso.sim-gridded-catalogue.var.ys.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.ys.vmin : ${cso.sim-gridded-catalogue.var.yr.vmin} +cso.sim-gridded-catalogue.var.ys.vmax : ${cso.sim-gridded-catalogue.var.yr.vmax} +cso.sim-gridded-catalogue.var.ys.cmap : ${cso.sim-gridded-catalogue.var.yr.cmap} + +! annote: +cso.sim-gridded-catalogue.var.ys-yr.long_name : EMEP CrIS NH3 simulation minus retrieval +! convert units: +cso.sim-gridded-catalogue.var.ys-yr.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.ys-yr.vmin : -100 +cso.sim-gridded-catalogue.var.ys-yr.vmax : 100 +cso.sim-gridded-catalogue.var.ys-yr.cmap : colors="RdYlBu_r" + +! variable: +cso.sim-gridded-catalogue.var.mod_col.input.var : mod_col +! annote: +cso.sim-gridded-catalogue.var.mod_col.long_name : EMEP NH3 column (CrIS pixels) +! convert units: +cso.sim-gridded-catalogue.var.mod_col.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.mod_col.vmin : ${cso.sim-gridded-catalogue.var.yr.vmin} +cso.sim-gridded-catalogue.var.mod_col.vmax : ${cso.sim-gridded-catalogue.var.yr.vmax} +cso.sim-gridded-catalogue.var.mod_col.cmap : ${cso.sim-gridded-catalogue.var.yr.cmap} + +! variable: +cso.sim-gridded-catalogue.var.xrc_log.input.var : xrc_log +! annote: +cso.sim-gridded-catalogue.var.xrc_log.long_name : EMEP CrIS NH3 simulation (A_log) +! convert units: +cso.sim-gridded-catalogue.var.xrc_log.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.xrc_log.vmin : ${cso.sim-gridded-catalogue.var.yr.vmin} +cso.sim-gridded-catalogue.var.xrc_log.vmax : ${cso.sim-gridded-catalogue.var.yr.vmax} +cso.sim-gridded-catalogue.var.xrc_log.cmap : ${cso.sim-gridded-catalogue.var.yr.cmap} + +! variable: +cso.sim-gridded-catalogue.var.xrc_lin.input.var : xrc_lin +! annote: +cso.sim-gridded-catalogue.var.xrc_lin.long_name : EMEP CrIS NH3 simulation (A_lin) +! convert units: +cso.sim-gridded-catalogue.var.xrc_lin.units : umol/m2 +! style: +cso.sim-gridded-catalogue.var.xrc_lin.vmin : ${cso.sim-gridded-catalogue.var.yr.vmin} +cso.sim-gridded-catalogue.var.xrc_lin.vmax : ${cso.sim-gridded-catalogue.var.yr.vmax} +cso.sim-gridded-catalogue.var.xrc_lin.cmap : ${cso.sim-gridded-catalogue.var.yr.cmap} + + + +!----------------------------------------------------------- +! gridded catalogue index +!----------------------------------------------------------- + +! target location: +cso.sim-gridded-catalogue-index.outdir : ${my.sim-gridded.dir}__catalogue + +! title: +cso.sim-gridded-catalogue-index.header : CSO catalogue +! show info on created page? +cso.sim-gridded-catalogue-index.info : True + +! content type: +cso.sim-gridded-catalogue-index.type : sections +cso.sim-gridded-catalogue-index.values : yearly monthly +!cso.sim-gridded-catalogue-index.values : monthly + +#for TRES in ${cso.sim-gridded-catalogue-index.values} + +! annote: +cso.sim-gridded-catalogue-index.TRES.header : TRES + +! content type: +cso.sim-gridded-catalogue-index.TRES.type : table-row +! define row values: +cso.sim-gridded-catalogue-index.TRES.name : period +#if "TRES" == "monthly" +cso.sim-gridded-catalogue-index.TRES.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 month', '%Y%m' ) +#elif "TRES" == "yearly" +cso.sim-gridded-catalogue-index.TRES.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 year', '%Y' ) +#endif + +! content type: +cso.sim-gridded-catalogue-index.TRES.period.type : table-col +! define column values: +cso.sim-gridded-catalogue-index.TRES.period.name : var +cso.sim-gridded-catalogue-index.TRES.period.values : ${cso.sim-gridded-catalogue.vars} + +! content type: +cso.sim-gridded-catalogue-index.TRES.period.var.type : img +! define image: +cso.sim-gridded-catalogue-index.TRES.period.var.img : CrIS_NH3_%{period}_gridded_%{var}.png +cso.sim-gridded-catalogue-index.TRES.period.var.kwargs : height=400 + +#endfor + + +!====================================================================== +!=== +!=== end +!=== +!====================================================================== + diff --git a/config/CrIS/cso-user-settings.rc b/config/CrIS/cso-user-settings.rc new file mode 100644 index 0000000000000000000000000000000000000000..37025fb81b0966545cbab97a0046aa30a83de4e4 --- /dev/null +++ b/config/CrIS/cso-user-settings.rc @@ -0,0 +1,133 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! +!!! CSO common configuration +!!! +!!! Base settings that are used by multiple tasks: +!!! - time range(s) +!!! - target domain(s) +!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +!----------------------------------------------------------- +! id's +!----------------------------------------------------------- + +! file format: +my.cso.format : 1.0 + +! file format convention: +my.cso.convention : CF-1.8 + + +!----------------------------------------------------------- +! domain +!----------------------------------------------------------- + +! +! Used for: +! - orbit selection durning download +! - pixel selection +! - map plots +! + +!! region name: +!my.region : CAMS +!! CAMS regional ensemble domain: +!my.region.west : -30.0 +!my.region.east : 45.0 +!my.region.south : 30.0 +!my.region.north : 76.0 +!! size of map figures for this region: +!my.region.figsize : (6,5) + +! region name: +my.region : xEMEP +! CAMS regional ensemble domain: +my.region.west : -30.0 +my.region.east : 90.0 +my.region.south : 30.0 +my.region.north : 82.0 +! size of map figures for this region: +my.region.figsize : (8,6) + + +!! region name: +!my.region : globe +!! global domain: +!my.region.west : -180.0 +!my.region.east : 180.0 +!my.region.south : -90.0 +!my.region.north : 90.0 +!! size of map figures for this region: +!my.region.figsize : (8,6) + + +!---------------------------------------------------------- +! timerange +!---------------------------------------------------------- + +! inquire full timerange: +my.inquire.timerange.start : 2011-10-01 00:00 +my.inquire.timerange.end : 2026-12-31 23:59 + +! process single year: +my.timerange.start : 2024-01-01 00:00 +my.timerange.end : 2024-12-31 23:59 + + +!---------------------------------------------------------- +! user specific settings: +!---------------------------------------------------------- + +!.............................. +#if "${USER}" == "you" +!.............................. + +! Attributes written to output files. +my.attr.author : Your Name +my.attr.institution : CSO +my.attr.email : Your.Name@cso.org + +! base location for work directories: +my.work : /Scratch/${USER}/CSO-Test-CrIS + +!.............................. +#else +#error unsupported USER "${USER}" +#endif +!.............................. + + +!---------------------------------------------------------- +! job step defaults +!---------------------------------------------------------- + +! run jobs in foreground: +*.script.class : utopya.UtopyaJobScriptForeground + +! dummy value, will be defined when running in virtrual environment: +VIRTUAL_ENV : +! running in virutual envionment? +#if "${VIRTUAL_ENV}" > "" +! interpretor from virtual enviornment, the system path is set automatically: +*.shell : ${VIRTUAL_ENV}/bin/python3 +#else +! search path for python modules: +*.pypath : ${CSO_PREFIX}/src:${CSO_PREFIX}/src/utopya:${CSO_PREFIX}/src/cso +#endif + +! work directory for jobs; +*.workdir : ${my.work}/__NAME2PATH__ + +! for new job files, use jobtree settings from this file: +*.rcfile : ${__filename__} + + + +!---------------------------------------------------------- +! end +!---------------------------------------------------------- + + + diff --git a/config/CrIS/cso.rc b/config/CrIS/cso.rc index a3d4e5814e28b567207b090d5217bb24dfa33528..b086a3e4568de54e8f33b5f05bc590c84ec7ed4e 100644 --- a/config/CrIS/cso.rc +++ b/config/CrIS/cso.rc @@ -2,1529 +2,181 @@ !!! !!! CSO - CAMS Satellite Operator !!! -!!! Settings for CrIS/NH3. +!!! Settings for project. !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -!---------------------------------------------------------- -! job tree -!---------------------------------------------------------- - -! class to create a job tree: -cso.class : utopya.UtopyaJobTree -! list of sub-elements: -cso.elements : cris-nh3 - -! class to create a job tree: -cso.cris-nh3.class : utopya.UtopyaJobTree - -! list of sub-elements: -!cso.cris-nh3.elements : inquire \ -! convert listing \ -! catalogue - -! ... preprocessor steps one by one: -cso.cris-nh3.elements : inquire -!cso.cris-nh3.elements : convert listing -!cso.cris-nh3.elements : listing -!cso.cris-nh3.elements : catalogue -! -! ... extra: gridded files from converted orbits: -!cso.cris-nh3.elements : gridded -!cso.cris-nh3.elements : gridded-catalogue -! -! ... create super-observations -!cso.cris-nh3.elements : superobs -!cso.cris-nh3.elements : superobs-catalogue -! -! ... after running the obs.oper: -!cso.cris-nh3.elements : sim-catalogue -!cso.cris-nh3.elements : sim-gridded -!cso.cris-nh3.elements : sim-gridded-catalogue - -! * - -! single step: -cso.cris-nh3.inquire.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.inquire.tasks : table-dataspace plot -!~ task: inquire available files: -cso.cris-nh3.inquire.table-dataspace.class : cso.CSO_DataSpace_Inquire -cso.cris-nh3.inquire.table-dataspace.args : '${__filename__}', \ - rcbase='cso.cris-nh3.inquire-table-dataspace' -!~ task: create plot of available versions: -cso.cris-nh3.inquire.plot.class : cso.CSO_Inquire_Plot -cso.cris-nh3.inquire.plot.args : '${__filename__}', \ - rcbase='cso.cris-nh3.inquire-plot' - -! * - -! single step: -cso.cris-nh3.convert.class : utopya.UtopyaJobStep -! task: -cso.cris-nh3.convert.task.class : cso.CSO_CrIS_Convert -cso.cris-nh3.convert.task.args : '${__filename__}', \ - rcbase='cso.cris-nh3.convert' - -! * - -! single step: -cso.cris-nh3.listing.class : utopya.UtopyaJobStep -! task: -cso.cris-nh3.listing.task.class : cso.CSO_CrIS_Listing -cso.cris-nh3.listing.task.args : '${__filename__}', \ - rcbase='cso.cris-nh3.listing' - -! * - -! single step: -cso.cris-nh3.catalogue.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.catalogue.tasks : figs index -! catalogue creation task: -cso.cris-nh3.catalogue.figs.class : cso.CSO_Catalogue -cso.cris-nh3.catalogue.figs.args : '${__filename__}', \ - rcbase='cso.cris-nh3.catalogue' -! indexer task: -cso.cris-nh3.catalogue.index.class : utopya.Indexer -cso.cris-nh3.catalogue.index.args : '${__filename__}', \ - rcbase='cso.cris-nh3.catalogue-index' - -! * - -! single step: -cso.cris-nh3.sim-catalogue.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.sim-catalogue.tasks : figs index -! catalogue creation task: -cso.cris-nh3.sim-catalogue.figs.class : cso.CSO_SimCatalogue -cso.cris-nh3.sim-catalogue.figs.args : '${__filename__}', \ - rcbase='cso.cris-nh3.sim-catalogue' -! indexer task: -cso.cris-nh3.sim-catalogue.index.class : utopya.Indexer -cso.cris-nh3.sim-catalogue.index.args : '${__filename__}', \ - rcbase='cso.cris-nh3.sim-catalogue-index' - -! -! * super observations -! - -! single step: -cso.cris-nh3.superobs.class : utopya.UtopyaJobStep -! tasks: -cso.cris-nh3.superobs.tasks : create listing -!~ create: -cso.cris-nh3.superobs.create.class : cso.CSO_SuperObs -cso.cris-nh3.superobs.create.args : '${__filename__}', rcbase='cso.cris-nh3.superobs' -!~ create: -cso.cris-nh3.superobs.listing.class : cso.CSO_CrIS_Listing -cso.cris-nh3.superobs.listing.args : '${__filename__}', rcbase='cso.cris-nh3.superobs-listing' - -! * - -! single step: -cso.cris-nh3.superobs-catalogue.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.superobs-catalogue.tasks : figs index -! catalogue creation task: -cso.cris-nh3.superobs-catalogue.figs.class : cso.CSO_Catalogue -cso.cris-nh3.superobs-catalogue.figs.args : '${__filename__}', \ - rcbase='cso.cris-nh3.superobs-catalogue' -! indexer task: -cso.cris-nh3.superobs-catalogue.index.class : utopya.Indexer -cso.cris-nh3.superobs-catalogue.index.args : '${__filename__}', \ - rcbase='cso.cris-nh3.superobs-catalogue-index' - -! -! * gridded fields -! - -! single step: -cso.cris-nh3.gridded.class : utopya.UtopyaJobStep -! catalogue creation task: -cso.cris-nh3.gridded.task.class : cso.CSO_GriddedAverage -cso.cris-nh3.gridded.task.args : '${__filename__}', \ - rcbase='cso.cris-nh3.gridded' - -! * - -! single step: -cso.cris-nh3.gridded-catalogue.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.gridded-catalogue.tasks : figs index -! catalogue creation task: -cso.cris-nh3.gridded-catalogue.figs.class : cso.CSO_GriddedCatalogue -cso.cris-nh3.gridded-catalogue.figs.args : '${__filename__}', \ - rcbase='cso.cris-nh3.gridded-catalogue' -! indexer task: -cso.cris-nh3.gridded-catalogue.index.class : utopya.Indexer -cso.cris-nh3.gridded-catalogue.index.args : '${__filename__}', \ - rcbase='cso.cris-nh3.gridded-catalogue-index' - -! -! * gridded simulation fields -! - -! single step: -cso.cris-nh3.sim-gridded.class : utopya.UtopyaJobStep -! catalogue creation task: -cso.cris-nh3.sim-gridded.task.class : cso.CSO_GriddedAverage -cso.cris-nh3.sim-gridded.task.args : '${__filename__}', \ - rcbase='cso.cris-nh3.sim-gridded' - -! * - -! single step: -cso.cris-nh3.sim-gridded-catalogue.class : utopya.UtopyaJobStep -! two tasks: -cso.cris-nh3.sim-gridded-catalogue.tasks : figs index -! catalogue creation task: -cso.cris-nh3.sim-gridded-catalogue.figs.class : cso.CSO_GriddedCatalogue -cso.cris-nh3.sim-gridded-catalogue.figs.args : '${__filename__}', \ - rcbase='cso.cris-nh3.sim-gridded-catalogue' -! indexer task: -cso.cris-nh3.sim-gridded-catalogue.index.class : utopya.Indexer -cso.cris-nh3.sim-gridded-catalogue.index.args : '${__filename__}', \ - rcbase='cso.cris-nh3.sim-gridded-catalogue-index' - - - -!====================================================================== -!=== -!=== settings -!=== -!====================================================================== - - -!----------------------------------------------------------- -! id's -!----------------------------------------------------------- - -! file format: -my.cso.format : 1.0 - -! file format convention: -my.cso.convention : CF-1.7 - - -!----------------------------------------------------------- -! domain -!----------------------------------------------------------- - -! -! Used for: -! - orbit selection durning download -! - pixel selection -! - map plots -! - -! region name: -my.region : CAMS -! CAMS regional ensemble domain: -my.region.west : -30.0 -my.region.east : 45.0 -my.region.south : 30.0 -my.region.north : 76.0 -! size of map figures for this region: -my.region.figsize : (6,6) - -!! region name: -!my.region : globe -!! global domain: -!my.region.west : -180.0 -!my.region.east : 180.0 -!my.region.south : -90.0 -!my.region.north : 90.0 -!! size of map figures for this region: -!my.region.figsize : (8,6) - - -!---------------------------------------------------------- -! timerange -!---------------------------------------------------------- - -!! testing 3 days -!my.timerange.start : 2018-06-01 00:00 -!my.timerange.end : 2018-06-03 23:59 - -! testing 3 days -my.timerange.start : 2024-03-01 00:00 -my.timerange.end : 2024-03-03 23:59 +! dummy values for variables defined in 'cso' script, +! these will be replaced by the actual values from the environment, +! but needed for first evaluation of this file ... +CSO_PREFIX : /not/defined/yet +CSO_RCFILE : /not/defined/yet +CSO_RCDIR : /not/defined/yet !---------------------------------------------------------- ! user specific settings: !---------------------------------------------------------- -! Attributes written to output files. -my.attr.author : Your Name -my.attr.institution : CSO -my.attr.email : Your.Name@cso.org +! include user specfic settings: +#include cso-user-settings.rc -! base location for work directories: -!my.work : /work/${USER}/CSO-CrIS-NH3 -!my.work : /Scratch/${USER}/CSO-CrIS-NH3 -my.work : ${WORK}/CSO-CrIS-NH3 !---------------------------------------------------------- -! output -!---------------------------------------------------------- - -! pack variables on output: -*.output.packed : True -! zlib compression level, 0 for no compression: -*.output.complevel : 1 - - -!---------------------------------------------------------- -! job step defaults +! job tree !---------------------------------------------------------- -! run jobs in foreground: -*.script.class : utopya.UtopyaJobScriptForeground - -! dummy value, will be defined when running in virtrual environment: -VIRTUAL_ENV : -! running in virutual envionment? -#if "${VIRTUAL_ENV}" > "" -! interpretor from virtual enviornment, the system path is set automatically: -*.shell : ${VIRTUAL_ENV}/bin/python3 -#else -! search path for python modules: -*.pypath : ${CSO_PREFIX}/src:${CSO_PREFIX}/src/utopya:${CSO_PREFIX}/src/cso -#endif - -! work directory for jobs; -*.workdir : ${my.work}/__NAME2PATH__ - -! for new job files, use jobtree settings from this file: -*.rcfile : ${__filename__} - - - -!====================================================================== -!=== -!=== Inquire DataSpace -!=== -!====================================================================== - -! Obtain names of all available CrIS files. -! Stored as csv with processing type, processor version, filenames, etc. - -!! full time range: -!cso.cris-nh3.inquire-table-dataspace.timerange.start : 2018-04-30 00:00:00 -!cso.cris-nh3.inquire-table-dataspace.timerange.end : 2025-01-01 00:00:00 -! testing ... -cso.cris-nh3.inquire-table-dataspace.timerange.start : 2018-06-01 00:00:00 -cso.cris-nh3.inquire-table-dataspace.timerange.end : 2018-07-01 00:00:00 - -! API url: -cso.cris-nh3.inquire-table-dataspace.url : https://stac.dataspace.copernicus.eu/v1 - -! collection name: -cso.cris-nh3.inquire-table-dataspace.collections : sentinel-5p-l2-no2-rpro \ - sentinel-5p-l2-no2-offl -!!~ near-real time processing: -!cso.cris-nh3.inquire-table-dataspace.collections : sentinel-5p-l2-no2-nrti - -! target area; -!!~ empty for no limitation: -!cso.cris-nh3.inquire-table-dataspace.area : -!~ domain specified as: west,south,east,north -cso.cris-nh3.inquire-table-dataspace.area : ${my.region.west},${my.region.south},${my.region.east},${my.region.north} - -! output table, date of today: -cso.cris-nh3.inquire-table-dataspace.output.file : ${my.work}/Copernicus/Copernicus_CrIS_NH3_dataspace__%Y-%m-%d.csv - - -! * create plot - -! renew existing plots? -cso.cris-nh3.inquire-plot.renew : True - -! listing files: -cso.cris-nh3.inquire-plot.file : ${cso.cris-nh3.inquire-table-dataspace.output.file} -!!~ specify dates ("yyyy-mm-dd") to use historic tables, -!! default is table of today: -!cso.cris-nh3.inquire-plot.filedate : 2026-03-11 - -! annote: -cso.cris-nh3.inquire-plot.title : CrIS/NH3 %Y-%m-%d - -! output figure, date of today: -cso.cris-nh3.inquire-plot.output.file : ${my.work}/Copernicus/Copernicus_CrIS_NH3_dataspace__%Y-%m-%d.png - - -!====================================================================== -!=== -!=== convert (and download) -!=== -!====================================================================== - - -! renew existing files (True|False) ? -!cso.cris-nh3.convert.renew : True -cso.cris-nh3.convert.renew : False - -! time range: -cso.cris-nh3.convert.timerange.start : ${my.timerange.start} -cso.cris-nh3.convert.timerange.end : ${my.timerange.end} - - -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -! input files -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -! listing of available source files, created by 'inquire' job: -cso.cris-nh3.convert.inquire.file : ${my.work}/Copernicus/Copernicus_CrIS_NH3_dataspace__%Y-%m-%d.csv -!!~ historic inquire ... -!cso.cris-nh3.convert.inquire.filedate : 2026-03-25 - -! selection keyword: -my.cris-nh3.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') -! -cso.cris-nh3.convert.selection : (%{collection} == '03') and (%{processing} == 'RPRO') ; \ - (%{collection} == '03') and (%{processing} == 'OFFL') -!!~ for near-real-time processing: -!cso.cris-nh3.convert.selection : %{collection} == '03' - -! input directory; -! files are searched here or downloaded to if not present yet; -! supported templates: -! %{processing} -cso.cris-nh3.convert.input.dir : ${my.work}/Copernicus/S5P/%{processing}/NH3/%Y/%m - -! remove downloaded input files after convert? -cso.cris-nh3.convert.downloads.cleanup : False - -! selection names: -cso.cris-nh3.convert.filters : lons lats valid quality - -! filter settings: -cso.cris-nh3.convert.filter.lons.var : PRODUCT/longitude -cso.cris-nh3.convert.filter.lons.type : minmax -cso.cris-nh3.convert.filter.lons.minmax : ${my.region.west} ${my.region.east} -cso.cris-nh3.convert.filter.lons.units : degrees_east - -! filter settings: -cso.cris-nh3.convert.filter.lats.var : PRODUCT/latitude -cso.cris-nh3.convert.filter.lats.type : minmax -cso.cris-nh3.convert.filter.lats.minmax : ${my.region.south} ${my.region.north} -cso.cris-nh3.convert.filter.lats.units : degrees_north - -! skip pixel with "no data", use the "qa_value" variable to check: -cso.cris-nh3.convert.filter.valid.var : PRODUCT/qa_value -cso.cris-nh3.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" -! Recomended is qa_value>=0.75 to remove clouded and other problematic pixels; -! here use 0.5 to include retrievals over clouds and snow/ice. -cso.cris-nh3.convert.filter.quality.var : PRODUCT/qa_value -cso.cris-nh3.convert.filter.quality.type : min -cso.cris-nh3.convert.filter.quality.min : 0.5 -cso.cris-nh3.convert.filter.quality.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 -! - include start time to have different files if orbit is stored in patches -cso.cris-nh3.convert.output.filename : ${my.work}/CSO-data/${my.region}/CrIS/NH3/${my.cris-nh3.selection}/%Y/%m/CrIS_%{processing}_NH3_%{orbit}_%Y%m%dT%H%M%S.nc - -! global attributes: -cso.cris-nh3.convert.output.attrs : format Conventions \ - author institution email -! -cso.cris-nh3.convert.output.attr.format : ${my.cso.format} -cso.cris-nh3.convert.output.attr.Conventions : ${my.cso.convention} -cso.cris-nh3.convert.output.attr.author : ${my.attr.author} -cso.cris-nh3.convert.output.attr.institution : ${my.attr.institution} -cso.cris-nh3.convert.output.attr.email : ${my.attr.email} - -! no need to swap layes: -cso.cris-nh3.convert.swap_layers : False - +! class to create a job tree: +cso.class : utopya.UtopyaJobTree +! top level job is virtual: +cso.virtual : True +! list of sub-elements: +!cso.elements : copy cris1-nh3 cris2-nh3 +cso.elements : copy cris2-nh3 -! ~ variables -! which fields to be put out ? -cso.cris-nh3.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 +! ====================================================================== +! === +! === copy to workdir +! === +! ====================================================================== -! -! 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 : longiudes at centers of original 2D track -! * track_latitude : latiudes at centers of original 2D track -! * track_longitude_bounds : longiude bounds at centers of original 2D track -! * track_latitude_bounds : latiude 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) -! +! no sub list: +cso.copy.class : utopya.UtopyaJobStep -! center longitudes; remove bounds attribute, no coordinate ... -cso.cris-nh3.convert.output.var.longitude.dims : pixel -cso.cris-nh3.convert.output.var.longitude.from : PRODUCT/longitude -cso.cris-nh3.convert.output.var.longitude.attrs : { 'bounds' : None } +! default class is defined in machine specific settings; +! copy is always done in foreground to avoid that files are +! changed before the job is started: +cso.copy.script.class : utopya.UtopyaJobScriptForeground -! center latitudes; remove bounds attribute, no coordinate ... -cso.cris-nh3.convert.output.var.latitude.dims : pixel -cso.cris-nh3.convert.output.var.latitude.from : PRODUCT/latitude -cso.cris-nh3.convert.output.var.latitude.attrs : { 'bounds' : None } +!! search path to utopya modules: +!cso.copy.pypath : ${CSO_PREFIX}/py -! corner longitudes; no units in file: -cso.cris-nh3.convert.output.var.longitude_bounds.dims : pixel corner -cso.cris-nh3.convert.output.var.longitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds -cso.cris-nh3.convert.output.var.longitude_bounds.units : degrees_east -! ensure that near dateline the corners form a convex region around center -! (with some points outside [-180,+180] if necessary) -cso.cris-nh3.convert.output.var.longitude_bounds.special : longitude_bounds +! configure and build based on settings in this rcfile; +! the name of this file has been stored in the +! environment variable 'CSO_RCFILE' by the 'cso' script: +cso.copy.task.class : utopya.UtopyaCopy +cso.copy.task.args : '${CSO_RCFILE}', rcbase='cso' -! corner latitudes, no units in file: -cso.cris-nh3.convert.output.var.latitude_bounds.dims : pixel corner -cso.cris-nh3.convert.output.var.latitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds -cso.cris-nh3.convert.output.var.latitude_bounds.units : degrees_north -! original track: -!~ center lon; remove bounds attribute, no coordinate ... -cso.cris-nh3.convert.output.var.track_longitude.dims : track_scan track_pixel -cso.cris-nh3.convert.output.var.track_longitude.special : track_longitude -cso.cris-nh3.convert.output.var.track_longitude.from : PRODUCT/longitude -cso.cris-nh3.convert.output.var.track_longitude.attrs : { 'bounds' : None } -! -!~ center lat; remove bounds attribute, no coordinate ... -cso.cris-nh3.convert.output.var.track_latitude.dims : track_scan track_pixel -cso.cris-nh3.convert.output.var.track_latitude.special : track_latitude -cso.cris-nh3.convert.output.var.track_latitude.from : PRODUCT/latitude -cso.cris-nh3.convert.output.var.track_latitude.attrs : { 'bounds' : None } ! -!~ corner lons -cso.cris-nh3.convert.output.var.track_longitude_bounds.dims : track_scan track_pixel corner -cso.cris-nh3.convert.output.var.track_longitude_bounds.special : track_longitude_bounds -cso.cris-nh3.convert.output.var.track_longitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds -cso.cris-nh3.convert.output.var.track_longitude_bounds.units : degrees_east +! * config of "UtopyaCopy" ! -!~ corner lats -cso.cris-nh3.convert.output.var.track_latitude_bounds.dims : track_scan track_pixel corner -cso.cris-nh3.convert.output.var.track_latitude_bounds.special : track_latitude_bounds -cso.cris-nh3.convert.output.var.track_latitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds -cso.cris-nh3.convert.output.var.track_latitude_bounds.units : degrees_north - -! time value per scan line -cso.cris-nh3.convert.output.var.time.dims : pixel -cso.cris-nh3.convert.output.var.time.special : time-delta -cso.cris-nh3.convert.output.var.time.tref : PRODUCT/time -cso.cris-nh3.convert.output.var.time.dt : PRODUCT/delta_time - -! vertical column density: -cso.cris-nh3.convert.output.var.vcd.dims : pixel retr -cso.cris-nh3.convert.output.var.vcd.from : PRODUCT/nitrogendioxide_tropospheric_column -cso.cris-nh3.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.cris-nh3.convert.output.var.vcd_errvar.dims : pixel retr retr0 -cso.cris-nh3.convert.output.var.vcd_errvar.special : square -cso.cris-nh3.convert.output.var.vcd_errvar.from : PRODUCT/nitrogendioxide_tropospheric_column_precision_kernel -!~ skip standard name, modifier "standard_error" is not valid anymore: -cso.cris-nh3.convert.output.var.vcd_errvar.attrs : { 'standard_name' : None } - -! Convert from hybride coefficient bounds in (2,nlev) aray to 3D half level pressure: -cso.cris-nh3.convert.output.var.pressure.dims : pixel layeri -cso.cris-nh3.convert.output.var.pressure.special : hybounds_to_pressure -cso.cris-nh3.convert.output.var.pressure.sp : PRODUCT/SUPPORT_DATA/INPUT_DATA/surface_pressure -cso.cris-nh3.convert.output.var.pressure.hyab : PRODUCT/tm5_constant_a -cso.cris-nh3.convert.output.var.pressure.hybb : PRODUCT/tm5_constant_b -cso.cris-nh3.convert.output.var.pressure.units : Pa - -! (total) airmass factor: -cso.cris-nh3.convert.output.var.amf.dims : pixel retr -cso.cris-nh3.convert.output.var.amf.from : PRODUCT/air_mass_factor_total -cso.cris-nh3.convert.output.var.amf.attrs : { 'coordinates' : None, 'ancillary_variables' : None } - -! tropospheric airmass factor: -cso.cris-nh3.convert.output.var.amf_trop.dims : pixel retr -cso.cris-nh3.convert.output.var.amf_trop.from : PRODUCT/air_mass_factor_troposphere -cso.cris-nh3.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.cris-nh3.convert.output.var.nla.dims : pixel retr -cso.cris-nh3.convert.output.var.nla.dtype : i2 -cso.cris-nh3.convert.output.var.nla.from : PRODUCT/tm5_tropopause_layer_index -cso.cris-nh3.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.cris-nh3.convert.output.var.kernel_trop.dims : pixel layer retr -cso.cris-nh3.convert.output.var.kernel_trop.special : kernel_trop -cso.cris-nh3.convert.output.var.kernel_trop.avk : PRODUCT/averaging_kernel -cso.cris-nh3.convert.output.var.kernel_trop.amf : PRODUCT/air_mass_factor_total -cso.cris-nh3.convert.output.var.kernel_trop.amft : PRODUCT/air_mass_factor_troposphere -cso.cris-nh3.convert.output.var.kernel_trop.troplayer : PRODUCT/tm5_tropopause_layer_index -cso.cris-nh3.convert.output.var.kernel_trop.attrs : { 'coordinates' : None, 'ancillary_variables' : None } - -! cloud property: -cso.cris-nh3.convert.output.var.cloud_fraction.dims : pixel -cso.cris-nh3.convert.output.var.cloud_fraction.from : PRODUCT/SUPPORT_DATA/INPUT_DATA/cloud_fraction_crb -cso.cris-nh3.convert.output.var.cloud_fraction.attrs : { 'coordinates' : None, 'source' : None } - -! cloud property: -cso.cris-nh3.convert.output.var.cloud_radiance_fraction.dims : pixel -cso.cris-nh3.convert.output.var.cloud_radiance_fraction.from : PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/cloud_radiance_fraction_nitrogendioxide_window -cso.cris-nh3.convert.output.var.cloud_radiance_fraction.attrs : { 'coordinates' : None, 'ancillary_variables' : None } - -! quality flag: -cso.cris-nh3.convert.output.var.qa_value.dims : pixel -cso.cris-nh3.convert.output.var.qa_value.from : PRODUCT/qa_value -!~ skip some attributes, cf-checker complains ... -cso.cris-nh3.convert.output.var.qa_value.attrs : { 'valid_min' : None, 'valid_max' : None } - - -!====================================================================== -!=== -!=== listing -!=== -!====================================================================== - -! csv file that will hold records per file with: -! - timerange of pixels in file -! - orbit number -cso.cris-nh3.listing.file : ${my.work}/CSO-data/${my.region}/CrIS/NH3/${my.cris-nh3.selection}/listing.csv - -! renew table if file already exists? -cso.cris-nh3.listing.renew : True - -! time range: -cso.cris-nh3.listing.timerange.start : ${my.timerange.start} -cso.cris-nh3.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.cris-nh3.listing.patterns : %Y/%m/CrIS_*.nc - -! extra columns to be added, read from global attributes: -cso.cris-nh3.listing.xcolumns : orbit - - -!====================================================================== -!=== -!=== catalogue -!=== -!====================================================================== - -! listing file with filenames/timerange. -cso.cris-nh3.catalogue.input.listing : ${cso.cris-nh3.listing.file} - -! time range: -cso.cris-nh3.catalogue.timerange.start : ${my.timerange.start} -cso.cris-nh3.catalogue.timerange.end : ${my.timerange.end} - -! target filenames; templates: -! - time values -! - %{orbit} : from listing -! - %{varname} for variable -cso.cris-nh3.catalogue.output.file : ${my.work}/CSO-data-catalogue/${my.region}/CrIS/NH3/${my.cris-nh3.selection}/%Y/%m/%d/CrIS_NH3_%{orbit}__%{varname}.png - -! map domain (west east south north) -cso.cris-nh3.catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} -! figure size (inches), default is (8,6): -cso.cris-nh3.catalogue.figsize : ${my.region.figsize} -! renew existing files? -!cso.cris-nh3.catalogue.renew : False -cso.cris-nh3.catalogue.renew : True +! no need to remove existing build directory if present ... +cso.copy.new : False -! variables to be plotted: -cso.cris-nh3.catalogue.vars : vcd vcd_errvar qa_value \ - amf amf_trop nla \ - cloud_fraction cloud_radiance_fraction +! prefix for destination of source and script files +! (base path for subdirectories src, py, etc): +cso.copy.prefix : ${my.work} -!! color for no-data values in track, default '0.8' (gray): -!cso.cris-nh3.catalogue.color_nan : white +! no extension to build directory need (no objects created) +cso.copy.prefix.extensions : -!! extra keyword arguments for map: -!cso.cris-nh3.catalogue.map : resolution='h' +! copy will consist of following subdirs: +cso.copy.subdirs : rc -! convert units: -cso.cris-nh3.catalogue.var.vcd.units : umol/m2 -! style: -cso.cris-nh3.catalogue.var.vcd.vmin : 0.0 -cso.cris-nh3.catalogue.var.vcd.vmax : 100.0 +! directories to be inlcuded in copy, +! otherwise only files are copied: +cso.copy.incdirs : -! show error as std.dev, convert to vcd units: -cso.cris-nh3.catalogue.var.vcd_errvar.units : umol/m2 -! style: -cso.cris-nh3.catalogue.var.vcd_errvar.vmax : 100.0 +! skip files matching these filename patterns +! (tempoary editor files, compiled modules, etc) +cso.copy.skip : .#* *~ *.pyc .DS* -! style: -cso.cris-nh3.catalogue.var.amf.vmin : 0.0 -cso.cris-nh3.catalogue.var.amf.vmax : 4.0 +! list of source directories to be copied; +! here empty, only settings files will be copied: +cso.copy.dirs : +! copy settings to "rc": +cso.copy.rc.dirs : ${CSO_RCDIR} -! style: -cso.cris-nh3.catalogue.var.amf_trop.vmin : 0.0 -cso.cris-nh3.catalogue.var.amf_trop.vmax : 4.0 +! write evaluated rcfile: +cso.copy.rcwrite : ${my.work}/cso.rc -! style: -cso.cris-nh3.catalogue.var.nla.vmin : 1 -cso.cris-nh3.catalogue.var.nla.vmax : 34 -! style: -cso.cris-nh3.catalogue.var.qa_value.vmin : 0.5 -cso.cris-nh3.catalogue.var.qa_value.vmax : 1.0 -cso.cris-nh3.catalogue.var.qa_value.colors : ['red','yellow','green'] -! style: -cso.cris-nh3.catalogue.var.cloud_fraction.vmax : 1.0 -cso.cris-nh3.catalogue.var.cloud_fraction.colors : ['blue','cyan','white'] -! style: -cso.cris-nh3.catalogue.var.cloud_radiance_fraction.vmax : 1.0 -cso.cris-nh3.catalogue.var.cloud_radiance_fraction.colors : ['blue','cyan','white'] +! ====================================================================== +! === +! === CrIS products +! === +! ====================================================================== -!----------------------------------------------------------- -! catalogue index -!----------------------------------------------------------- +#for _PRODUCT_ in cris1-nh3 cris2-nh3 -! target location: -cso.cris-nh3.catalogue-index.outdir : ${my.work}/CSO-data-catalogue/${my.region}/CrIS/NH3/${my.cris-nh3.selection} - -! title: -cso.cris-nh3.catalogue-index.header : CSO catalogue -! show info on created page? -cso.cris-nh3.catalogue-index.info : True - -! create new page for each value? -cso.cris-nh3.catalogue-index.newpage : True - -! content type: -cso.cris-nh3.catalogue-index.type : list -! define row values: -cso.cris-nh3.catalogue-index.name : date -cso.cris-nh3.catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) - -! create new page for each value: -cso.cris-nh3.catalogue-index.date.newpage : True -! content type: -cso.cris-nh3.catalogue-index.date.type : table-row -! define row values: -cso.cris-nh3.catalogue-index.date.name : orbit -cso.cris-nh3.catalogue-index.date.values : CsvFile( '%{date[0:4]}/%{date[4:6]}/%{date[6:8]}/orbits.csv' ) - -! content type: -cso.cris-nh3.catalogue-index.date.orbit.type : table-col -! define column values: -cso.cris-nh3.catalogue-index.date.orbit.name : var -cso.cris-nh3.catalogue-index.date.orbit.values : ${cso.cris-nh3.catalogue.vars} - -! content type: -cso.cris-nh3.catalogue-index.date.orbit.var.type : img -! define image: -cso.cris-nh3.catalogue-index.date.orbit.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/CrIS_NH3_%{orbit}__%{var}.png -cso.cris-nh3.catalogue-index.date.orbit.var.kwargs : height=300 - - - -!====================================================================== -!=== -!=== gridded orbits -!=== -!====================================================================== - - -!----------------------------------------------------------- -! gridded orbits -!----------------------------------------------------------- - -! time range: -cso.cris-nh3.gridded.timerange.start : ${my.timerange.start} -cso.cris-nh3.gridded.timerange.end : ${my.timerange.end} -! create one gridded file per hour: -cso.cris-nh3.gridded.timerange.step : hour - -! renew existing files? -cso.cris-nh3.gridded.renew : True - -! keyword used for subdir for resolution and filters: -my.gridded.subdir : ${my.region}__r01x01__qa08 - -!~ - -! grid definition: -!~ same as pixel selection on conversion: -cso.cris-nh3.gridded.grid.west : ${my.region.west} -cso.cris-nh3.gridded.grid.east : ${my.region.east} -cso.cris-nh3.gridded.grid.south : ${my.region.south} -cso.cris-nh3.gridded.grid.north : ${my.region.north} -! resolution: -cso.cris-nh3.gridded.grid.dlon : 0.1 -cso.cris-nh3.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.cris-nh3.gridded.mapping.levels : 5 - -!~ - -! keywords for source files; -! the first one should have the footprints; -! here the only source are the converted files: -cso.cris-nh3.gridded.sources : data - -! input files for each source type: -!~ here: specify listing file, -! this is only supported for a single source -cso.cris-nh3.gridded.source.data.listing : ${cso.cris-nh3.listing.file} -!!~ alternative: filename patterns with time templates, -!! but here the source files do not have time stamps -!cso.cris-nh3.gridded.source.data.filenames : ${my.work}/CSO-data/CrIS/RPRO/NH3/${my.region}/%Y/%m/CrIS_*.nc - -!~ - -! keywords for filters: -cso.cris-nh3.gridded.filters : quality - -! minimum quality value required: -cso.cris-nh3.gridded.filter.quality.var : qa_value -cso.cris-nh3.gridded.filter.quality.type : min -cso.cris-nh3.gridded.filter.quality.min : 0.8 -cso.cris-nh3.gridded.filter.quality.units : 1 - -!~ - -! target file, might contain templates: -! %Y,%m,etc : time values -cso.cris-nh3.gridded.output.file : ${my.work}/CSO-gridded/${my.gridded.subdir}/%Y/%m/CrIS_NH3_%Y%m%d_%H%M_gridded.nc - -! pack floats as short values? -cso.cris-nh3.gridded.output.packed : True -! zlib compression level (default 1, 0 for no compression): -cso.cris-nh3.gridded.output.complevel : 1 - -! data variables to be created: -cso.cris-nh3.gridded.output.vars : yr - -! input variables: -! data:vcd : variable "vcd" from source "data" -cso.cris-nh3.gridded.output.yr.source : data:vcd - - -!----------------------------------------------------------- -! catalogue of gridded fields -!----------------------------------------------------------- - -! time range: -cso.cris-nh3.gridded-catalogue.timerange.start : ${my.timerange.start} -cso.cris-nh3.gridded-catalogue.timerange.end : ${my.timerange.end} -! create one gridded file per hour: -cso.cris-nh3.gridded-catalogue.timerange.step : hour - -! renew existing files? -cso.cris-nh3.gridded-catalogue.renew : True -!cso.cris-nh3.gridded-catalogue.renew : False - -! target directory for catalogue: -my.gridded-catalogue.output.dir : ${my.work}/CSO-gridded/${my.gridded.subdir}/catalogue - -! input files: -cso.cris-nh3.gridded-catalogue.input.file : ${my.work}/CSO-gridded/${my.gridded.subdir}/%Y/%m/CrIS_NH3_%Y%m%d_%H%M_gridded.nc -!!~ idem for daily average: -!cso.cris-nh3.gridded-catalogue.input.file : ${my.work}/CSO-gridded/${my.gridded.subdir}/CrIS_NH3_%Y%m%d_aver_gridded.nc - -! target files, time tempates and variable name are replaced: -cso.cris-nh3.gridded-catalogue.output.file : ${my.gridded-catalogue.output.dir}/%Y/%m/%d/CrIS_NH3_%Y%m%d_%H%M_gridded_%{var}.png -!!~ idem for daily average: -!cso.cris-nh3.gridded-catalogue.output.file : ${my.gridded-catalogue.output.dir}/%Y/%m/%d/CrIS_NH3_%Y%m%d_aver_gridded_%{var}.png - -! figure size (inches), default is (8,6): -cso.cris-nh3.gridded-catalogue.figsize : ${my.region.figsize} - -! variables to be plotted: -cso.cris-nh3.gridded-catalogue.vars : yr - -! variable: -cso.cris-nh3.gridded-catalogue.var.yr.source : yr -! convert units: -cso.cris-nh3.gridded-catalogue.var.yr.units : umol/m2 -! style: -cso.cris-nh3.gridded-catalogue.var.yr.vmin : 0.0 -cso.cris-nh3.gridded-catalogue.var.yr.vmax : 100.0 - - -!----------------------------------------------------------- -! gridded catalogue index -!----------------------------------------------------------- - -! target location: -cso.cris-nh3.gridded-catalogue-index.outdir : ${my.gridded-catalogue.output.dir} - -! title: -cso.cris-nh3.gridded-catalogue-index.header : CSO catalogue -! show info on created page? -cso.cris-nh3.gridded-catalogue-index.info : True - -! create new page for each value? -cso.cris-nh3.gridded-catalogue-index.newpage : True - -! content type: -cso.cris-nh3.gridded-catalogue-index.type : list -! define row values: -cso.cris-nh3.gridded-catalogue-index.name : date -cso.cris-nh3.gridded-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) - -! create new page for each value: -cso.cris-nh3.gridded-catalogue-index.date.newpage : True -! content type: -cso.cris-nh3.gridded-catalogue-index.date.type : table-row -! define row values: -cso.cris-nh3.gridded-catalogue-index.date.name : time -cso.cris-nh3.gridded-catalogue-index.date.values : Range( 0, 23, 1, '%2.2i00' ) - -! content type: -cso.cris-nh3.gridded-catalogue-index.date.time.type : table-col -! define column values: -cso.cris-nh3.gridded-catalogue-index.date.time.name : var -cso.cris-nh3.gridded-catalogue-index.date.time.values : ${cso.cris-nh3.gridded-catalogue.vars} - -! content type: -cso.cris-nh3.gridded-catalogue-index.date.time.var.type : img -! define image: -cso.cris-nh3.gridded-catalogue-index.date.time.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/CrIS_NH3_%{date}_%{time}_gridded_%{var}.png -cso.cris-nh3.gridded-catalogue-index.date.time.var.kwargs : height=300 - - - - -!====================================================================== -!=== -!=== super observations -!=== -!====================================================================== - -! time range: -cso.cris-nh3.superobs.timerange.start : ${my.timerange.start} -cso.cris-nh3.superobs.timerange.end : ${my.timerange.end} - -! renew existing files? -cso.cris-nh3.superobs.renew : True -!cso.cris-nh3.superobs.renew : False - -!~ - -! keyword to describe super-observations, -! here gridding to 1.0x1.0 -my.supobs.key : sup1x1__qa08 - -! grid definition: -cso.cris-nh3.superobs.grid.west : ${my.region.west} -cso.cris-nh3.superobs.grid.east : ${my.region.east} -cso.cris-nh3.superobs.grid.south : ${my.region.south} -cso.cris-nh3.superobs.grid.north : ${my.region.north} -! resolution: -cso.cris-nh3.superobs.grid.dlon : 1.0 -cso.cris-nh3.superobs.grid.dlat : 1.0 - -! mapping level from footprints to grid cells: -!!~ center only, one pixel is enough .. -!cso.cris-nh3.superobs.mapping.levels : 0 -!cso.cris-nh3.superobs.mapping.minimum_number : 0 -!~ footprint area -cso.cris-nh3.superobs.mapping.levels : 3 -cso.cris-nh3.superobs.mapping.minimum_coverage : 0.10 - -!~ - -! input listing: -cso.cris-nh3.superobs.source.listing : ${cso.cris-nh3.listing.file} - - -!~ - -! keywords for filters: -cso.cris-nh3.superobs.filters : quality - -! minimum quality value required: -cso.cris-nh3.superobs.filter.quality.var : qa_value -cso.cris-nh3.superobs.filter.quality.type : min -cso.cris-nh3.superobs.filter.quality.min : 0.8 -cso.cris-nh3.superobs.filter.quality.units : 1 - -!~ - -! output directory and filename: -cso.cris-nh3.superobs.output.file : ${my.work}/CSO-data/${my.region}/CrIS/NH3/${my.cris-nh3.selection}__${my.supobs.key}/%Y/%m/%{root}.nc - -! pack floats as short values? -cso.cris-nh3.superobs.output.packed : False -! zlib compression level (default 1, 0 for no compression): -cso.cris-nh3.superobs.output.complevel : 1 - - -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -! listing -!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -! renew table if file already exists? -cso.cris-nh3.superobs-listing.renew : True - -! time range: -cso.cris-nh3.superobs-listing.timerange.start : ${my.timerange.start} -cso.cris-nh3.superobs-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.cris-nh3.superobs-listing.file : ${my.work}/CSO-data/${my.region}/CrIS/NH3/${my.cris-nh3.selection}__${my.supobs.key}/listing.csv -cso.cris-nh3.superobs-listing.patterns : %Y/%m/CrIS_*.nc - -! extra columns to be added, read from global attributes: -cso.cris-nh3.superobs-listing.xcolumns : orbit processing processor_version - - -!----------------------------------------------------------- -! catalogue of superobs fields -!----------------------------------------------------------- - -! listing file with filenames/timerange. -cso.cris-nh3.superobs-catalogue.input.listing : ${cso.cris-nh3.superobs-listing.file} - -! time range: -cso.cris-nh3.superobs-catalogue.timerange.start : ${my.timerange.start} -cso.cris-nh3.superobs-catalogue.timerange.end : ${my.timerange.end} - -! target filenames; templates: -! - time values -! - %{orbit} : from listing -! - %{varname} for variable -cso.cris-nh3.superobs-catalogue.output.file : ${my.work}/CSO-data-catalogue__${my.supobs.key}/${my.region}/CrIS/NH3/${my.cris-nh3.selection}/%Y/%m/%d/CrIS_NH3_%{orbit}__%{varname}.png - -! map domain (west east south north) -cso.cris-nh3.superobs-catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} - -! figure size (inches), default is (8,6): -cso.cris-nh3.superobs-catalogue.figsize : ${my.region.figsize} - -! renew existing files? -!cso.cris-nh3.superobs-catalogue.renew : False -cso.cris-nh3.superobs-catalogue.renew : True - -! variables to be plotted: -cso.cris-nh3.superobs-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.cris-nh3.superobs-catalogue.color_nan : white - -!! extra keyword arguments for map: -!cso.cris-nh3.superobs-catalogue.map : resolution='h' - -! convert units: -cso.cris-nh3.superobs-catalogue.var.vcd.units : umol/m2 -! style: -cso.cris-nh3.superobs-catalogue.var.vcd.vmin : 0.0 -cso.cris-nh3.superobs-catalogue.var.vcd.vmax : 100.0 - -! show error as std.dev, convert to vcd units: -cso.cris-nh3.superobs-catalogue.var.vcd_errvar.units : umol/m2 -! style: -cso.cris-nh3.superobs-catalogue.var.vcd_errvar.vmax : 100.0 - -! style: -cso.cris-nh3.superobs-catalogue.var.amf.vmin : 0.0 -cso.cris-nh3.superobs-catalogue.var.amf.vmax : 4.0 - -! style: -cso.cris-nh3.superobs-catalogue.var.amf_trop.vmin : 0.0 -cso.cris-nh3.superobs-catalogue.var.amf_trop.vmax : 4.0 - -! style: -cso.cris-nh3.superobs-catalogue.var.nla.vmin : 1 -cso.cris-nh3.superobs-catalogue.var.nla.vmax : 34 - -! style: -cso.cris-nh3.superobs-catalogue.var.qa_value.vmin : 0.5 -cso.cris-nh3.superobs-catalogue.var.qa_value.vmax : 1.0 -cso.cris-nh3.superobs-catalogue.var.qa_value.colors : ['red','yellow','green'] - -! style: -cso.cris-nh3.superobs-catalogue.var.cloud_fraction.vmax : 1.0 -cso.cris-nh3.superobs-catalogue.var.cloud_fraction.colors : ['blue','cyan','white'] - -! style: -cso.cris-nh3.superobs-catalogue.var.cloud_radiance_fraction.vmax : 1.0 -cso.cris-nh3.superobs-catalogue.var.cloud_radiance_fraction.colors : ['blue','cyan','white'] - - -! *** catalogue index - -! target location: -cso.cris-nh3.superobs-catalogue-index.outdir : ${my.work}/CSO-data-catalogue__${my.supobs.key}/${my.region}/CrIS/NH3/${my.cris-nh3.selection} - -! title: -cso.cris-nh3.superobs-catalogue-index.header : CSO catalogue -! show info on created page? -cso.cris-nh3.superobs-catalogue-index.info : True - -! create new page for each value? -cso.cris-nh3.superobs-catalogue-index.newpage : True - -! content type: -cso.cris-nh3.superobs-catalogue-index.type : list -! define row values: -cso.cris-nh3.superobs-catalogue-index.name : date -cso.cris-nh3.superobs-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) - -! create new page for each value: -cso.cris-nh3.superobs-catalogue-index.date.newpage : True -! content type: -cso.cris-nh3.superobs-catalogue-index.date.type : table-row -! define row values: -cso.cris-nh3.superobs-catalogue-index.date.name : orbit -cso.cris-nh3.superobs-catalogue-index.date.values : CsvFile( '%{date[0:4]}/%{date[4:6]}/%{date[6:8]}/orbits.csv' ) - -! content type: -cso.cris-nh3.superobs-catalogue-index.date.orbit.type : table-col -! define column values: -cso.cris-nh3.superobs-catalogue-index.date.orbit.name : var -cso.cris-nh3.superobs-catalogue-index.date.orbit.values : ${cso.cris-nh3.superobs-catalogue.vars} - -! content type: -cso.cris-nh3.superobs-catalogue-index.date.orbit.var.type : img -! define image: -cso.cris-nh3.superobs-catalogue-index.date.orbit.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/CrIS_NH3_%{orbit}__%{var}.png -cso.cris-nh3.superobs-catalogue-index.date.orbit.var.kwargs : height=300 - - - -!====================================================================== -!=== -!=== simulation catalogue -!=== -!====================================================================== - - -!----------------------------------------------------------- -! simulation catalogue -!----------------------------------------------------------- - -! time range: -cso.cris-nh3.sim-catalogue.timerange.start : ${my.timerange.start} -cso.cris-nh3.sim-catalogue.timerange.end : ${my.timerange.end} - -! listing with "data" and "state" files: -cso.cris-nh3.sim-catalogue.input.listing : ${CSO_PREFIX}/oper/listing.csv - -! target directory for figures: -! - time values : average time of pixels in file -! full filenames includes "basename" of simulation files (without "_data.nc" or "_state.nc") -! and the variable name: -! /_.png -cso.cris-nh3.sim-catalogue.output.dir : ${my.work}/CSO-sim-catalogue/%Y/%m - -!! domain of converted data: -!cso.cris-nh3.sim-catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} -! map domain used for simulations (west east south north): -cso.cris-nh3.sim-catalogue.domain : -10 30 35 65 -!!~ globe: -!cso.cris-nh3.sim-catalogue.domain : -180 180 -90 90 - -! figure size (inches), default is (8,6): -cso.cris-nh3.sim-catalogue.figsize : ${my.region.figsize} - -! format for timestamp in title, here just the day: -cso.cris-nh3.sim-catalogue.title.tfmt : %Y-%m-%d - -! renew existing files? -!cso.cris-nh3.sim-catalogue.renew : False -cso.cris-nh3.sim-catalogue.renew : True - -! variables to be plotted: -cso.cris-nh3.sim-catalogue.vars : yr ys ya - -! variable: -cso.cris-nh3.sim-catalogue.var.yr.source : data:yr -! annote: -cso.cris-nh3.sim-catalogue.var.yr.long_name : CrIS NH3 retrieval -! convert units: -cso.cris-nh3.sim-catalogue.var.yr.units : umol/m2 -! style: -cso.cris-nh3.sim-catalogue.var.yr.vmin : 0.0 -cso.cris-nh3.sim-catalogue.var.yr.vmax : 500.0 -cso.cris-nh3.sim-catalogue.var.yr.cmap : colors="hot_r" - -! variable: -cso.cris-nh3.sim-catalogue.var.ys.source : state:ys -! annote: -cso.cris-nh3.sim-catalogue.var.ys.long_name : EMEP CrIS NH3 simulation -! convert units: -cso.cris-nh3.sim-catalogue.var.ys.units : umol/m2 -! style: -cso.cris-nh3.sim-catalogue.var.ys.vmin : ${cso.cris-nh3.sim-catalogue.var.yr.vmin} -cso.cris-nh3.sim-catalogue.var.ys.vmax : ${cso.cris-nh3.sim-catalogue.var.yr.vmax} -cso.cris-nh3.sim-catalogue.var.ys.cmap : ${cso.cris-nh3.sim-catalogue.var.yr.cmap} - -! variable: -cso.cris-nh3.sim-catalogue.var.ya.source : data:ya -! annote: -cso.cris-nh3.sim-catalogue.var.ya.long_name : CrIS NH3 prior -! convert units: -cso.cris-nh3.sim-catalogue.var.ya.units : umol/m2 -! style: -cso.cris-nh3.sim-catalogue.var.ya.vmin : ${cso.cris-nh3.sim-catalogue.var.yr.vmin} -cso.cris-nh3.sim-catalogue.var.ya.vmax : ${cso.cris-nh3.sim-catalogue.var.yr.vmax} -cso.cris-nh3.sim-catalogue.var.ya.cmap : ${cso.cris-nh3.sim-catalogue.var.yr.cmap} - - - -!----------------------------------------------------------- -! sim catalogue index -!----------------------------------------------------------- - -! target location: -cso.cris-nh3.sim-catalogue-index.outdir : ${my.work}/CSO-sim-catalogue/index - -! title: -cso.cris-nh3.sim-catalogue-index.header : CSO catalogue -! show info on created page? -cso.cris-nh3.sim-catalogue-index.info : True - -! create new page for each value? -cso.cris-nh3.sim-catalogue-index.newpage : True - -! content type: -cso.cris-nh3.sim-catalogue-index.type : list -! define row values: -cso.cris-nh3.sim-catalogue-index.name : month -cso.cris-nh3.sim-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 month', '%Y-%m' ) - -! create new page for each value: -cso.cris-nh3.sim-catalogue-index.month.newpage : True -! content type: -cso.cris-nh3.sim-catalogue-index.month.type : table-row -! define row values: -cso.cris-nh3.sim-catalogue-index.month.name : basename -cso.cris-nh3.sim-catalogue-index.month.values : CsvFile( '../%{month[0:4]}/%{month[5:7]}/basenames.csv' ) - -! content type: -cso.cris-nh3.sim-catalogue-index.month.basename.type : table-col -! define column values: -cso.cris-nh3.sim-catalogue-index.month.basename.name : var -cso.cris-nh3.sim-catalogue-index.month.basename.values : ${cso.cris-nh3.sim-catalogue.vars} - -! content type: -cso.cris-nh3.sim-catalogue-index.month.basename.var.type : img -! define image: -cso.cris-nh3.sim-catalogue-index.month.basename.var.img : ../%{month[0:4]}/%{month[5:7]}/%{basename}_%{var}.png -cso.cris-nh3.sim-catalogue-index.month.basename.var.kwargs : height=400 - - - -!====================================================================== -!=== -!=== gridded simulated orbits -!=== -!====================================================================== - - -!----------------------------------------------------------- -! gridded orbits -!----------------------------------------------------------- - -! time range: -cso.cris-nh3.sim-gridded.timerange.start : ${my.timerange.start} -cso.cris-nh3.sim-gridded.timerange.end : ${my.timerange.end} -! step is one of: hour | day | month -cso.cris-nh3.sim-gridded.timerange.step : monthly -!cso.cris-nh3.sim-gridded.timerange.step : hour - -! renew existing files? -cso.cris-nh3.sim-gridded.renew : True -!cso.cris-nh3.sim-gridded.renew : False - -! target directory, incl. subdir for resolution and filters: -my.sim-gridded.dir : ${my.work}/CSO-sim-gridded/r02x02 - -!~ - -! grid definition: -!!~ same as pixel selection on conversion: -!cso.cris-nh3.sim-gridded.grid.west : ${my.region.west} -!cso.cris-nh3.sim-gridded.grid.east : ${my.region.east} -!cso.cris-nh3.sim-gridded.grid.south : ${my.region.south} -!cso.cris-nh3.sim-gridded.grid.north : ${my.region.north} -!! resolution: -!cso.cris-nh3.sim-gridded.grid.dlon : 0.1 -!cso.cris-nh3.sim-gridded.grid.dlat : 0.1 -! -!~ observation operator tutorial: -cso.cris-nh3.sim-gridded.grid.west : -10 -cso.cris-nh3.sim-gridded.grid.east : 30 -cso.cris-nh3.sim-gridded.grid.south : 35 -cso.cris-nh3.sim-gridded.grid.north : 65 -! resolution: -cso.cris-nh3.sim-gridded.grid.dlon : 0.2 -cso.cris-nh3.sim-gridded.grid.dlat : 0.2 - -! 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.cris-nh3.sim-gridded.mapping.levels : 5 - -!~ - -! keywords for source files; -! the first one should have the footprints: -cso.cris-nh3.sim-gridded.sources : data state - -! listing file for simulation output: -! - time templates are evaluated -! - index column is assumed to be "filename" and holds the name of the "data" file, -! for the other sources ("state" etc) there should be columns "filename_state" etc. -cso.cris-nh3.sim-gridded.source.listing : ${CSO_PREFIX}/oper/listing.csv - -!~ - -! keywords for filters: -!cso.cris-nh3.sim-gridded.filters : quality -cso.cris-nh3.sim-gridded.filters : - -!! minimum quality value required: -!cso.cris-nh3.sim-gridded.filter.quality.var : qa_value -!cso.cris-nh3.sim-gridded.filter.quality.type : min -!cso.cris-nh3.sim-gridded.filter.quality.min : 0.8 -!cso.cris-nh3.sim-gridded.filter.quality.units : 1 - -!~ - -! output frequency: -! hourly (default) | daily | monthly | yearly -cso.cris-nh3.sim-gridded.output.freq : monthly - -! keywords for output files: -cso.cris-nh3.sim-gridded.output.files : all - -! target file, might contain templates: -! %Y,%m,etc : time values -! %{basename} : basename (without extension) of first source file -cso.cris-nh3.sim-gridded.output.all.filename : ${my.sim-gridded.dir}/CSO_output_%Y%m_gridded_${cso.cris-nh3.sim-gridded.timerange.step}.nc - -! data variables to be created: -!cso.cris-nh3.sim-gridded.output.all.vars : yr ys -cso.cris-nh3.sim-gridded.output.all.vars : yr ys mod_col xrc_log xrc_lin - -! input variables: -! data:yr : from data file -! state:ys : from state file -cso.cris-nh3.sim-gridded.output.all.yr.source : data:yr -cso.cris-nh3.sim-gridded.output.all.ys.source : state:ys -cso.cris-nh3.sim-gridded.output.all.mod_col.source : state:mod_col -cso.cris-nh3.sim-gridded.output.all.xrc_log.source : state:xrc_log -cso.cris-nh3.sim-gridded.output.all.xrc_lin.source : state:xrc_lin - -! remove last dimension ("retr") if equal to 1? -cso.cris-nh3.sim-gridded.output.squeeze : False - - -!----------------------------------------------------------- -! catalogue of gridded simulations -!----------------------------------------------------------- - -! time range: -cso.cris-nh3.sim-gridded-catalogue.timerange.start : ${my.timerange.start} -cso.cris-nh3.sim-gridded-catalogue.timerange.end : ${my.timerange.end} - -! time resolutions: -!cso.cris-nh3.sim-gridded-catalogue.timerange.steps : monthly yearly -cso.cris-nh3.sim-gridded-catalogue.timerange.steps : monthly - -! renew existing files? -cso.cris-nh3.sim-gridded-catalogue.renew : True -!cso.cris-nh3.sim-gridded-catalogue.renew : False - -! target files, time tempates and variable name are replaced: -cso.cris-nh3.sim-gridded-catalogue.monthly.output.file : ${my.sim-gridded.dir}__catalogue/CrIS_NH3_%Y%m_gridded_%{var}.png -cso.cris-nh3.sim-gridded-catalogue.yearly.output.file : ${my.sim-gridded.dir}__catalogue/CrIS_NH3_%Y_gridded_%{var}.png - -! figure size (inches), default is (8,6): -cso.cris-nh3.sim-gridded-catalogue.figsize : ${my.region.figsize} - -! input files: -#for VAR in ${cso.cris-nh3.sim-gridded-catalogue.vars} -cso.cris-nh3.sim-gridded-catalogue.monthly.var.VAR.input.file : ${my.sim-gridded.dir}/CSO_output_%Y%m_gridded_monthly.nc -cso.cris-nh3.sim-gridded-catalogue.yearly.var.VAR.input.file : ${my.sim-gridded.dir}/CSO_output_%Y_gridded_yearly.nc -#endfor - -! variables to be plotted: -cso.cris-nh3.sim-gridded-catalogue.vars : yr ys ys-yr mod_col xrc_log xrc_lin -!cso.cris-nh3.sim-gridded-catalogue.vars : yr ys ys-yr - -! variable: -cso.cris-nh3.sim-gridded-catalogue.var.yr.input.var : yr -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.yr.long_name : CrIS NH3 retrieval -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.yr.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.yr.vmin : 0.0 -cso.cris-nh3.sim-gridded-catalogue.var.yr.vmax : 300.0 -cso.cris-nh3.sim-gridded-catalogue.var.yr.cmap : colors="hot_r" - -! variable: -cso.cris-nh3.sim-gridded-catalogue.var.ys.input.var : ys -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.ys.long_name : EMEP CrIS NH3 simulation -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.ys.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.ys.vmin : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmin} -cso.cris-nh3.sim-gridded-catalogue.var.ys.vmax : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmax} -cso.cris-nh3.sim-gridded-catalogue.var.ys.cmap : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.cmap} - -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.ys-yr.long_name : EMEP CrIS NH3 simulation minus retrieval -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.ys-yr.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.ys-yr.vmin : -100 -cso.cris-nh3.sim-gridded-catalogue.var.ys-yr.vmax : 100 -cso.cris-nh3.sim-gridded-catalogue.var.ys-yr.cmap : colors="RdYlBu_r" - -! variable: -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.input.var : mod_col -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.long_name : EMEP NH3 column (CrIS pixels) -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.vmin : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmin} -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.vmax : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmax} -cso.cris-nh3.sim-gridded-catalogue.var.mod_col.cmap : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.cmap} - -! variable: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.input.var : xrc_log -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.long_name : EMEP CrIS NH3 simulation (A_log) -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.vmin : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmin} -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.vmax : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmax} -cso.cris-nh3.sim-gridded-catalogue.var.xrc_log.cmap : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.cmap} - -! variable: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.input.var : xrc_lin -! annote: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.long_name : EMEP CrIS NH3 simulation (A_lin) -! convert units: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.units : umol/m2 -! style: -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.vmin : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmin} -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.vmax : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.vmax} -cso.cris-nh3.sim-gridded-catalogue.var.xrc_lin.cmap : ${cso.cris-nh3.sim-gridded-catalogue.var.yr.cmap} - - - -!----------------------------------------------------------- -! gridded catalogue index -!----------------------------------------------------------- +! class to create a job tree: +cso._PRODUCT_.class : utopya.UtopyaJobTree -! target location: -cso.cris-nh3.sim-gridded-catalogue-index.outdir : ${my.sim-gridded.dir}__catalogue +!~ sub steps: +cso._PRODUCT_.elements : inquire convert listing +!~ one by one ... +!cso._PRODUCT_.elements : inquire +!cso._PRODUCT_.elements : convert +!cso._PRODUCT_.elements : listing +!cso._PRODUCT_.elements : catalogue -! title: -cso.cris-nh3.sim-gridded-catalogue-index.header : CSO catalogue -! show info on created page? -cso.cris-nh3.sim-gridded-catalogue-index.info : True +! * -! content type: -cso.cris-nh3.sim-gridded-catalogue-index.type : sections -cso.cris-nh3.sim-gridded-catalogue-index.values : yearly monthly -!cso.cris-nh3.sim-gridded-catalogue-index.values : monthly +! inquire tasks: +cso._PRODUCT_.inquire.tasks : table-cris plot -#for TRES in ${cso.cris-nh3.sim-gridded-catalogue-index.values} +! single step: +cso._PRODUCT_.inquire.class : utopya.UtopyaJobStep +!~ inquire files available in CrIS archive: +cso._PRODUCT_.inquire.table-cris.class : cso.CSO_CrIS_Inquire +cso._PRODUCT_.inquire.table-cris.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.inquire-table-cris', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } +!~ create plot of available versions: +cso._PRODUCT_.inquire.plot.class : cso.CSO_Inquire_Plot +cso._PRODUCT_.inquire.plot.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.inquire-plot', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } -! annote: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.header : TRES +! * -! content type: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.type : table-row -! define row values: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.name : period -#if "TRES" == "monthly" -cso.cris-nh3.sim-gridded-catalogue-index.TRES.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 month', '%Y%m' ) -#elif "TRES" == "yearly" -cso.cris-nh3.sim-gridded-catalogue-index.TRES.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 year', '%Y' ) -#endif +! single step: +cso._PRODUCT_.convert.class : utopya.UtopyaJobStep +! convert task: +cso._PRODUCT_.convert.task.class : cso.CSO_CrIS_Convert +cso._PRODUCT_.convert.task.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.convert', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } +! single step: +cso._PRODUCT_.listing.class : utopya.UtopyaJobStep +! listing task: +cso._PRODUCT_.listing.task.class : cso.CSO_CrIS_Listing +cso._PRODUCT_.listing.task.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.listing', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } -! content type: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.type : table-col -! define column values: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.name : var -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.values : ${cso.cris-nh3.sim-gridded-catalogue.vars} +! * -! content type: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.var.type : img -! define image: -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.var.img : CrIS_NH3_%{period}_gridded_%{var}.png -cso.cris-nh3.sim-gridded-catalogue-index.TRES.period.var.kwargs : height=400 +! single step: +cso._PRODUCT_.catalogue.class : utopya.UtopyaJobStep +! two tasks: +cso._PRODUCT_.catalogue.tasks : figs index +! catalogue creation task: +cso._PRODUCT_.catalogue.figs.class : cso.CSO_Catalogue +cso._PRODUCT_.catalogue.figs.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.catalogue', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } +! indexer task: +cso._PRODUCT_.catalogue.index.class : utopya.Indexer +cso._PRODUCT_.catalogue.index.args : '${my.work}/rc/cso-cris-nh3.rc', \ + rcbase='cso.catalogue-index', \ + env={ 'MY_PRODUCT' : '_PRODUCT_' } #endfor +! _PRODUCT_ -!====================================================================== -!=== -!=== end -!=== -!====================================================================== - +! ====================================================================== +! === +! === end +! === +! ======================================================================