diff --git a/Makefile b/Makefile index 3071efdc11b285bad8bd9c21521c1a8db87be12b..20bbbc0b5a4dd31c442cd415ec91dfae65aa47ab 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ clean: clean-pyc clean-osx clean-docu # remove temporary python objects clean-pyc: rm -f `find . -name '*.pyc'` - rm -f -r ./py/__pycache__ + rm -f -r `find . -name '__pycache__'` # remove temporary Mac files clean-osx: diff --git a/config/CrIS/cso.rc b/config/CrIS/cso.rc new file mode 100644 index 0000000000000000000000000000000000000000..a3d4e5814e28b567207b090d5217bb24dfa33528 --- /dev/null +++ b/config/CrIS/cso.rc @@ -0,0 +1,1530 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! +!!! CSO - CAMS Satellite Operator +!!! +!!! Settings for CrIS/NH3. +!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +!---------------------------------------------------------- +! 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 + + +!---------------------------------------------------------- +! user specific settings: +!---------------------------------------------------------- + +! 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 : /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 +!---------------------------------------------------------- + +! 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 + + +! ~ 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 + +! +! 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.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 } + +! 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 } + +! 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 + +! 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 +! +!~ 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 + +! variables to be plotted: +cso.cris-nh3.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.catalogue.color_nan : white + +!! extra keyword arguments for map: +!cso.cris-nh3.catalogue.map : resolution='h' + +! 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 + +! 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 + +! style: +cso.cris-nh3.catalogue.var.amf.vmin : 0.0 +cso.cris-nh3.catalogue.var.amf.vmax : 4.0 + +! style: +cso.cris-nh3.catalogue.var.amf_trop.vmin : 0.0 +cso.cris-nh3.catalogue.var.amf_trop.vmax : 4.0 + +! 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'] + + +!----------------------------------------------------------- +! catalogue index +!----------------------------------------------------------- + +! 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 +!----------------------------------------------------------- + +! target location: +cso.cris-nh3.sim-gridded-catalogue-index.outdir : ${my.sim-gridded.dir}__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 + +#for TRES in ${cso.cris-nh3.sim-gridded-catalogue-index.values} + +! 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 + +! 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 + +#endfor + + +!====================================================================== +!=== +!=== end +!=== +!====================================================================== + + diff --git a/config/tutorial/tutorial.rc b/config/tutorial/tutorial.rc index 4bfff9cd24d998ea118b6ff2200b712e1d8fb781..9f7ee24e2193c7255b49aa41f4412df9a660c9e0 100644 --- a/config/tutorial/tutorial.rc +++ b/config/tutorial/tutorial.rc @@ -299,12 +299,9 @@ VIRTUAL_ENV : ! Obtain names of all available S5p files. ! Stored as csv with processing type, processor version, filenames, etc. -!! full time range: -!cso.tutorial.inquire-table-dataspace.timerange.start : 2018-04-30 00:00:00 -!cso.tutorial.inquire-table-dataspace.timerange.end : 2025-01-01 00:00:00 -! testing ... -cso.tutorial.inquire-table-dataspace.timerange.start : 2018-06-01 00:00:00 -cso.tutorial.inquire-table-dataspace.timerange.end : 2018-07-01 00:00:00 +! full time range: +cso.tutorial.inquire-table-dataspace.timerange.start : 2018-04-30 00:00:00 +cso.tutorial.inquire-table-dataspace.timerange.end : 2025-01-01 00:00:00 ! API url: cso.tutorial.inquire-table-dataspace.url : https://stac.dataspace.copernicus.eu/v1 @@ -351,8 +348,8 @@ cso.tutorial.inquire-plot.output.file : ${my.work}/Copernicus/Cope ! renew existing files (True|False) ? -!cso.tutorial.convert.renew : True -cso.tutorial.convert.renew : False +cso.tutorial.convert.renew : True +!cso.tutorial.convert.renew : False ! time range: cso.tutorial.convert.timerange.start : ${my.timerange.start} diff --git a/doc/samples/CrIS__Combined_NH3_n020_0_n010_0_n010_0_n005_0_20230301.txt b/doc/samples/CrIS__Combined_NH3_n020_0_n010_0_n010_0_n005_0_20230301.txt new file mode 100644 index 0000000000000000000000000000000000000000..99e961fe7edda4aa28056d27c169882e7895bb50 --- /dev/null +++ b/doc/samples/CrIS__Combined_NH3_n020_0_n010_0_n010_0_n005_0_20230301.txt @@ -0,0 +1,226 @@ +netcdf Combined_NH3_n020_0_n010_0_n010_0_n005_0_20230301 { +dimensions: + Observations = 942 ; + Layers = 15 ; + RVMRLen = 5 ; + nerr = 2 ; +variables: + double Quality_Flag(Observations) ; + Quality_Flag:long_name = "" ; + Quality_Flag:units = "" ; + Quality_Flag:description = "# 5 qflag_thres=4 & DOF > 0.1\n 4 qflag_thres=2 & chisq < 5 & (SNR >=1 or TCON > 0)\n 3 qflag_thres=2 & chisq < 20\n 2: qflag_thres=1 & retv < 200 ppbv\n 1: converged\n -1: did not converge" ; + Quality_Flag:_Storage = "contiguous" ; + Quality_Flag:_Endianness = "little" ; + double pressure(Observations, Layers) ; + pressure:long_name = "Retrieval Pressure Levels " ; + pressure:units = "mbar" ; + pressure:_Storage = "contiguous" ; + pressure:_Endianness = "little" ; + double tm(Observations, Layers) ; + tm:long_name = "Temperature Profile " ; + tm:units = "K" ; + tm:_Storage = "contiguous" ; + tm:_Endianness = "little" ; + double zm(Observations, Layers) ; + zm:long_name = "Altitude " ; + zm:units = "km" ; + zm:_Storage = "contiguous" ; + zm:_Endianness = "little" ; + double h2o(Observations, Layers) ; + h2o:long_name = "Water Vapour Profile " ; + h2o:units = "ppmv" ; + h2o:_Storage = "contiguous" ; + h2o:_Endianness = "little" ; + double xa(Observations, Layers) ; + xa:long_name = "Apriori Species Concentration " ; + xa:units = "ppmv" ; + xa:_Storage = "contiguous" ; + xa:_Endianness = "little" ; + double xretv(Observations, Layers) ; + xretv:long_name = "Retrieved Species Concentration " ; + xretv:units = "ppmv" ; + xretv:_Storage = "contiguous" ; + xretv:_Endianness = "little" ; + double xretv_meas_error(Observations, Layers, nerr) ; + xretv_meas_error:long_name = "Retrieved Species Measurement Error: (Minus,Plus)" ; + xretv_meas_error:units = "ppmv" ; + xretv_meas_error:_Storage = "contiguous" ; + xretv_meas_error:_Endianness = "little" ; + double xretv_total_error(Observations, Layers, nerr) ; + xretv_total_error:long_name = "Retrieved Species Total Error: (Minus,Plus)" ; + xretv_total_error:units = "ppmv" ; + xretv_total_error:_Storage = "contiguous" ; + xretv_total_error:_Endianness = "little" ; + double avg_kernel(Observations, Layers, Layers) ; + avg_kernel:long_name = "The averaging kernel is the sensitivity of the estimated state to variations in the atmospheric state. The averaging kernel matrix is stored in [col,row] notation. The rows of the averaging kernel represent the sensitivity of the estimated state at a specific pressure level to variations in the atmospheric state at all levels. The columns of averaging kernel represent the sensitivity of the estimated state at all levels to variations in the atmospheric state at specific pressure level. For atmospheric species this is the sensitivity of retrieved ln(vmr) to the true ln(vmr)." ; + avg_kernel:units = "unitless in ln space for species and linear space for temperature" ; + avg_kernel:_Storage = "contiguous" ; + avg_kernel:_Endianness = "little" ; + double total_covariance_error(Observations, Layers, Layers) ; + total_covariance_error:long_name = "The total error covariance matrix is the sum of smoothing and measurement error (systmatic not included at this time). For atmospheric temperature, it represents the covariance of the error of temperature. For Atmospheric Species, it is the covariance of the error of ln(vmr)" ; + total_covariance_error:units = "ln(vmr)^2" ; + total_covariance_error:_Storage = "contiguous" ; + total_covariance_error:_Endianness = "little" ; + double noise_error_covariance(Observations, Layers, Layers) ; + noise_error_covariance:long_name = "The Measurement error covariance matrix from the radiances. Presently it is also used as a lower limit on the Observation error covariance matrix (Measurement + systematic + cross-state errors) as systematic and cross-state are not explicitly derived at this time. The utility of the observation error is for comparisons with other measurements and for assimilation. The smoothing error is accounted for when one applies the averaging kernel, so the observation error accounts for everything else." ; + noise_error_covariance:units = "ln(vmr)^2" ; + noise_error_covariance:_Storage = "contiguous" ; + noise_error_covariance:_Endianness = "little" ; + double tot_col(Observations) ; + tot_col:long_name = "Retrieved Species Total Column" ; + tot_col:units = "molec/cm2" ; + tot_col:_Storage = "contiguous" ; + tot_col:_Endianness = "little" ; + double tot_col_meas_error(Observations) ; + tot_col_meas_error:long_name = "Retrieved Species Total Column Measurement Error" ; + tot_col_meas_error:units = "molec/cm2" ; + tot_col_meas_error:_Storage = "contiguous" ; + tot_col_meas_error:_Endianness = "little" ; + double tot_col_total_error(Observations) ; + tot_col_total_error:long_name = "Retrieved Species Total Column Total Error" ; + tot_col_total_error:units = "molec/cm2" ; + tot_col_total_error:_Storage = "contiguous" ; + tot_col_total_error:_Endianness = "little" ; + double tsfc(Observations) ; + tsfc:long_name = "Surface Temperature" ; + tsfc:units = "K" ; + tsfc:_Storage = "contiguous" ; + tsfc:_Endianness = "little" ; + double tsfc_ap(Observations) ; + tsfc_ap:long_name = "Surface temperature apriori and initial guess for each FOV (pixel)" ; + tsfc_ap:units = "K" ; + tsfc_ap:_Storage = "contiguous" ; + tsfc_ap:_Endianness = "little" ; + double tstd_ap(Observations) ; + tstd_ap:long_name = "Standard deviation of the FOV (pixel) surface temperature apriori and initial guess over the FOR (9-pixels): Used for diagnostics" ; + tstd_ap:units = "K" ; + tstd_ap:_Storage = "contiguous" ; + tstd_ap:_Endianness = "little" ; + double tsfc_for(Observations) ; + tsfc_for:long_name = "Input Level2 (e.g. NUCAPS) surface temperature over FOR (9-FOVs): Used for diagnostics" ; + tsfc_for:units = "K" ; + tsfc_for:_Storage = "contiguous" ; + tsfc_for:_Endianness = "little" ; + double dt_nh3(Observations) ; + dt_nh3:long_name = "Spectral brightness temperature difference: window [981.25 cm-1] - ammonia [967.5 cm-1]: Used for diagnostics" ; + dt_nh3:units = "K" ; + dt_nh3:_Storage = "contiguous" ; + dt_nh3:_Endianness = "little" ; + double rvmr(Observations, RVMRLen) ; + rvmr:long_name = "Representative Volume Mixing Ratio" ; + rvmr:units = "ppmv" ; + rvmr:_Storage = "contiguous" ; + rvmr:_Endianness = "little" ; + double rvmr_press(Observations, RVMRLen) ; + rvmr_press:long_name = "RVMR Pressure Levels " ; + rvmr_press:units = "mbar" ; + rvmr_press:_Storage = "contiguous" ; + rvmr_press:_Endianness = "little" ; + double rvmr_fwhm(Observations, RVMRLen) ; + rvmr_fwhm:long_name = "RVMR Resolution " ; + rvmr_fwhm:units = "mbar" ; + rvmr_fwhm:_Storage = "contiguous" ; + rvmr_fwhm:_Endianness = "little" ; + double rvmr_wgt(Observations, Layers, RVMRLen) ; + rvmr_wgt:long_name = "" ; + rvmr_wgt:units = "" ; + rvmr_wgt:_Storage = "contiguous" ; + rvmr_wgt:_Endianness = "little" ; + double rvmr_error(Observations, RVMRLen) ; + rvmr_error:long_name = "RVMR Error " ; + rvmr_error:units = "ppmv" ; + rvmr_error:_Storage = "contiguous" ; + rvmr_error:_Endianness = "little" ; + string File_Creation_Timestamp(Observations) ; + File_Creation_Timestamp:_Storage = "contiguous" ; + double Version(Observations) ; + Version:_Storage = "contiguous" ; + Version:_Endianness = "little" ; + string Run_ID(Observations) ; + Run_ID:_Storage = "contiguous" ; + double Latitude(Observations) ; + Latitude:_Storage = "contiguous" ; + Latitude:_Endianness = "little" ; + double Longitude(Observations) ; + Longitude:_Storage = "contiguous" ; + Longitude:_Endianness = "little" ; + double SatelliteZenithAngle(Observations) ; + SatelliteZenithAngle:_Storage = "contiguous" ; + SatelliteZenithAngle:_Endianness = "little" ; + double SatelliteAzimuthAngle(Observations) ; + SatelliteAzimuthAngle:_Storage = "contiguous" ; + SatelliteAzimuthAngle:_Endianness = "little" ; + double SatelliteRange(Observations) ; + SatelliteRange:_Storage = "contiguous" ; + SatelliteRange:_Endianness = "little" ; + double LandFraction(Observations) ; + LandFraction:_Storage = "contiguous" ; + LandFraction:_Endianness = "little" ; + string SurfaceReflection(Observations) ; + SurfaceReflection:_Storage = "contiguous" ; + string Date(Observations) ; + Date:_Storage = "contiguous" ; + string Time_UTC(Observations) ; + Time_UTC:_Storage = "contiguous" ; + double Day_Night_Flag(Observations) ; + Day_Night_Flag:_Storage = "contiguous" ; + Day_Night_Flag:_Endianness = "little" ; + string L2_file_source(Observations) ; + L2_file_source:_Storage = "contiguous" ; + double Number_of_L2_files_per_L1(Observations) ; + Number_of_L2_files_per_L1:_Storage = "contiguous" ; + Number_of_L2_files_per_L1:_Endianness = "little" ; + double Number_of_iterations(Observations) ; + Number_of_iterations:_Storage = "contiguous" ; + Number_of_iterations:_Endianness = "little" ; + double CHISQ(Observations) ; + CHISQ:_Storage = "contiguous" ; + CHISQ:_Endianness = "little" ; + double CHISQ_0(Observations) ; + CHISQ_0:_Storage = "contiguous" ; + CHISQ_0:_Endianness = "little" ; + double DOF(Observations) ; + DOF:_Storage = "contiguous" ; + DOF:_Endianness = "little" ; + string xa_Type(Observations) ; + xa_Type:_Storage = "contiguous" ; + string x0_Type(Observations) ; + x0_Type:_Storage = "contiguous" ; + double surf_Type(Observations) ; + surf_Type:_Storage = "contiguous" ; + surf_Type:_Endianness = "little" ; + double nedt(Observations) ; + nedt:_Storage = "contiguous" ; + nedt:_Endianness = "little" ; + double snr(Observations) ; + snr:_Storage = "contiguous" ; + snr:_Endianness = "little" ; + double mdate(Observations) ; + mdate:long_name = "Date in python datetime" ; + mdate:units = "Days since 1970-01-01: e.g. 2013,1,1 = 15706.0" ; + mdate:_Storage = "contiguous" ; + mdate:_Endianness = "little" ; + double Retrieval_Status(Observations) ; + Retrieval_Status:_Storage = "contiguous" ; + Retrieval_Status:_Endianness = "little" ; + double Daylight_Flag(Observations) ; + Daylight_Flag:_Storage = "contiguous" ; + Daylight_Flag:_Endianness = "little" ; + double Local_solar_mdate(Observations) ; + Local_solar_mdate:_Storage = "contiguous" ; + Local_solar_mdate:_Endianness = "little" ; + string Time_local_solar(Observations) ; + Time_local_solar:_Storage = "contiguous" ; + double Cloud_Flag(Observations) ; + Cloud_Flag:_Storage = "contiguous" ; + Cloud_Flag:_Endianness = "little" ; + +// global attributes: + :total_FOVs = 2236LL ; + :satellite = "noaa20" ; + :version = "1.6.4" ; + :_NCProperties = "version=2,netcdf=4.7.4,hdf5=1.12.0," ; + :_SuperblockVersion = 0 ; + :_IsNetcdf4 = 1 ; + :_Format = "netCDF-4" ; +} diff --git a/doc/source/conf.py b/doc/source/conf.py index 0b0c855aa0c96d91a9f75431ec8313bd1665cd43..b19d376ebdd6dbbba48aa76234c689667f4cf961 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -86,8 +86,18 @@ autodoc_member_order = "bysource" # https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html # add links to existing online documentation if present: -docs_url = f"https://docs.python.org/{sys.version_info.major}" -intersphinx_mapping = {"python": (docs_url, None)} +intersphinx_mapping = { + "python": (f"https://docs.python.org/{sys.version_info.major}", None), + "xarray": ("https://docs.xarray.dev/en/stable/", None), + "pandas": ("https://pandas.pydata.org/docs/", None), +} + + +# ~~ figures + +# enable numbering: +numfig = True + # -- Options for HTML output ------------------------------------------------- diff --git a/doc/source/cris-nh3.rst b/doc/source/cris-nh3.rst new file mode 100644 index 0000000000000000000000000000000000000000..4de091c7eaaa369e1204e3261abd38ae74089a8e --- /dev/null +++ b/doc/source/cris-nh3.rst @@ -0,0 +1,476 @@ + +.. Label between '.. _' and ':' ; use :ref:`text