From 823a8d77b7048aa47d0bbc079a600c859d578fc5 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Wed, 11 Feb 2026 10:50:30 -0600 Subject: [PATCH 01/15] Added satinfo for MHS (N19, metop-b, and metop-c) in observation_chronicle. --- .../atmosphere/radiance_mhs_metop-b.yaml | 26 +++++++++++++++++++ .../atmosphere/radiance_mhs_metop-c.yaml | 26 +++++++++++++++++++ .../atmosphere/radiance_mhs_n19.yaml | 26 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-b.yaml create mode 100644 parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml create mode 100644 parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n19.yaml diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-b.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-b.yaml new file mode 100644 index 000000000..7b543da32 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-b.yaml @@ -0,0 +1,26 @@ +# Instrument metadata +# ------------------- +commissioned: 2009-12-15T00:00:00 + +observer_type: satellite # Type of chronicle to use + +# Instrument initial configuration +# -------------------------------- +channel_variables: + simulated: min + active: min + biascorrtd: min + error: max + error_cld: max + ermax: max + var_b: min + var_pg: min + icld_det: min + icloud: min + iaerosol: min +channel_values: + 1: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 2: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 3: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 4: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 5: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml new file mode 100644 index 000000000..7b543da32 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml @@ -0,0 +1,26 @@ +# Instrument metadata +# ------------------- +commissioned: 2009-12-15T00:00:00 + +observer_type: satellite # Type of chronicle to use + +# Instrument initial configuration +# -------------------------------- +channel_variables: + simulated: min + active: min + biascorrtd: min + error: max + error_cld: max + ermax: max + var_b: min + var_pg: min + icld_det: min + icloud: min + iaerosol: min +channel_values: + 1: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 2: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 3: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 4: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 5: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n19.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n19.yaml new file mode 100644 index 000000000..17a85c016 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n19.yaml @@ -0,0 +1,26 @@ +# Instrument metadata +# ------------------- +commissioned: 2009-12-15T00:00:00 + +observer_type: satellite # Type of chronicle to use + +# Instrument initial configuration +# -------------------------------- +channel_variables: + simulated: min + active: min + biascorrtd: min + error: max + error_cld: max + ermax: max + var_b: min + var_pg: min + icld_det: min + icloud: min + iaerosol: min +channel_values: + 1: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 2: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 3: [ 1, -1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 4: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 5: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] From fc8517ebf3edfe948db03f4e62fd7a0de6eb9c5a Mon Sep 17 00:00:00 2001 From: jianjunj Date: Wed, 11 Feb 2026 11:47:48 -0600 Subject: [PATCH 02/15] Added satinfo for MHS (N18 and metop-a) in observation_chronicle. --- .../atmosphere/radiance_mhs_metop-a.yaml | 26 +++++++++++++++++++ .../atmosphere/radiance_mhs_n18.yaml | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-a.yaml create mode 100644 parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n18.yaml diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-a.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-a.yaml new file mode 100644 index 000000000..1cb844018 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-a.yaml @@ -0,0 +1,26 @@ +# Instrument metadata +# ------------------- +commissioned: 2009-12-15T00:00:00 + +observer_type: satellite # Type of chronicle to use + +# Instrument initial configuration +# -------------------------------- +channel_variables: + simulated: min + active: min + biascorrtd: min + error: max + error_cld: max + ermax: max + var_b: min + var_pg: min + icld_det: min + icloud: min + iaerosol: min +channel_values: + 1: [ 1, -1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 2: [ 1, -1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 3: [ 1, -1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 4: [ 1, -1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 5: [ 1, -1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n18.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n18.yaml new file mode 100644 index 000000000..7b543da32 --- /dev/null +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n18.yaml @@ -0,0 +1,26 @@ +# Instrument metadata +# ------------------- +commissioned: 2009-12-15T00:00:00 + +observer_type: satellite # Type of chronicle to use + +# Instrument initial configuration +# -------------------------------- +channel_variables: + simulated: min + active: min + biascorrtd: min + error: max + error_cld: max + ermax: max + var_b: min + var_pg: min + icld_det: min + icloud: min + iaerosol: min +channel_values: + 1: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 2: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 3: [ 1, 1, 1, 2.50, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 4: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] + 5: [ 1, 1, 1, 2.00, 0.00, 6.00, 10.00, 0.00, -2, -1, -1 ] From 0e42c211f38ee06e1369fc6b6b987246ffa4bf7e Mon Sep 17 00:00:00 2001 From: jianjunj Date: Thu, 26 Mar 2026 15:28:31 -0500 Subject: [PATCH 03/15] Initial configurations of MHS_Metop-C observations. --- parm/atm/atm_obs_list.yaml.j2 | 1 + .../atmosphere/radiance_mhs_metop-c.yaml | 2 +- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 302 ++++++++++++++++++ 3 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 diff --git a/parm/atm/atm_obs_list.yaml.j2 b/parm/atm/atm_obs_list.yaml.j2 index 61b483f68..48946a1b1 100644 --- a/parm/atm/atm_obs_list.yaml.j2 +++ b/parm/atm/atm_obs_list.yaml.j2 @@ -31,6 +31,7 @@ observations: ##- cris-fsr_n21 ##- atms_npp - radiance_atms_n20 +- radiance_mhs_metop-c ##- gnssro_cosmic2 ##- gnssro_spire ##- gnssro_s6 diff --git a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml index 7b543da32..86362b31c 100644 --- a/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml +++ b/parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml @@ -1,6 +1,6 @@ # Instrument metadata # ------------------- -commissioned: 2009-12-15T00:00:00 +commissioned: 2019-10-30T00:00:00 observer_type: satellite # Type of chronicle to use diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 new file mode 100644 index 000000000..3d74d4e1a --- /dev/null +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -0,0 +1,302 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: {{observation_from_jcb}} + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: warn + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &{{observation_from_jcb}}_simulated_channels {{ get_satellite_variable(observation_from_jcb, "simulated") }} + + # Observation Operator + # -------------------- + obs operator: + name: CRTM + Absorbers: [H2O, O3, CO2] + obs options: + Sensor_ID: &{{observation_from_jcb}}_sensor_id mhs_metop-c + EndianType: little_endian + CoefficientPath: "{{crtm_coefficient_path}}" + linear obs operator: + Absorbers: [H2O, O3] + + # Observation Bias Correction (VarBC) + # ----------------------------------- + obs bias: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiasin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasin_suffix}}" + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiasout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasout_suffix}}" + variational bc: + predictors: + - name: constant + - name: lapseRate + order: 2 + tlapse: &{{observation_from_jcb}}_tlapse "{{atmosphere_obsbiasin_path}}/{{atmosphere_obstlapsein_prefix}}{{observation_from_jcb}}{{atmosphere_obstlapsein_suffix}}" + - name: lapseRate + tlapse: *{{observation_from_jcb}}_tlapse + - name: emissivityJacobian + - name: sensorScanAngle + order: 4 + - name: sensorScanAngle + order: 3 + - name: sensorScanAngle + order: 2 + - name: sensorScanAngle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiascovin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovin_suffix}}" + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiascovout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovout_suffix}}" + + # ------------------------ + obs pre filters: + # Remove Observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: 1-5 + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 10-81 + action: + name: reduce obs space + +# # Data Thinning +# - filter: Gaussian Thinning +# horizontal_mesh: 145 +# use_reduced_horizontal_grid: true +# distance_norm: geodesic +# round_horizontal_bin_count_to_nearest: true +# # partition_longitude_bins_using_mesh: true +# action: +# name: reduce obs space + +# # Observation Post Filters (QC) +# # ----------------------------- + obs post filters: + # Step 1: Observation Range Sanity Check + # Valid range: (50, 550) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + minvalue: 50.00001 + maxvalue: 549.99999 + action: + name: reject + # Step *: Initial Observation Error Assignment + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: assign error + error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] +## Assign surface_sea_ice_snow = 1 if surface type is sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_sea_ice_snow + type: int + value: 1 + where: + - variable: + name: GeoVaLs/land_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/ice_area_fraction + minvalue: 0.99 + where operator: or +## Assign surface_sea_ice_snow = 0 if surface type is not sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_sea_ice_snow + type: int + value: 0 + where: + - variable: + name: GeoVaLs/land_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/ice_area_fraction + maxvalue: 0.99 + max_exclusive: true + +## ObsValue - HofX at channel 1 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsMinusHofx_1 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature_1 + - name: HofX/brightnessTemperature_1 + coefs: + - 1 + - -1 +## ObsValue - HofX at channel 2 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsMinusHofx_2 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature_2 + - name: HofX/brightnessTemperature_2 + coefs: + - 1 + - -1 +###### "cloud_index (clw_obs)" in GSI + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx_1 + - name: DerivedMetaData/ObsMinusHofx_2 + coefs: + - 0.85 + - -1 + where: + - variable: + name: DerivedMetaData/surface_sea_ice_snow + is_in: 0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 9.0 + where: + - variable: + name: DerivedMetaData/surface_sea_ice_snow + is_in: 1 + - variable: + name: DerivedMetaData/ObsMinusHofx_2 + minvalue: 300.0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float +# ## function = 0.13_r_kind*(tbc(1)-33.58_r_kind*tbc(2)/(h300-tb_obs(2))) in GSI + function: + name: ObsFunction/Arithmetic + options: + operator: "*" + value: 0.13 + variables: + - name: ObsFunction/Arithmetic + options: + operator: "-" + variables: + - name: DerivedMetaData/ObsMinusHofx_1 + - name: ObsFunction/Arithmetic + options: + operator: "*" + value: 33.58 + variables: + - name: ObsFunction/Arithmetic + options: + operator: "/" + variables: + - name: DerivedMetaData/ObsMinusHofx_2 + - name: ObsFunction/Arithmetic + options: + operator: "-" + value: 300.0 + variables: + - name: DerivedMetaData/ObsMinusHofx_2 + where: + - variable: + name: DerivedMetaData/surface_sea_ice_snow + is_in: 1 + - variable: + name: DerivedMetaData/ObsMinusHofx_2 + maxvalue: 300.0 + max_exclusive: true + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 0.0 + where: + - variable: + name: DerivedMetaData/cloud_index + maxvalue: 0.0 + +# tpwc_index =((ObsMinuxHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 +# where dsi = DerivedMetaData/cloud_index + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_index + type: float + function: + name: ObsFunction/Arithmetic + options: + operator: add + variables: + - name: ObsFunction/Arithmetic + options: + operator: pow + variables: + - name: ObsFunction/Arithmetic + options: + operator: div + variables: + - name: ObsFunction/Arithmetic + options: + operator: sub + variables: + - name: DerivedMetaData/ObsMinusHofx_1 + - name: ObsFunction/Arithmetic + options: + operator: mul + value: 7.5 + variables: + - name: DerivedMetaData/cloud_index + value: 10.0 + value: 2.0 + - name: ObsFunction/Arithmetic + options: + operator: pow + variables: + - name: DerivedMetaData/cloud_index + value: 2.0 + + # GeoVaLs for Driving Observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 47095 From 17d9e1027ce3498f08ca21a03b1bce9558195edf Mon Sep 17 00:00:00 2001 From: jianjunj Date: Fri, 27 Mar 2026 15:00:22 -0500 Subject: [PATCH 04/15] Correct the variable 'DerivedMetaData/surface_water_ice_snow'. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 3d74d4e1a..59af45398 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -108,40 +108,40 @@ action: name: assign error error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] -## Assign surface_sea_ice_snow = 1 if surface type is sea, ice, or snow. +## Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. - filter: Variable Assignment assignments: - - name: DerivedMetaData/surface_sea_ice_snow + - name: DerivedMetaData/surface_water_ice_snow type: int value: 1 where: - - variable: - name: GeoVaLs/land_area_fraction - minvalue: 0.99 - variable: name: GeoVaLs/water_area_fraction minvalue: 0.99 - variable: name: GeoVaLs/ice_area_fraction minvalue: 0.99 + - variable: + name: GeoVaLs/surface_snow_area_fraction + minvalue: 0.99 where operator: or -## Assign surface_sea_ice_snow = 0 if surface type is not sea, ice, or snow. +## Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. - filter: Variable Assignment assignments: - - name: DerivedMetaData/surface_sea_ice_snow + - name: DerivedMetaData/surface_water_ice_snow type: int value: 0 where: - variable: - name: GeoVaLs/land_area_fraction + name: GeoVaLs/water_area_fraction maxvalue: 0.99 max_exclusive: true - variable: - name: GeoVaLs/water_area_fraction + name: GeoVaLs/ice_area_fraction maxvalue: 0.99 max_exclusive: true - variable: - name: GeoVaLs/ice_area_fraction + name: GeoVaLs/surface_snow_area_fraction maxvalue: 0.99 max_exclusive: true @@ -189,7 +189,7 @@ - -1 where: - variable: - name: DerivedMetaData/surface_sea_ice_snow + name: DerivedMetaData/surface_water_ice_snow is_in: 0 - filter: Variable Assignment assignments: @@ -198,7 +198,7 @@ value: 9.0 where: - variable: - name: DerivedMetaData/surface_sea_ice_snow + name: DerivedMetaData/surface_water_ice_snow is_in: 1 - variable: name: DerivedMetaData/ObsMinusHofx_2 @@ -237,7 +237,7 @@ - name: DerivedMetaData/ObsMinusHofx_2 where: - variable: - name: DerivedMetaData/surface_sea_ice_snow + name: DerivedMetaData/surface_water_ice_snow is_in: 1 - variable: name: DerivedMetaData/ObsMinusHofx_2 From 4b4dd453d8133b01b5d449fe977e797fdcc7c854 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Mon, 30 Mar 2026 12:19:11 -0500 Subject: [PATCH 05/15] Corrected functions for cloud_index and tpwc_index. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 140 ++++++++---------- 1 file changed, 63 insertions(+), 77 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 59af45398..a3d2050d0 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -69,7 +69,7 @@ - filter: Domain Check filter variables: - name: brightnessTemperature - channels: 1-5 + channels: *{{observation_from_jcb}}_simulated_channels where: - variable: name: MetaData/sensorScanPosition @@ -145,31 +145,20 @@ maxvalue: 0.99 max_exclusive: true -## ObsValue - HofX at channel 1 - - filter: Variable Assignment - assignments: - - name: DerivedMetaData/ObsMinusHofx_1 - type: float - function: - name: ObsFunction/Arithmetic - options: - variables: - - name: ObsValue/brightnessTemperature_1 - - name: HofX/brightnessTemperature_1 - coefs: - - 1 - - -1 -## ObsValue - HofX at channel 2 +## ObsMinusHofx = ObsValue - HofX - filter: Variable Assignment assignments: - - name: DerivedMetaData/ObsMinusHofx_2 + - name: DerivedMetaData/ObsMinusHofx + channels: *{{observation_from_jcb}}_simulated_channels type: float function: name: ObsFunction/Arithmetic options: variables: - - name: ObsValue/brightnessTemperature_2 - - name: HofX/brightnessTemperature_2 + - name: ObsValue/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + - name: HofX/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels coefs: - 1 - -1 @@ -182,8 +171,10 @@ name: ObsFunction/Arithmetic options: variables: - - name: DerivedMetaData/ObsMinusHofx_1 - - name: DerivedMetaData/ObsMinusHofx_2 + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/ObsMinusHofx + channels: [2] coefs: - 0.85 - -1 @@ -201,46 +192,54 @@ name: DerivedMetaData/surface_water_ice_snow is_in: 1 - variable: - name: DerivedMetaData/ObsMinusHofx_2 + name: ObsValue/brightnessTemperature_2 minvalue: 300.0 + + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/diff_300_obs2 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature + channels: [2] + coefs: [-1] + intercept: 300.0 + # OmF_ch2 / (300 - Obs_ch2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/omf2_diff_300_obs2 + type: float + function: + name: ObsFunction/ElementMultiply + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [2] + - name: DerivedMetaData/diff_300_obs2 + exponents: [1, -1] - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index type: float -# ## function = 0.13_r_kind*(tbc(1)-33.58_r_kind*tbc(2)/(h300-tb_obs(2))) in GSI + ## function = 0.13 *(tbc(1)-33.58 *tbc(2)/(h300-tb_obs(2))) in GSI function: name: ObsFunction/Arithmetic options: - operator: "*" - value: 0.13 variables: - - name: ObsFunction/Arithmetic - options: - operator: "-" - variables: - - name: DerivedMetaData/ObsMinusHofx_1 - - name: ObsFunction/Arithmetic - options: - operator: "*" - value: 33.58 - variables: - - name: ObsFunction/Arithmetic - options: - operator: "/" - variables: - - name: DerivedMetaData/ObsMinusHofx_2 - - name: ObsFunction/Arithmetic - options: - operator: "-" - value: 300.0 - variables: - - name: DerivedMetaData/ObsMinusHofx_2 + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/omf2_diff_300_obs2 + coefs: [1, -33.58] + total coefficient: 0.13 where: - variable: name: DerivedMetaData/surface_water_ice_snow is_in: 1 - variable: - name: DerivedMetaData/ObsMinusHofx_2 + name: ObsValue/brightnessTemperature_2 maxvalue: 300.0 max_exclusive: true - filter: Variable Assignment @@ -253,8 +252,20 @@ name: DerivedMetaData/cloud_index maxvalue: 0.0 -# tpwc_index =((ObsMinuxHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 -# where dsi = DerivedMetaData/cloud_index + # tpwc_index =((ObsMinusHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_indexA + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/cloud_index + coefs: [1, -7.5] + total coefficient: 0.1 - filter: Variable Assignment assignments: - name: DerivedMetaData/tpwc_index @@ -262,35 +273,10 @@ function: name: ObsFunction/Arithmetic options: - operator: add variables: - - name: ObsFunction/Arithmetic - options: - operator: pow - variables: - - name: ObsFunction/Arithmetic - options: - operator: div - variables: - - name: ObsFunction/Arithmetic - options: - operator: sub - variables: - - name: DerivedMetaData/ObsMinusHofx_1 - - name: ObsFunction/Arithmetic - options: - operator: mul - value: 7.5 - variables: - - name: DerivedMetaData/cloud_index - value: 10.0 - value: 2.0 - - name: ObsFunction/Arithmetic - options: - operator: pow - variables: - - name: DerivedMetaData/cloud_index - value: 2.0 + - name: DerivedMetaData/tpwc_indexA + - name: DerivedMetaData/cloud_index + exponents: [2, 2] # GeoVaLs for Driving Observation Operators (testing mode) # -------------------------------------------------------- From 009b1daa5c90b56f73a76783c235e70fc380fa01 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Mon, 30 Mar 2026 23:43:26 -0500 Subject: [PATCH 06/15] Added error inflation and more QC in MHS data. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 141 +++++++++++++++++- 1 file changed, 133 insertions(+), 8 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index a3d2050d0..5f8a7eea5 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -87,8 +87,8 @@ # action: # name: reduce obs space -# # Observation Post Filters (QC) -# # ----------------------------- + # Observation Post Filters (QC) + # ----------------------------- obs post filters: # Step 1: Observation Range Sanity Check # Valid range: (50, 550) @@ -108,7 +108,7 @@ action: name: assign error error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] -## Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. + # Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. - filter: Variable Assignment assignments: - name: DerivedMetaData/surface_water_ice_snow @@ -125,7 +125,7 @@ name: GeoVaLs/surface_snow_area_fraction minvalue: 0.99 where operator: or -## Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. + # Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. - filter: Variable Assignment assignments: - name: DerivedMetaData/surface_water_ice_snow @@ -145,7 +145,7 @@ maxvalue: 0.99 max_exclusive: true -## ObsMinusHofx = ObsValue - HofX + # ObsMinusHofx = ObsValue - HofX - filter: Variable Assignment assignments: - name: DerivedMetaData/ObsMinusHofx @@ -162,7 +162,7 @@ coefs: - 1 - -1 -###### "cloud_index (clw_obs)" in GSI + # "cloud_index (clw_obs)" in GSI - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index @@ -207,7 +207,7 @@ channels: [2] coefs: [-1] intercept: 300.0 - # OmF_ch2 / (300 - Obs_ch2) + # OmF_ch2 / (300 - Obs_ch2) - filter: Variable Assignment assignments: - name: DerivedMetaData/omf2_diff_300_obs2 @@ -224,7 +224,7 @@ assignments: - name: DerivedMetaData/cloud_index type: float - ## function = 0.13 *(tbc(1)-33.58 *tbc(2)/(h300-tb_obs(2))) in GSI + # function = 0.13 *(tbc(1)-33.58 *tbc(2)/(h300-tb_obs(2))) in GSI function: name: ObsFunction/Arithmetic options: @@ -277,6 +277,131 @@ - name: DerivedMetaData/tpwc_indexA - name: DerivedMetaData/cloud_index exponents: [2, 2] +# assign an inflation factor inflationFactor0 = (1 - tpwc_index^2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor0 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/tpwc_index + coefs: [-1] + exponents: [2] + intercept: 1 +# assign an inflation factor inflationFactor1 = (iniflation0)^0.5 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/inflationFactor0 + exponents: [0.5] + + - filter: BlackList + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: 3-5 + absolute threshold: 2.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: reject +# Initial error inflation + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: DerivedMetaData/inflationFactor1 + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id +# Topography check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTopoRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels +# Transmittnace Top Check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorTransmitTopRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels +# Surface Jacobian check + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: ObsFunction/ObsErrorFactorSurfJacobianRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + sensor: *{{observation_from_jcb}}_sensor_id + obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + # Inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + sensor: *{{observation_from_jcb}}_sensor_id + use_flag: &{{observation_from_jcb}}_active_channels [{{ get_satellite_variable(observation_from_jcb, "active") }}] + maxvalue: 1.0e-12 + action: + name: reject # GeoVaLs for Driving Observation Operators (testing mode) # -------------------------------------------------------- From aac869fbed2fae0ba8b3ade950c7c4ffaedb9a38 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Tue, 31 Mar 2026 01:00:25 -0500 Subject: [PATCH 07/15] Upate QC in MHS data/ --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 5f8a7eea5..0f323fdb3 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -302,22 +302,6 @@ - name: DerivedMetaData/inflationFactor0 exponents: [0.5] - - filter: BlackList - where: - - variable: - name: DerivedMetaData/tpwc_index - minvalue: 1.0 - - filter: Background Check - filter variables: - - name: brightnessTemperature - channels: 3-5 - absolute threshold: 2.0 - where: - - variable: - name: DerivedMetaData/tpwc_index - maxvalue: 1.0 - action: - name: reject # Initial error inflation - filter: Perform Action filter variables: @@ -334,7 +318,7 @@ channels: *{{observation_from_jcb}}_simulated_channels options: sensor: *{{observation_from_jcb}}_sensor_id -# Topography check +# Inflate error at high topography - filter: Perform Action filter variables: - name: brightnessTemperature @@ -351,7 +335,7 @@ options: sensor: *{{observation_from_jcb}}_sensor_id channels: *{{observation_from_jcb}}_simulated_channels -# Transmittnace Top Check +# Inflate error with transmittnace - filter: Perform Action filter variables: - name: brightnessTemperature @@ -368,7 +352,7 @@ options: sensor: *{{observation_from_jcb}}_sensor_id channels: *{{observation_from_jcb}}_simulated_channels -# Surface Jacobian check + # Inflate error with surface Jacobian - filter: Perform Action filter variables: - name: brightnessTemperature @@ -387,6 +371,23 @@ sensor: *{{observation_from_jcb}}_sensor_id obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + # Quality control + - filter: BlackList + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: 3-5 + absolute threshold: 2.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: reject # Inter-channel check - filter: Bounds Check filter variables: @@ -402,6 +403,13 @@ maxvalue: 1.0e-12 action: name: reject +# # Final background check. +# - filter: Background Check +# filter variables: +# - name: brightnessTemperature +# channels: *{{observation_from_jcb}}_simulated_channels +# threshold: 3.0 +# absolute threshold vector: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] # GeoVaLs for Driving Observation Operators (testing mode) # -------------------------------------------------------- From fd07a6a918579fa3c304e8f65473631cba9e2fc9 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Tue, 31 Mar 2026 01:04:44 -0500 Subject: [PATCH 08/15] Updated the final background check. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 0f323fdb3..b42ab69ec 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -403,13 +403,13 @@ maxvalue: 1.0e-12 action: name: reject -# # Final background check. -# - filter: Background Check -# filter variables: -# - name: brightnessTemperature -# channels: *{{observation_from_jcb}}_simulated_channels -# threshold: 3.0 -# absolute threshold vector: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] + # Final background check. + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + threshold: 3.0 + absolute threshold vector: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] # GeoVaLs for Driving Observation Operators (testing mode) # -------------------------------------------------------- From 13a8ce0eafff41eb0751baa9ca9dfe0d9095c24d Mon Sep 17 00:00:00 2001 From: jianjunj Date: Thu, 2 Apr 2026 00:28:32 -0500 Subject: [PATCH 09/15] Add 'ObsErrorBound'. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 132 +++++++++++++----- 1 file changed, 100 insertions(+), 32 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index b42ab69ec..3c4884f8c 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -277,7 +277,7 @@ - name: DerivedMetaData/tpwc_indexA - name: DerivedMetaData/cloud_index exponents: [2, 2] -# assign an inflation factor inflationFactor0 = (1 - tpwc_index^2) + # assign inflationFactor0 = (1 - tpwc_index^2) - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor0 @@ -290,7 +290,11 @@ coefs: [-1] exponents: [2] intercept: 1 -# assign an inflation factor inflationFactor1 = (iniflation0)^0.5 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # assign an inflation factor inflationFactor1 = 1.0/(inflationFactor0)^(0.5) - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1 @@ -300,9 +304,23 @@ options: variables: - name: DerivedMetaData/inflationFactor0 - exponents: [0.5] + exponents: [-0.5] + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # assign inflationFactor1=1.0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + value: 1.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 -# Initial error inflation + # Initial error inflation - filter: Perform Action filter variables: - name: brightnessTemperature @@ -318,59 +336,115 @@ channels: *{{observation_from_jcb}}_simulated_channels options: sensor: *{{observation_from_jcb}}_sensor_id -# Inflate error at high topography + + # Observation Error Inflation based on Topography Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTopoRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels - filter: Perform Action filter variables: - name: brightnessTemperature channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels where: - variable: name: DerivedMetaData/tpwc_index maxvalue: 1.0 - action: - name: inflate error - inflation variable: - name: ObsFunction/ObsErrorFactorTopoRad + + # Obs Error Inflation based on TOA Transmittancec Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTransmitTopRad@ObsFunction channels: *{{observation_from_jcb}}_simulated_channels options: - sensor: *{{observation_from_jcb}}_sensor_id channels: *{{observation_from_jcb}}_simulated_channels -# Inflate error with transmittnace + - filter: Perform Action filter variables: - name: brightnessTemperature channels: *{{observation_from_jcb}}_simulated_channels - where: - - variable: - name: DerivedMetaData/tpwc_index - maxvalue: 1.0 action: name: inflate error inflation variable: - name: ObsFunction/ObsErrorFactorTransmitTopRad + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # Observation Error Inflation based on Surface Jacobian Check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction channels: *{{observation_from_jcb}}_simulated_channels options: sensor: *{{observation_from_jcb}}_sensor_id channels: *{{observation_from_jcb}}_simulated_channels - # Inflate error with surface Jacobian + obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] + obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + - filter: Perform Action filter variables: - name: brightnessTemperature channels: *{{observation_from_jcb}}_simulated_channels - where: - - variable: - name: DerivedMetaData/tpwc_index - maxvalue: 1.0 action: name: inflate error inflation variable: - name: ObsFunction/ObsErrorFactorSurfJacobianRad + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + # Find gross error check bound. + # Note, use DerivedMetaData/inflationFactor1 for "obserr_bound_latitude" + - filter: Variable Assignment + assignments: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorBoundMW@ObsFunction channels: *{{observation_from_jcb}}_simulated_channels options: - channels: *{{observation_from_jcb}}_simulated_channels sensor: *{{observation_from_jcb}}_sensor_id - obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] - obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_latitude: + name: DerivedMetaData/inflationFactor1 + obserr_bound_transmittop: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_topo: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + error parameter vector: *{{observation_from_jcb}}_oberr + threshold: 3 + obserr_bound_max: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + function absolute threshold: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: reject + # Quality control - filter: BlackList where: @@ -388,6 +462,7 @@ maxvalue: 1.0 action: name: reject + # Inter-channel check - filter: Bounds Check filter variables: @@ -403,13 +478,6 @@ maxvalue: 1.0e-12 action: name: reject - # Final background check. - - filter: Background Check - filter variables: - - name: brightnessTemperature - channels: *{{observation_from_jcb}}_simulated_channels - threshold: 3.0 - absolute threshold vector: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] # GeoVaLs for Driving Observation Operators (testing mode) # -------------------------------------------------------- From 00e74465850f445b33955ed6f06288fd276e7157 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Tue, 7 Apr 2026 13:58:01 -0500 Subject: [PATCH 10/15] Updated observational error inflations. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 98 ++++++++++--------- 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 3c4884f8c..8be362f6b 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -65,7 +65,7 @@ # ------------------------ obs pre filters: - # Remove Observations from the Edge of the Scan + # Remove observations from the Edge of the Scan - filter: Domain Check filter variables: - name: brightnessTemperature @@ -90,7 +90,7 @@ # Observation Post Filters (QC) # ----------------------------- obs post filters: - # Step 1: Observation Range Sanity Check + # Step A: Conduct observation range sanity check # Valid range: (50, 550) - filter: Bounds Check filter variables: @@ -100,7 +100,7 @@ maxvalue: 549.99999 action: name: reject - # Step *: Initial Observation Error Assignment + # Step B: Do initial observation error Assignment - filter: Perform Action filter variables: - name: brightnessTemperature @@ -108,7 +108,7 @@ action: name: assign error error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] - # Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. + # Step C: Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. - filter: Variable Assignment assignments: - name: DerivedMetaData/surface_water_ice_snow @@ -125,7 +125,7 @@ name: GeoVaLs/surface_snow_area_fraction minvalue: 0.99 where operator: or - # Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. + # Step C1: Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. - filter: Variable Assignment assignments: - name: DerivedMetaData/surface_water_ice_snow @@ -145,7 +145,7 @@ maxvalue: 0.99 max_exclusive: true - # ObsMinusHofx = ObsValue - HofX + # Step D: Get Departure ObsMinusHofx = ObsValue - HofX - filter: Variable Assignment assignments: - name: DerivedMetaData/ObsMinusHofx @@ -162,7 +162,7 @@ coefs: - 1 - -1 - # "cloud_index (clw_obs)" in GSI + # Step E: Get cloud_index ("dsi" in GSI sub "qc_mhs") - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index @@ -182,6 +182,7 @@ - variable: name: DerivedMetaData/surface_water_ice_snow is_in: 0 + # Step E1: Get cloud_index ("dsi" in GSI sub "qc_mhs") - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index @@ -194,7 +195,7 @@ - variable: name: ObsValue/brightnessTemperature_2 minvalue: 300.0 - + # Step E2: Define 300-Obs(ch2) - filter: Variable Assignment assignments: - name: DerivedMetaData/diff_300_obs2 @@ -207,7 +208,7 @@ channels: [2] coefs: [-1] intercept: 300.0 - # OmF_ch2 / (300 - Obs_ch2) + # Step E3: Define "OmF_ch2 / (300 - Obs_ch2)" - filter: Variable Assignment assignments: - name: DerivedMetaData/omf2_diff_300_obs2 @@ -220,6 +221,7 @@ channels: [2] - name: DerivedMetaData/diff_300_obs2 exponents: [1, -1] + # Step E4: Get final 'cloud_index' ('dsi' in qc_mhs in GSI) - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index @@ -242,6 +244,7 @@ name: ObsValue/brightnessTemperature_2 maxvalue: 300.0 max_exclusive: true + # Step E5: Make cloud_index >= 0 - filter: Variable Assignment assignments: - name: DerivedMetaData/cloud_index @@ -252,7 +255,7 @@ name: DerivedMetaData/cloud_index maxvalue: 0.0 - # tpwc_index =((ObsMinusHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 + # Step F: Get tpwc_index =((ObsMinusHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 - filter: Variable Assignment assignments: - name: DerivedMetaData/tpwc_indexA @@ -266,6 +269,7 @@ - name: DerivedMetaData/cloud_index coefs: [1, -7.5] total coefficient: 0.1 + # Step F1: Get the final 'tpwc_index' (it is 'fact1' in qc_mhs() in GSI) - filter: Variable Assignment assignments: - name: DerivedMetaData/tpwc_index @@ -277,7 +281,7 @@ - name: DerivedMetaData/tpwc_indexA - name: DerivedMetaData/cloud_index exponents: [2, 2] - # assign inflationFactor0 = (1 - tpwc_index^2) + # Step H: Assign inflationFactor0 = (1 - tpwc_index^2) - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor0 @@ -294,7 +298,7 @@ - variable: name: DerivedMetaData/tpwc_index maxvalue: 1.0 - # assign an inflation factor inflationFactor1 = 1.0/(inflationFactor0)^(0.5) + # Step H1: Assign inflationFactor1 = 1.0/(inflationFactor0)^(0.5) - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1 @@ -309,7 +313,7 @@ - variable: name: DerivedMetaData/tpwc_index maxvalue: 1.0 - # assign inflationFactor1=1.0 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1 @@ -320,7 +324,7 @@ name: DerivedMetaData/tpwc_index minvalue: 1.0 - # Initial error inflation + # Step J: Initial error inflation by inflationFactor1 - filter: Perform Action filter variables: - name: brightnessTemperature @@ -337,7 +341,7 @@ options: sensor: *{{observation_from_jcb}}_sensor_id - # Observation Error Inflation based on Topography Check + # Step J1: Observation error inflation based on topography check - filter: Variable Assignment assignments: - name: ObsErrorFactorTopo@DerivedMetaData @@ -363,7 +367,7 @@ name: DerivedMetaData/tpwc_index maxvalue: 1.0 - # Obs Error Inflation based on TOA Transmittancec Check + # Step J2: Obs error inflation based on TOA Transmittancec check - filter: Variable Assignment assignments: - name: ObsErrorFactorTransmitTop@DerivedMetaData @@ -385,31 +389,7 @@ name: ObsErrorFactorTransmitTop@DerivedMetaData channels: *{{observation_from_jcb}}_simulated_channels - # Observation Error Inflation based on Surface Jacobian Check - - filter: Variable Assignment - assignments: - - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *{{observation_from_jcb}}_simulated_channels - type: float - function: - name: ObsErrorFactorSurfJacobianRad@ObsFunction - channels: *{{observation_from_jcb}}_simulated_channels - options: - sensor: *{{observation_from_jcb}}_sensor_id - channels: *{{observation_from_jcb}}_simulated_channels - obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] - obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] - - - filter: Perform Action - filter variables: - - name: brightnessTemperature - channels: *{{observation_from_jcb}}_simulated_channels - action: - name: inflate error - inflation variable: - name: ObsErrorFactorSurfJacobian@DerivedMetaData - channels: *{{observation_from_jcb}}_simulated_channels - # Find gross error check bound. + # Step K: Find gross error check bounds # Note, use DerivedMetaData/inflationFactor1 for "obserr_bound_latitude" - filter: Variable Assignment assignments: @@ -435,6 +415,7 @@ error parameter vector: *{{observation_from_jcb}}_oberr threshold: 3 obserr_bound_max: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] + # Step K1: Gross error check - filter: Background Check filter variables: - name: brightnessTemperature @@ -445,7 +426,7 @@ action: name: reject - # Quality control + # Step K2: Toss channel 3-5 data with O-F > 2K - filter: BlackList where: - variable: @@ -463,7 +444,7 @@ action: name: reject - # Inter-channel check + # Step L: Conduct inter-channel check - filter: Bounds Check filter variables: - name: brightnessTemperature @@ -479,7 +460,36 @@ action: name: reject - # GeoVaLs for Driving Observation Operators (testing mode) + # Step M: Observation error inflation based on surface Jacobian check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + # obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] + # obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + # x3 if not sea for MHS + # surface type sea, land, ice, snow, mixed + obserr_demisf: [0.015, 0.090, 0.060, 0.060, 0.750] + obserr_dtempf: [0.500, 6.000, 3.000, 6.000, 15.00] + # Step M1: Inflate observation error + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # GeoVaLs for Driving observation Operators (testing mode) # -------------------------------------------------------- geovals: filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" From a9a0127215b7b53f45a30afc6afad5c161b8930b Mon Sep 17 00:00:00 2001 From: jianjunj Date: Tue, 7 Apr 2026 15:06:03 -0500 Subject: [PATCH 11/15] Set passedBenchmark: 0. --- .../observations/atmosphere/radiance_mhs_metop-c.yaml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 8be362f6b..b11ba23a9 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -496,4 +496,4 @@ # Passed benchmark for UFO testing # -------------------------------- - passedBenchmark: 47095 + passedBenchmark: 0 From 9ec21f28b49adf5a78c6b40214f4bcd1e176fdb5 Mon Sep 17 00:00:00 2001 From: jianjunj Date: Wed, 8 Apr 2026 14:02:22 -0500 Subject: [PATCH 12/15] Add 'use passive_bc: true' in the InterChannelConsistencyCheck. --- .../atmosphere/radiance_mhs_metop-c.yaml.j2 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index b11ba23a9..3285d8bfc 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -456,10 +456,27 @@ channels: *{{observation_from_jcb}}_simulated_channels sensor: *{{observation_from_jcb}}_sensor_id use_flag: &{{observation_from_jcb}}_active_channels [{{ get_satellite_variable(observation_from_jcb, "active") }}] + use passive_bc: true maxvalue: 1.0e-12 action: name: reject + # Step L1: Conduct Useflag check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + use_flag: *{{observation_from_jcb}}_active_channels + minvalue: 1.0e-12 + action: + name: reject + # Step M: Observation error inflation based on surface Jacobian check - filter: Variable Assignment assignments: From 881fec7c0c4fddf0cf113ea545d4985a6c4475ba Mon Sep 17 00:00:00 2001 From: jianjunj Date: Wed, 8 Apr 2026 14:04:09 -0500 Subject: [PATCH 13/15] Add configurations for mhs_metop-b and mhs_n19. --- .../atmosphere/radiance_mhs_metop-b.yaml.j2 | 516 ++++++++++++++++++ .../atmosphere/radiance_mhs_n19.yaml.j2 | 516 ++++++++++++++++++ 2 files changed, 1032 insertions(+) create mode 100644 parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 create mode 100644 parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 new file mode 100644 index 000000000..d9e9cb572 --- /dev/null +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 @@ -0,0 +1,516 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: {{observation_from_jcb}} + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: warn + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &{{observation_from_jcb}}_simulated_channels {{ get_satellite_variable(observation_from_jcb, "simulated") }} + + # Observation Operator + # -------------------- + obs operator: + name: CRTM + Absorbers: [H2O, O3, CO2] + obs options: + Sensor_ID: &{{observation_from_jcb}}_sensor_id mhs_metop-b + EndianType: little_endian + CoefficientPath: "{{crtm_coefficient_path}}" + linear obs operator: + Absorbers: [H2O, O3] + + # Observation Bias Correction (VarBC) + # ----------------------------------- + obs bias: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiasin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasin_suffix}}" + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiasout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasout_suffix}}" + variational bc: + predictors: + - name: constant + - name: lapseRate + order: 2 + tlapse: &{{observation_from_jcb}}_tlapse "{{atmosphere_obsbiasin_path}}/{{atmosphere_obstlapsein_prefix}}{{observation_from_jcb}}{{atmosphere_obstlapsein_suffix}}" + - name: lapseRate + tlapse: *{{observation_from_jcb}}_tlapse + - name: emissivityJacobian + - name: sensorScanAngle + order: 4 + - name: sensorScanAngle + order: 3 + - name: sensorScanAngle + order: 2 + - name: sensorScanAngle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiascovin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovin_suffix}}" + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiascovout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovout_suffix}}" + + # ------------------------ + obs pre filters: + # Remove observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 10-81 + action: + name: reduce obs space + +# # Data Thinning +# - filter: Gaussian Thinning +# horizontal_mesh: 145 +# use_reduced_horizontal_grid: true +# distance_norm: geodesic +# round_horizontal_bin_count_to_nearest: true +# # partition_longitude_bins_using_mesh: true +# action: +# name: reduce obs space + + # Observation Post Filters (QC) + # ----------------------------- + obs post filters: + # Step A: Conduct observation range sanity check + # Valid range: (50, 550) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + minvalue: 50.00001 + maxvalue: 549.99999 + action: + name: reject + # Step B: Do initial observation error Assignment + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: assign error + error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] + # Step C: Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_water_ice_snow + type: int + value: 1 + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/ice_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/surface_snow_area_fraction + minvalue: 0.99 + where operator: or + # Step C1: Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_water_ice_snow + type: int + value: 0 + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/ice_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/surface_snow_area_fraction + maxvalue: 0.99 + max_exclusive: true + + # Step D: Get Departure ObsMinusHofx = ObsValue - HofX + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsMinusHofx + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + - name: HofX/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + coefs: + - 1 + - -1 + # Step E: Get cloud_index ("dsi" in GSI sub "qc_mhs") + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/ObsMinusHofx + channels: [2] + coefs: + - 0.85 + - -1 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 0 + # Step E1: Get cloud_index ("dsi" in GSI sub "qc_mhs") + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 9.0 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 1 + - variable: + name: ObsValue/brightnessTemperature_2 + minvalue: 300.0 + # Step E2: Define 300-Obs(ch2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/diff_300_obs2 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature + channels: [2] + coefs: [-1] + intercept: 300.0 + # Step E3: Define "OmF_ch2 / (300 - Obs_ch2)" + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/omf2_diff_300_obs2 + type: float + function: + name: ObsFunction/ElementMultiply + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [2] + - name: DerivedMetaData/diff_300_obs2 + exponents: [1, -1] + # Step E4: Get final 'cloud_index' ('dsi' in qc_mhs in GSI) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + # function = 0.13 *(tbc(1)-33.58 *tbc(2)/(h300-tb_obs(2))) in GSI + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/omf2_diff_300_obs2 + coefs: [1, -33.58] + total coefficient: 0.13 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 1 + - variable: + name: ObsValue/brightnessTemperature_2 + maxvalue: 300.0 + max_exclusive: true + # Step E5: Make cloud_index >= 0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 0.0 + where: + - variable: + name: DerivedMetaData/cloud_index + maxvalue: 0.0 + + # Step F: Get tpwc_index =((ObsMinusHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_indexA + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/cloud_index + coefs: [1, -7.5] + total coefficient: 0.1 + # Step F1: Get the final 'tpwc_index' (it is 'fact1' in qc_mhs() in GSI) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_index + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/tpwc_indexA + - name: DerivedMetaData/cloud_index + exponents: [2, 2] + # Step H: Assign inflationFactor0 = (1 - tpwc_index^2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor0 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/tpwc_index + coefs: [-1] + exponents: [2] + intercept: 1 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # Step H1: Assign inflationFactor1 = 1.0/(inflationFactor0)^(0.5) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/inflationFactor0 + exponents: [-0.5] + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + value: 1.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + + # Step J: Initial error inflation by inflationFactor1 + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: DerivedMetaData/inflationFactor1 + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + + # Step J1: Observation error inflation based on topography check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTopoRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + + # Step J2: Obs error inflation based on TOA Transmittancec check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTransmitTopRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # Step K: Find gross error check bounds + # Note, use DerivedMetaData/inflationFactor1 for "obserr_bound_latitude" + - filter: Variable Assignment + assignments: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorBoundMW@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_latitude: + name: DerivedMetaData/inflationFactor1 + obserr_bound_transmittop: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_topo: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + error parameter vector: *{{observation_from_jcb}}_oberr + threshold: 3 + obserr_bound_max: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] + # Step K1: Gross error check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + function absolute threshold: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: reject + + # Step K2: Toss channel 3-5 data with O-F > 2K + - filter: BlackList + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: 3-5 + absolute threshold: 2.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: reject + + # Step L: Conduct inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + sensor: *{{observation_from_jcb}}_sensor_id + use_flag: &{{observation_from_jcb}}_active_channels [{{ get_satellite_variable(observation_from_jcb, "active") }}] + use passive_bc: true + maxvalue: 1.0e-12 + action: + name: reject + + # Step L1: Conduct Useflag check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + use_flag: *{{observation_from_jcb}}_active_channels + minvalue: 1.0e-12 + action: + name: reject + + # Step M: Observation error inflation based on surface Jacobian check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + # obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] + # obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + # x3 if not sea for MHS + # surface type sea, land, ice, snow, mixed + obserr_demisf: [0.015, 0.090, 0.060, 0.060, 0.750] + obserr_dtempf: [0.500, 6.000, 3.000, 6.000, 15.00] + # Step M1: Inflate observation error + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # GeoVaLs for Driving observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 0 diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 new file mode 100644 index 000000000..38e51996c --- /dev/null +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 @@ -0,0 +1,516 @@ +- + + # Observation Space (I/O) + # ----------------------- + obs space: + name: {{observation_from_jcb}} + obsdatain: + engine: + type: H5File + obsfile: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}{{atmosphere_obsdatain_suffix}}" + missing file action: warn + obsdataout: + engine: + type: H5File + obsfile: "{{atmosphere_obsdataout_path}}/{{atmosphere_obsdataout_prefix}}{{observation_from_jcb}}{{atmosphere_obsdataout_suffix}}" + io pool: + max pool size: 1 + simulated variables: [brightnessTemperature] + channels: &{{observation_from_jcb}}_simulated_channels {{ get_satellite_variable(observation_from_jcb, "simulated") }} + + # Observation Operator + # -------------------- + obs operator: + name: CRTM + Absorbers: [H2O, O3, CO2] + obs options: + Sensor_ID: &{{observation_from_jcb}}_sensor_id mhs_n19 + EndianType: little_endian + CoefficientPath: "{{crtm_coefficient_path}}" + linear obs operator: + Absorbers: [H2O, O3] + + # Observation Bias Correction (VarBC) + # ----------------------------------- + obs bias: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiasin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasin_suffix}}" + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiasout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiasout_suffix}}" + variational bc: + predictors: + - name: constant + - name: lapseRate + order: 2 + tlapse: &{{observation_from_jcb}}_tlapse "{{atmosphere_obsbiasin_path}}/{{atmosphere_obstlapsein_prefix}}{{observation_from_jcb}}{{atmosphere_obstlapsein_suffix}}" + - name: lapseRate + tlapse: *{{observation_from_jcb}}_tlapse + - name: emissivityJacobian + - name: sensorScanAngle + order: 4 + - name: sensorScanAngle + order: 3 + - name: sensorScanAngle + order: 2 + - name: sensorScanAngle + covariance: + minimal required obs number: 20 + variance range: [1.0e-6, 10.0] + step size: 1.0e-4 + largest analysis variance: 10000.0 + prior: + input file: "{{atmosphere_obsbiasin_path}}/{{atmosphere_obsbiascovin_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovin_suffix}}" + inflation: + ratio: 1.1 + ratio for small dataset: 2.0 + output file: "{{atmosphere_obsbiasout_path}}/{{atmosphere_obsbiascovout_prefix}}{{observation_from_jcb}}{{atmosphere_obsbiascovout_suffix}}" + + # ------------------------ + obs pre filters: + # Remove observations from the Edge of the Scan + - filter: Domain Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: MetaData/sensorScanPosition + is_in: 10-81 + action: + name: reduce obs space + +# # Data Thinning +# - filter: Gaussian Thinning +# horizontal_mesh: 145 +# use_reduced_horizontal_grid: true +# distance_norm: geodesic +# round_horizontal_bin_count_to_nearest: true +# # partition_longitude_bins_using_mesh: true +# action: +# name: reduce obs space + + # Observation Post Filters (QC) + # ----------------------------- + obs post filters: + # Step A: Conduct observation range sanity check + # Valid range: (50, 550) + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + minvalue: 50.00001 + maxvalue: 549.99999 + action: + name: reject + # Step B: Do initial observation error Assignment + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: assign error + error parameter vector: &{{observation_from_jcb}}_oberr [{{ get_satellite_variable(observation_from_jcb, "error") }}] + # Step C: Assign surface_water_ice_snow = 1 if surface type is sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_water_ice_snow + type: int + value: 1 + where: + - variable: + name: GeoVaLs/water_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/ice_area_fraction + minvalue: 0.99 + - variable: + name: GeoVaLs/surface_snow_area_fraction + minvalue: 0.99 + where operator: or + # Step C1: Assign surface_water_ice_snow = 0 if surface type is not sea, ice, or snow. + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/surface_water_ice_snow + type: int + value: 0 + where: + - variable: + name: GeoVaLs/water_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/ice_area_fraction + maxvalue: 0.99 + max_exclusive: true + - variable: + name: GeoVaLs/surface_snow_area_fraction + maxvalue: 0.99 + max_exclusive: true + + # Step D: Get Departure ObsMinusHofx = ObsValue - HofX + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/ObsMinusHofx + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + - name: HofX/brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + coefs: + - 1 + - -1 + # Step E: Get cloud_index ("dsi" in GSI sub "qc_mhs") + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/ObsMinusHofx + channels: [2] + coefs: + - 0.85 + - -1 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 0 + # Step E1: Get cloud_index ("dsi" in GSI sub "qc_mhs") + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 9.0 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 1 + - variable: + name: ObsValue/brightnessTemperature_2 + minvalue: 300.0 + # Step E2: Define 300-Obs(ch2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/diff_300_obs2 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/brightnessTemperature + channels: [2] + coefs: [-1] + intercept: 300.0 + # Step E3: Define "OmF_ch2 / (300 - Obs_ch2)" + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/omf2_diff_300_obs2 + type: float + function: + name: ObsFunction/ElementMultiply + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [2] + - name: DerivedMetaData/diff_300_obs2 + exponents: [1, -1] + # Step E4: Get final 'cloud_index' ('dsi' in qc_mhs in GSI) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + # function = 0.13 *(tbc(1)-33.58 *tbc(2)/(h300-tb_obs(2))) in GSI + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/omf2_diff_300_obs2 + coefs: [1, -33.58] + total coefficient: 0.13 + where: + - variable: + name: DerivedMetaData/surface_water_ice_snow + is_in: 1 + - variable: + name: ObsValue/brightnessTemperature_2 + maxvalue: 300.0 + max_exclusive: true + # Step E5: Make cloud_index >= 0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/cloud_index + type: float + value: 0.0 + where: + - variable: + name: DerivedMetaData/cloud_index + maxvalue: 0.0 + + # Step F: Get tpwc_index =((ObsMinusHofX_1 - 7.5*dsi)/10.0)**2+(dsi)**2 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_indexA + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/ObsMinusHofx + channels: [1] + - name: DerivedMetaData/cloud_index + coefs: [1, -7.5] + total coefficient: 0.1 + # Step F1: Get the final 'tpwc_index' (it is 'fact1' in qc_mhs() in GSI) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/tpwc_index + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/tpwc_indexA + - name: DerivedMetaData/cloud_index + exponents: [2, 2] + # Step H: Assign inflationFactor0 = (1 - tpwc_index^2) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor0 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/tpwc_index + coefs: [-1] + exponents: [2] + intercept: 1 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # Step H1: Assign inflationFactor1 = 1.0/(inflationFactor0)^(0.5) + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedMetaData/inflationFactor0 + exponents: [-0.5] + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 + - filter: Variable Assignment + assignments: + - name: DerivedMetaData/inflationFactor1 + type: float + value: 1.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + + # Step J: Initial error inflation by inflationFactor1 + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: inflate error + inflation variable: + name: DerivedMetaData/inflationFactor1 + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + + # Step J1: Observation error inflation based on topography check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTopoRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + + # Step J2: Obs error inflation based on TOA Transmittancec check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorTransmitTopRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # Step K: Find gross error check bounds + # Note, use DerivedMetaData/inflationFactor1 for "obserr_bound_latitude" + - filter: Variable Assignment + assignments: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorBoundMW@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_latitude: + name: DerivedMetaData/inflationFactor1 + obserr_bound_transmittop: + name: ObsErrorFactorTransmitTop@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + obserr_bound_topo: + name: ObsErrorFactorTopo@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + error parameter vector: *{{observation_from_jcb}}_oberr + threshold: 3 + obserr_bound_max: [{{ get_satellite_variable(observation_from_jcb, "ermax") }}] + # Step K1: Gross error check + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + function absolute threshold: + - name: ObsErrorBound@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: reject + + # Step K2: Toss channel 3-5 data with O-F > 2K + - filter: BlackList + where: + - variable: + name: DerivedMetaData/tpwc_index + minvalue: 1.0 + - filter: Background Check + filter variables: + - name: brightnessTemperature + channels: 3-5 + absolute threshold: 2.0 + where: + - variable: + name: DerivedMetaData/tpwc_index + maxvalue: 1.0 + action: + name: reject + + # Step L: Conduct inter-channel check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/InterChannelConsistencyCheck + channels: *{{observation_from_jcb}}_simulated_channels + options: + channels: *{{observation_from_jcb}}_simulated_channels + sensor: *{{observation_from_jcb}}_sensor_id + use_flag: &{{observation_from_jcb}}_active_channels [{{ get_satellite_variable(observation_from_jcb, "active") }}] + use passive_bc: true + maxvalue: 1.0e-12 + action: + name: reject + + # Step L1: Conduct Useflag check + - filter: Bounds Check + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + test variables: + - name: ObsFunction/ChannelUseflagCheckRad + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + use_flag: *{{observation_from_jcb}}_active_channels + minvalue: 1.0e-12 + action: + name: reject + + # Step M: Observation error inflation based on surface Jacobian check + - filter: Variable Assignment + assignments: + - name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + type: float + function: + name: ObsErrorFactorSurfJacobianRad@ObsFunction + channels: *{{observation_from_jcb}}_simulated_channels + options: + sensor: *{{observation_from_jcb}}_sensor_id + channels: *{{observation_from_jcb}}_simulated_channels + # obserr_demisf: [0.015, 0.030, 0.020, 0.020, 0.250] + # obserr_dtempf: [0.500, 2.000, 1.000, 2.000, 5.000] + # x3 if not sea for MHS + # surface type sea, land, ice, snow, mixed + obserr_demisf: [0.015, 0.090, 0.060, 0.060, 0.750] + obserr_dtempf: [0.500, 6.000, 3.000, 6.000, 15.00] + # Step M1: Inflate observation error + - filter: Perform Action + filter variables: + - name: brightnessTemperature + channels: *{{observation_from_jcb}}_simulated_channels + action: + name: inflate error + inflation variable: + name: ObsErrorFactorSurfJacobian@DerivedMetaData + channels: *{{observation_from_jcb}}_simulated_channels + + # GeoVaLs for Driving observation Operators (testing mode) + # -------------------------------------------------------- + geovals: + filename: "{{atmosphere_obsdatain_path}}/{{atmosphere_obsdatain_prefix}}{{observation_from_jcb}}_geoval{{atmosphere_obsdatain_suffix}}" + + # Passed benchmark for UFO testing + # -------------------------------- + passedBenchmark: 0 From e433664080ff908bbdaf76a7e8285526899305af Mon Sep 17 00:00:00 2001 From: jianjunj Date: Wed, 8 Apr 2026 14:53:15 -0500 Subject: [PATCH 14/15] Added atmospheric observations mhs_metop-b, mhs_metop-c, and mhs_n19 passively. --- parm/atm/atm_obs_list.yaml.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parm/atm/atm_obs_list.yaml.j2 b/parm/atm/atm_obs_list.yaml.j2 index 48946a1b1..e776bd59e 100644 --- a/parm/atm/atm_obs_list.yaml.j2 +++ b/parm/atm/atm_obs_list.yaml.j2 @@ -31,7 +31,9 @@ observations: ##- cris-fsr_n21 ##- atms_npp - radiance_atms_n20 -- radiance_mhs_metop-c +##- radiance_mhs_metop-b +##- radiance_mhs_metop-c +##- radiance_mhs_n19 ##- gnssro_cosmic2 ##- gnssro_spire ##- gnssro_s6 From 07e63cc7b412939be814717e3400e44508f7524a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Apr 2026 21:07:43 +0000 Subject: [PATCH 15/15] Fix division-by-zero in inflationFactor1 when tpwc_index equals 1.0 in MHS templates Agent-Logs-Url: https://github.com/NOAA-EMC/GDASApp/sessions/499257a3-8036-47ab-8c43-8b7bc6e3dfab Co-authored-by: jianjunj <183659102+jianjunj@users.noreply.github.com> --- .../observations/atmosphere/radiance_mhs_metop-b.yaml.j2 | 4 ++-- .../observations/atmosphere/radiance_mhs_metop-c.yaml.j2 | 4 ++-- .../jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 index d9e9cb572..e29118ae6 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 @@ -312,8 +312,8 @@ where: - variable: name: DerivedMetaData/tpwc_index - maxvalue: 1.0 - # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 + maxvalue: 0.9999999 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index >= 1.0 - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1 diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 index 3285d8bfc..299e0175e 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 @@ -312,8 +312,8 @@ where: - variable: name: DerivedMetaData/tpwc_index - maxvalue: 1.0 - # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 + maxvalue: 0.9999999 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index >= 1.0 - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1 diff --git a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 index 38e51996c..0bf103ec1 100644 --- a/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 +++ b/parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 @@ -312,8 +312,8 @@ where: - variable: name: DerivedMetaData/tpwc_index - maxvalue: 1.0 - # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index > 1.0 + maxvalue: 0.9999999 + # Step H2: Assign inflationFactor1 = 1.0 where tpwc_index >= 1.0 - filter: Variable Assignment assignments: - name: DerivedMetaData/inflationFactor1