!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! !!! CSO TROPOMI Processing !!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !----------------------------------------------------------------------- ! user specific settings: !----------------------------------------------------------------------- ! include user specfic settings: #include tutorial-user-settings.rc !====================================================================== !=== !=== download - S-5P Hub !=== !====================================================================== ! time range: cso.tutorial.download-s5phub.timerange.start : ${my.timerange.start} cso.tutorial.download-s5phub.timerange.end : ${my.timerange.end} ! ! server url ; ! provide login/password in ~/.netrc: ! ! machine s5phub.copernicus.eu login s5pguest password s5pguest ! cso.tutorial.download-s5phub.url : https://s5phub.copernicus.eu/dhus ! target area; !~ empty for no limitation: !cso.tutorial.download-s5phub.area : !~ domain specified as: west,south:east,north cso.tutorial.download-s5phub.area : ${my.region.west},${my.region.south}:${my.region.east},${my.region.north} ! ! search query, obtained from interactive download: ! ! platformname : Sentinel-5 ! producttype : L2__NO2___ | L2__CO____ (always 10 characters!) ! processinglevel : L2 ! processingmode : Reprocessing | Offline ! cso.tutorial.download-s5phub.query : platformname:Sentinel-5 AND \ producttype:L2__NO2___ AND \ processinglevel:L2 AND \ processingmode:Reprocessing ! output archive, store in subdirs per month: cso.tutorial.download-s5phub.output.dir : ${my.work}/Copernicus/S5P/RPRO/NO2/%Y/%m ! renew existing files? cso.tutorial.download-s5phub.renew : False !! * extra when using "CSO_SciHub_Download_DHuS" ; !! not that "renew" flag is not used then ... ! !! location of script: !cso.tutorial.download-s5phub.script : ${PWD}/bin/dhusget.sh ! !! work directory, will contain log files etc: !cso.tutorial.download-s5phub.work.dir : ${my.work}/tmp.DHuS !====================================================================== !=== !=== convert !=== !====================================================================== ! renew existing files (True|False) ? cso.tutorial.convert.renew : True !cso.tutorial.convert.renew : False ! time range: cso.tutorial.convert.timerange.start : ${my.timerange.start} cso.tutorial.convert.timerange.end : ${my.timerange.end} !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! input files !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! input directory, same as where 'download' has stored the files: cso.tutorial.convert.files.dir : ${cso.tutorial.download-s5phub.output.dir} ! filename filters (space seperated list): cso.tutorial.convert.files.filters : S5P_*.nc ! target component: !cso.tutorial.convert.component : ${my.tracer} ! selection names: cso.tutorial.convert.filters : lons lats valid quality ! filter settings: cso.tutorial.convert.filter.lons.var : PRODUCT/longitude cso.tutorial.convert.filter.lons.type : minmax cso.tutorial.convert.filter.lons.minmax : ${my.region.west} ${my.region.east} cso.tutorial.convert.filter.lons.units : degrees_east ! filter settings: cso.tutorial.convert.filter.lats.var : PRODUCT/latitude cso.tutorial.convert.filter.lats.type : minmax cso.tutorial.convert.filter.lats.minmax : ${my.region.south} ${my.region.north} cso.tutorial.convert.filter.lats.units : degrees_north ! skip pixel with "no data", use the "qa_value" variable to check: cso.tutorial.convert.filter.valid.var : PRODUCT/qa_value cso.tutorial.convert.filter.valid.type : valid ! Comment in "PRODUCT/qa_value" variable: ! "A continuous quality descriptor, ! varying between 0 (no data) and 1 (full quality data). ! Recommend to ignore data with qa_value < 0.5" ! Tests suggest that better threshold is 0.54, ! this removes the kernels with very high values. cso.tutorial.convert.filter.quality.var : PRODUCT/qa_value cso.tutorial.convert.filter.quality.type : min cso.tutorial.convert.filter.quality.min : 0.54 cso.tutorial.convert.filter.quality.units : 1 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! output files !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! output directory and filename: ! - times are taken from mid of selection, rounded to hours ! - use '%{orbit}' for orbit number cso.tutorial.convert.output.dir : ${my.work}/CSO-data/S5p/RPRO/NO2/${my.region}/%Y/%m cso.tutorial.convert.output.filename : S5p_RPRO_NO2_%{orbit}.nc ! global attributes: cso.tutorial.convert.output.attrs : format Conventions \ author institution email ! cso.tutorial.convert.output.attr.format : ${my.cso.format} cso.tutorial.convert.output.attr.Conventions : ${my.cso.convention} cso.tutorial.convert.output.attr.author : ${my.attr.author} cso.tutorial.convert.output.attr.institution : ${my.attr.institution} cso.tutorial.convert.output.attr.email : ${my.attr.email} ! no need to swap layes: cso.tutorial.convert.swap_layers : False ! ~ variables ! which fields to be put out ? cso.tutorial.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 ! ! 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) ! ! center longitudes; remove bounds attribute, no coordinate ... cso.tutorial.convert.output.var.longitude.dims : pixel cso.tutorial.convert.output.var.longitude.from : PRODUCT/longitude cso.tutorial.convert.output.var.longitude.attrs : { 'bounds' : None } ! center latitudes; remove bounds attribute, no coordinate ... cso.tutorial.convert.output.var.latitude.dims : pixel cso.tutorial.convert.output.var.latitude.from : PRODUCT/latitude cso.tutorial.convert.output.var.latitude.attrs : { 'bounds' : None } ! corner longitudes; no units in file: cso.tutorial.convert.output.var.longitude_bounds.dims : pixel corner cso.tutorial.convert.output.var.longitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds cso.tutorial.convert.output.var.longitude_bounds.units : degrees_east ! corner latitudes, no units in file: cso.tutorial.convert.output.var.latitude_bounds.dims : pixel corner cso.tutorial.convert.output.var.latitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds cso.tutorial.convert.output.var.latitude_bounds.units : degrees_north ! original track: !~ center lon; remove bounds attribute, no coordinate ... cso.tutorial.convert.output.var.track_longitude.dims : track_scan track_pixel cso.tutorial.convert.output.var.track_longitude.special : track_longitude cso.tutorial.convert.output.var.track_longitude.from : PRODUCT/longitude cso.tutorial.convert.output.var.track_longitude.attrs : { 'bounds' : None } !~ center lat; remove bounds attribute, no coordinate ... cso.tutorial.convert.output.var.track_latitude.dims : track_scan track_pixel cso.tutorial.convert.output.var.track_latitude.special : track_latitude cso.tutorial.convert.output.var.track_latitude.from : PRODUCT/latitude cso.tutorial.convert.output.var.track_latitude.attrs : { 'bounds' : None } !~ corner lons cso.tutorial.convert.output.var.track_longitude_bounds.dims : track_scan track_pixel corner cso.tutorial.convert.output.var.track_longitude_bounds.special : track_longitude_bounds cso.tutorial.convert.output.var.track_longitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/longitude_bounds cso.tutorial.convert.output.var.track_longitude_bounds.units : degrees_east !~ corner lats cso.tutorial.convert.output.var.track_latitude_bounds.dims : track_scan track_pixel corner cso.tutorial.convert.output.var.track_latitude_bounds.special : track_latitude_bounds cso.tutorial.convert.output.var.track_latitude_bounds.from : PRODUCT/SUPPORT_DATA/GEOLOCATIONS/latitude_bounds cso.tutorial.convert.output.var.track_latitude_bounds.units : degrees_north ! time value per scan line cso.tutorial.convert.output.var.time.dims : pixel cso.tutorial.convert.output.var.time.special : time-delta cso.tutorial.convert.output.var.time.tref : PRODUCT/time cso.tutorial.convert.output.var.time.dt : PRODUCT/delta_time ! vertical column density: cso.tutorial.convert.output.var.vcd.dims : pixel retr cso.tutorial.convert.output.var.vcd.from : PRODUCT/nitrogendioxide_tropospheric_column ! 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.tutorial.convert.output.var.vcd_errvar.dims : pixel retr retr0 cso.tutorial.convert.output.var.vcd_errvar.special : square cso.tutorial.convert.output.var.vcd_errvar.from : PRODUCT/nitrogendioxide_tropospheric_column_precision_kernel !~ skip standard name, modifier "standard_error" is not valid anymore: cso.tutorial.convert.output.var.vcd_errvar.attrs : { 'standard_name' : None } ! Convert from hybride coefficient bounds in (2,nlev) aray to 3D half level pressure: cso.tutorial.convert.output.var.pressure.dims : pixel layeri cso.tutorial.convert.output.var.pressure.special : hybounds_to_pressure cso.tutorial.convert.output.var.pressure.sp : PRODUCT/SUPPORT_DATA/INPUT_DATA/surface_pressure cso.tutorial.convert.output.var.pressure.hyab : PRODUCT/tm5_constant_a cso.tutorial.convert.output.var.pressure.hybb : PRODUCT/tm5_constant_b cso.tutorial.convert.output.var.pressure.units : Pa ! (total) airmass factor: cso.tutorial.convert.output.var.amf.dims : pixel retr cso.tutorial.convert.output.var.amf.from : PRODUCT/air_mass_factor_total cso.tutorial.convert.output.var.amf.attrs : { 'coordinates' : None, 'ancillary_variables' : None } ! tropospheric airmass factor: cso.tutorial.convert.output.var.amf_trop.dims : pixel retr cso.tutorial.convert.output.var.amf_trop.from : PRODUCT/air_mass_factor_troposphere cso.tutorial.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.tutorial.convert.output.var.nla.dims : pixel retr cso.tutorial.convert.output.var.nla.dtype : i2 cso.tutorial.convert.output.var.nla.from : PRODUCT/tm5_tropopause_layer_index cso.tutorial.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.tutorial.convert.output.var.kernel_trop.dims : pixel layer retr cso.tutorial.convert.output.var.kernel_trop.special : kernel_trop cso.tutorial.convert.output.var.kernel_trop.avk : PRODUCT/averaging_kernel cso.tutorial.convert.output.var.kernel_trop.amf : PRODUCT/air_mass_factor_total cso.tutorial.convert.output.var.kernel_trop.amft : PRODUCT/air_mass_factor_troposphere cso.tutorial.convert.output.var.kernel_trop.troplayer : PRODUCT/tm5_tropopause_layer_index cso.tutorial.convert.output.var.kernel_trop.attrs : { 'coordinates' : None, 'ancillary_variables' : None } ! cloud property: cso.tutorial.convert.output.var.cloud_fraction.dims : pixel cso.tutorial.convert.output.var.cloud_fraction.from : PRODUCT/SUPPORT_DATA/INPUT_DATA/cloud_fraction_crb cso.tutorial.convert.output.var.cloud_fraction.attrs : { 'coordinates' : None, 'source' : None } ! cloud property: cso.tutorial.convert.output.var.cloud_radiance_fraction.dims : pixel cso.tutorial.convert.output.var.cloud_radiance_fraction.from : PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/cloud_radiance_fraction_nitrogendioxide_window cso.tutorial.convert.output.var.cloud_radiance_fraction.attrs : { 'coordinates' : None, 'ancillary_variables' : None } ! quality flag: cso.tutorial.convert.output.var.qa_value.dims : pixel cso.tutorial.convert.output.var.qa_value.from : PRODUCT/qa_value !~ skip some attributes, cf-checker complains ... cso.tutorial.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.tutorial.listing.file : ${my.work}/CSO-data/S5p/listing-NO2-${my.region}.csv ! renew table if file already exists? cso.tutorial.listing.renew : True ! time range: cso.tutorial.listing.timerange.start : ${my.timerange.start} cso.tutorial.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.tutorial.listing.patterns : RPRO/NO2/${my.region}/%Y/%m/S5p_*.nc \ OFFL/NO2/${my.region}/%Y/%m/S5p_*.nc ! adhoc: use the time for which file is valid as timerange; ! this is used for the synthetic S4 data that have no time record ... cso.tutorial.listing.use_t : False ! extra columns to be added, read from global attributes: cso.tutorial.listing.xcolumns : orbit !====================================================================== !=== !=== catalogue !=== !====================================================================== ! target directory for catalogue: cso.tutorial.catalogue.output.dir : ${my.work}/CSO-data-catalogue ! listing file with filenames/timerange. cso.tutorial.catalogue.input.listing : ${cso.tutorial.listing.file} ! time range: cso.tutorial.catalogue.timerange.start : ${my.timerange.start} cso.tutorial.catalogue.timerange.end : ${my.timerange.end} ! map domain (west east south north) cso.tutorial.catalogue.domain : ${my.region.west} ${my.region.east} ${my.region.south} ${my.region.north} ! figure size (inches), default is (8,6): cso.tutorial.catalogue.figsize : ${my.region.figsize} ! renew existing files? cso.tutorial.catalogue.renew : False !cso.tutorial.catalogue.renew : True ! variables to be plotted: cso.tutorial.catalogue.vars : vcd vcd_errvar qa_value \ amf amf_trop nla \ cloud_fraction cloud_radiance_fraction ! convert units: cso.tutorial.catalogue.var.vcd.units : 1e15 mlc/cm2 ! style: cso.tutorial.catalogue.var.vcd.vmin : 0.0 cso.tutorial.catalogue.var.vcd.vmax : 10.0 ! convert units: cso.tutorial.catalogue.var.vcd_errvar.units : 1e15 mlc/cm2 ! style: cso.tutorial.catalogue.var.vcd_errvar.vmax : 10.0 ! style: cso.tutorial.catalogue.var.amf.vmin : 0.0 cso.tutorial.catalogue.var.amf.vmax : 4.0 ! style: cso.tutorial.catalogue.var.amf_trop.vmin : 0.0 cso.tutorial.catalogue.var.amf_trop.vmax : 4.0 ! style: cso.tutorial.catalogue.var.nla.vmin : 1 cso.tutorial.catalogue.var.nla.vmax : 34 ! style: cso.tutorial.catalogue.var.qa_value.vmin : 0.5 cso.tutorial.catalogue.var.qa_value.vmax : 1.0 cso.tutorial.catalogue.var.qa_value.colors : ['red','yellow','green'] ! style: cso.tutorial.catalogue.var.cloud_fraction.vmax : 1.0 cso.tutorial.catalogue.var.cloud_fraction.colors : ['blue','cyan','white'] ! style: cso.tutorial.catalogue.var.cloud_radiance_fraction.vmax : 1.0 cso.tutorial.catalogue.var.cloud_radiance_fraction.colors : ['blue','cyan','white'] !----------------------------------------------------------- ! catalogue index !----------------------------------------------------------- ! target location: cso.tutorial.catalogue-index.outdir : ${my.work}/CSO-data-catalogue ! title: cso.tutorial.catalogue-index.header : CSO catalogue ! show info on created page? cso.tutorial.catalogue-index.info : True ! create new page for each value? cso.tutorial.catalogue-index.newpage : True ! content type: cso.tutorial.catalogue-index.type : list ! define row values: cso.tutorial.catalogue-index.name : date cso.tutorial.catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) ! create new page for each value: cso.tutorial.catalogue-index.date.newpage : True ! content type: cso.tutorial.catalogue-index.date.type : table-row ! define row values: cso.tutorial.catalogue-index.date.name : orbit cso.tutorial.catalogue-index.date.values : CsvFile( '%{date[0:4]}/%{date[4:6]}/%{date[6:8]}/orbits.csv' ) ! content type: cso.tutorial.catalogue-index.date.orbit.type : table-col ! define column values: cso.tutorial.catalogue-index.date.orbit.name : var cso.tutorial.catalogue-index.date.orbit.values : ${cso.tutorial.catalogue.vars} ! content type: cso.tutorial.catalogue-index.date.orbit.var.type : img ! define image: cso.tutorial.catalogue-index.date.orbit.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_RPRO_NO2_%{orbit}__%{var}.png cso.tutorial.catalogue-index.date.orbit.var.kwargs : height=200 !====================================================================== !=== !=== simulation catalogue !=== !====================================================================== !----------------------------------------------------------- ! simulation catalogue !----------------------------------------------------------- ! time range: cso.tutorial.sim-catalogue.timerange.start : ${my.timerange.start} cso.tutorial.sim-catalogue.timerange.end : ${my.timerange.end} ! input files: cso.tutorial.sim-catalogue.input.data.file : ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_data.nc cso.tutorial.sim-catalogue.input.state.file : ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_state.nc ! target directory for catalogue: cso.tutorial.sim-catalogue.output.dir : ${my.work}/CSO-oper/sim-catalogue ! target files, time tempates and variable name are replaced: cso.tutorial.sim-catalogue.output.file : %Y/%m/%d/S5p_RPRO_NO2_%Y%m%d_%H%M_%{var}.png ! map domain used for simulations (west east south north): cso.tutorial.sim-catalogue.domain : -10 30 35 65 ! figure size (inches), default is (8,6): cso.tutorial.sim-catalogue.figsize : (6,6) ! renew existing files? !cso.tutorial.sim-catalogue.renew : False cso.tutorial.sim-catalogue.renew : True ! variables to be plotted: cso.tutorial.sim-catalogue.vars : yr ys yr_m ys_m tcc ! variable: cso.tutorial.sim-catalogue.var.yr.source : data:yr ! convert units: cso.tutorial.sim-catalogue.var.yr.units : 1e15 mlc/cm2 ! style: cso.tutorial.sim-catalogue.var.yr.vmin : 0.0 cso.tutorial.sim-catalogue.var.yr.vmax : 10.0 ! variable: cso.tutorial.sim-catalogue.var.ys.source : state:ys ! convert units: cso.tutorial.sim-catalogue.var.ys.units : 1e15 mlc/cm2 ! style: cso.tutorial.sim-catalogue.var.ys.vmin : 0.0 cso.tutorial.sim-catalogue.var.ys.vmax : 10.0 ! variable: cso.tutorial.sim-catalogue.var.yr_m.source : state:yr_m ! convert units: cso.tutorial.sim-catalogue.var.yr_m.units : 1e15 mlc/cm2 ! style: cso.tutorial.sim-catalogue.var.yr_m.vmin : 0.0 cso.tutorial.sim-catalogue.var.yr_m.vmax : 10.0 ! variable: cso.tutorial.sim-catalogue.var.ys_m.source : state:ys_m ! convert units: cso.tutorial.sim-catalogue.var.ys_m.units : 1e15 mlc/cm2 ! style: cso.tutorial.sim-catalogue.var.ys_m.vmin : 0.0 cso.tutorial.sim-catalogue.var.ys_m.vmax : 10.0 ! variable: cso.tutorial.sim-catalogue.var.tcc.source : state:mod_tcc ! convert units: cso.tutorial.sim-catalogue.var.tcc.units : 1 ! style: cso.tutorial.sim-catalogue.var.tcc.vmin : 0.0 cso.tutorial.sim-catalogue.var.tcc.vmax : 1.0 !----------------------------------------------------------- ! sim catalogue index !----------------------------------------------------------- ! target location: cso.tutorial.sim-catalogue-index.outdir : ${my.work}/CSO-oper/sim-catalogue ! title: cso.tutorial.sim-catalogue-index.header : CSO catalogue ! show info on created page? cso.tutorial.sim-catalogue-index.info : True ! create new page for each value? cso.tutorial.sim-catalogue-index.newpage : True ! content type: cso.tutorial.sim-catalogue-index.type : list ! define row values: cso.tutorial.sim-catalogue-index.name : date cso.tutorial.sim-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) ! create new page for each value: cso.tutorial.sim-catalogue-index.date.newpage : True ! content type: cso.tutorial.sim-catalogue-index.date.type : table-row ! define row values: cso.tutorial.sim-catalogue-index.date.name : time cso.tutorial.sim-catalogue-index.date.values : Range( 0, 23, 1, '%2.2i00' ) ! content type: cso.tutorial.sim-catalogue-index.date.time.type : table-col ! define column values: cso.tutorial.sim-catalogue-index.date.time.name : var cso.tutorial.sim-catalogue-index.date.time.values : ${cso.tutorial.sim-catalogue.vars} ! content type: cso.tutorial.sim-catalogue-index.date.time.var.type : img ! define image: cso.tutorial.sim-catalogue-index.date.time.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_RPRO_NO2_%{date}_%{time}_%{var}.png cso.tutorial.sim-catalogue-index.date.time.var.kwargs : height=300 !====================================================================== !=== !=== gridded orbits !=== !====================================================================== !----------------------------------------------------------- ! gridded orbits !----------------------------------------------------------- ! time range: cso.tutorial.gridded.timerange.start : ${my.timerange.start} cso.tutorial.gridded.timerange.end : ${my.timerange.end} ! renew existing files? cso.tutorial.gridded.renew : True !cso.tutorial.gridded.renew : False ! file with regular grid description, ! which should have at least variable with 2D cell area: cso.tutorial.gridded.input.grid.file : ${my.work}/CSO-oper/CSO_grid.nc ! variable with cell area: cso.tutorial.gridded.input.grid.area : cell_area ! data file: cso.tutorial.gridded.input.data : ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_data.nc ! keywords for output files to be created: cso.tutorial.gridded.outputs : all ! ~ "all" ! target file: cso.tutorial.gridded.output.all.file : ${my.work}/CSO-gridded/CSO_output_%Y%m%d_%H%M_gridded.nc ! state file used as input: cso.tutorial.gridded.output.all.state : ${my.work}/CSO-oper/CSO_output_%Y%m%d_%H%M_state.nc ! data variables to be created: cso.tutorial.gridded.output.all.vars : yr ys yr_m ys_m ! input variables: ! data:yr : from data file ! state:ys : from state file cso.tutorial.gridded.output.all.yr.source : data:yr cso.tutorial.gridded.output.all.ys.source : state:ys cso.tutorial.gridded.output.all.yr_m.source : state:yr_m cso.tutorial.gridded.output.all.ys_m.source : state:ys_m !----------------------------------------------------------- ! catalogue of gridded fields !----------------------------------------------------------- ! time range: cso.tutorial.gridded-catalogue.timerange.start : ${my.timerange.start} cso.tutorial.gridded-catalogue.timerange.end : ${my.timerange.end} ! target directory for catalogue: cso.tutorial.gridded-catalogue.output.dir : ${my.work}/CSO-gridded/catalogue ! input files per "output" key of the gridding operator: cso.tutorial.gridded-catalogue.input.all.file : ../CSO_output_%Y%m%d_%H%M_gridded.nc !!~ idem for daily average: !cso.tutorial.gridded-catalogue.input.all.file : ../CSO_output_%Y%m%d_aver_gridded.nc ! target files, time tempates and variable name are replaced: cso.tutorial.gridded-catalogue.output.file : %Y/%m/%d/S5p_RPRO_NO2_%Y%m%d_%H%M_gridded_%{var}.png !!~ idem for daily average: !cso.tutorial.gridded-catalogue.output.file : %Y/%m/%d/S5p_RPRO_NO2_%Y%m%d_aver_gridded_%{var}.png ! figure size (inches), default is (8,6): cso.tutorial.gridded-catalogue.figsize : (6,6) ! renew existing files? cso.tutorial.gridded-catalogue.renew : True !cso.tutorial.gridded-catalogue.renew : False ! variables to be plotted: cso.tutorial.gridded-catalogue.vars : yr ys yr_m ys_m ! variable: cso.tutorial.gridded-catalogue.var.yr.source : all:yr ! convert units: cso.tutorial.gridded-catalogue.var.yr.units : 1e15 mlc/cm2 ! style: cso.tutorial.gridded-catalogue.var.yr.vmin : 0.0 cso.tutorial.gridded-catalogue.var.yr.vmax : 10.0 ! variable: cso.tutorial.gridded-catalogue.var.ys.source : all:ys ! convert units: cso.tutorial.gridded-catalogue.var.ys.units : 1e15 mlc/cm2 ! style: cso.tutorial.gridded-catalogue.var.ys.vmin : 0.0 cso.tutorial.gridded-catalogue.var.ys.vmax : 10.0 ! variable: cso.tutorial.gridded-catalogue.var.yr_m.source : all:yr_m ! convert units: cso.tutorial.gridded-catalogue.var.yr_m.units : 1e15 mlc/cm2 ! style: cso.tutorial.gridded-catalogue.var.yr_m.vmin : 0.0 cso.tutorial.gridded-catalogue.var.yr_m.vmax : 10.0 ! variable: cso.tutorial.gridded-catalogue.var.ys_m.source : all:ys_m ! convert units: cso.tutorial.gridded-catalogue.var.ys_m.units : 1e15 mlc/cm2 ! style: cso.tutorial.gridded-catalogue.var.ys_m.vmin : 0.0 cso.tutorial.gridded-catalogue.var.ys_m.vmax : 10.0 !----------------------------------------------------------- ! gridded catalogue index !----------------------------------------------------------- ! target location: cso.tutorial.gridded-catalogue-index.outdir : ${my.work}/CSO-gridded/catalogue ! title: cso.tutorial.gridded-catalogue-index.header : CSO catalogue ! show info on created page? cso.tutorial.gridded-catalogue-index.info : True ! create new page for each value? cso.tutorial.gridded-catalogue-index.newpage : True ! content type: cso.tutorial.gridded-catalogue-index.type : list ! define row values: cso.tutorial.gridded-catalogue-index.name : date cso.tutorial.gridded-catalogue-index.values : TimeSeries( ${my.timerange.start}, ${my.timerange.end}, '1 day', '%Y%m%d' ) ! create new page for each value: cso.tutorial.gridded-catalogue-index.date.newpage : True ! content type: cso.tutorial.gridded-catalogue-index.date.type : table-row ! define row values: cso.tutorial.gridded-catalogue-index.date.name : time cso.tutorial.gridded-catalogue-index.date.values : Range( 0, 23, 1, '%2.2i00' ) ! content type: cso.tutorial.gridded-catalogue-index.date.time.type : table-col ! define column values: cso.tutorial.gridded-catalogue-index.date.time.name : var cso.tutorial.gridded-catalogue-index.date.time.values : ${cso.tutorial.gridded-catalogue.vars} ! content type: cso.tutorial.gridded-catalogue-index.date.time.var.type : img ! define image: cso.tutorial.gridded-catalogue-index.date.time.var.img : %{date[0:4]}/%{date[4:6]}/%{date[6:8]}/S5p_RPRO_NO2_%{date}_%{time}_gridded_%{var}.png cso.tutorial.gridded-catalogue-index.date.time.var.kwargs : height=300 !====================================================================== !=== !=== end !=== !======================================================================