Feature/gdas phase1 mhs metop c configure#2116
Conversation
There was a problem hiding this comment.
Pull request overview
This PR extends the JCB-GDAS observation configuration catalog by adding clear-sky CRTM/UFO YAML templates and corresponding observation-chronicle metadata for MHS radiance instruments (Metop-B, Metop-C, and NOAA-19), aiming to reproduce GSI-like observation errors and QC behavior.
Changes:
- Added new MHS radiance observation templates (
radiance_mhs_metop-b,radiance_mhs_metop-c,radiance_mhs_n19) with detailed QC/error inflation logic. - Added/updated MHS observation-chronicle metadata files to provide channel configuration values used by the templates.
- Updated the atmosphere obs list to include the new radiance types (currently commented out).
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| parm/jcb-gdas/observations/atmosphere/radiance_mhs_n19.yaml.j2 | New clear-sky MHS(N19) CRTM/UFO obs config with QC + error modeling. |
| parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-c.yaml.j2 | New clear-sky MHS(Metop-C) CRTM/UFO obs config with QC + error modeling. |
| parm/jcb-gdas/observations/atmosphere/radiance_mhs_metop-b.yaml.j2 | New clear-sky MHS(Metop-B) CRTM/UFO obs config with QC + error modeling. |
| parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n19.yaml | New MHS(N19) channel metadata (sim/active/bias/error/etc.). |
| parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_n18.yaml | New MHS(N18) channel metadata. |
| parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-c.yaml | New MHS(Metop-C) channel metadata. |
| parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-b.yaml | New MHS(Metop-B) channel metadata. |
| parm/jcb-gdas/observation_chronicle/atmosphere/radiance_mhs_metop-a.yaml | New MHS(Metop-A) channel metadata. |
| parm/atm/atm_obs_list.yaml.j2 | Lists the new radiance types (commented out). |
| exponents: [-0.5] | ||
| where: | ||
| - variable: | ||
| name: DerivedMetaData/tpwc_index | ||
| maxvalue: 1.0 |
There was a problem hiding this comment.
inflationFactor1 is computed as inflationFactor0**(-0.5) while the preceding step allows tpwc_index up to (and including) 1.0, which makes inflationFactor0 = 1 - tpwc_index^2 equal to 0 at exactly 1.0. That yields 0**(-0.5) (division by zero / inf) before the later assignment overwrites it. Consider making the tpwc_index upper bound exclusive for the inflationFactor0/1 computations (or clamp with a small epsilon) and align the Step H2 comment/threshold accordingly.
There was a problem hiding this comment.
@copilot apply changes based on this feedback
There was a problem hiding this comment.
Fixed in commit 07e63cc. Changed Step H1's where condition from maxvalue: 1.0 to maxvalue: 0.9999999 in all three MHS templates (metop-b, metop-c, n19). This makes the upper bound exclusive so that when tpwc_index == 1.0 exactly (where inflationFactor0 = 0), only Step H2 runs and assigns inflationFactor1 = 1.0, avoiding the 0**(-0.5) division-by-zero. Also updated the Step H2 comment to accurately read tpwc_index >= 1.0.
| exponents: [-0.5] | ||
| where: | ||
| - variable: | ||
| name: DerivedMetaData/tpwc_index | ||
| maxvalue: 1.0 |
There was a problem hiding this comment.
inflationFactor1 is computed as inflationFactor0**(-0.5) while the preceding step allows tpwc_index up to (and including) 1.0, which makes inflationFactor0 = 1 - tpwc_index^2 equal to 0 at exactly 1.0. That yields 0**(-0.5) (division by zero / inf) before the later assignment overwrites it. Consider making the tpwc_index upper bound exclusive for the inflationFactor0/1 computations (or clamp with a small epsilon) and align the Step H2 comment/threshold accordingly.
There was a problem hiding this comment.
@copilot apply changes based on this feedback
| exponents: [-0.5] | ||
| where: | ||
| - variable: | ||
| name: DerivedMetaData/tpwc_index | ||
| maxvalue: 1.0 |
There was a problem hiding this comment.
inflationFactor1 is computed as inflationFactor0**(-0.5) while the preceding step allows tpwc_index up to (and including) 1.0, which makes inflationFactor0 = 1 - tpwc_index^2 equal to 0 at exactly 1.0. That yields 0**(-0.5) (division by zero / inf) before the later assignment overwrites it. Consider making the tpwc_index upper bound exclusive for the inflationFactor0/1 computations (or clamp with a small epsilon) and align the Step H2 comment/threshold accordingly.
There was a problem hiding this comment.
@copilot apply changes based on this feedback
| - filter: BlackList | ||
| where: | ||
| - variable: | ||
| name: DerivedMetaData/tpwc_index | ||
| minvalue: 1.0 |
There was a problem hiding this comment.
This BlackList filter rejects entire observations when tpwc_index >= 1.0, but the preceding comment describes only tossing channels 3–5 based on O–F > 2K. If the intent is to only reject specific channels (or only for tpwc_index > 1.0), add filter variables/action (and/or make the 1.0 bound exclusive) so the behavior matches the comment and avoids the current overlap with the subsequent tpwc_index maxvalue: 1.0 check.
| - filter: BlackList | |
| where: | |
| - variable: | |
| name: DerivedMetaData/tpwc_index | |
| minvalue: 1.0 | |
| - filter: BlackList | |
| filter variables: | |
| - name: brightnessTemperature | |
| channels: 3-5 | |
| where: | |
| - variable: | |
| name: DerivedMetaData/tpwc_index | |
| minvalue: 1.0 | |
| action: | |
| name: reject |
| where: | ||
| - variable: | ||
| name: DerivedMetaData/tpwc_index | ||
| minvalue: 1.0 |
There was a problem hiding this comment.
This BlackList filter rejects entire observations when tpwc_index >= 1.0, but the preceding comment describes only tossing channels 3–5 based on O–F > 2K. If the intent is to only reject specific channels (or only for tpwc_index > 1.0), add filter variables/action (and/or make the 1.0 bound exclusive) so the behavior matches the comment and avoids the current overlap with the subsequent tpwc_index maxvalue: 1.0 check.
| where: | |
| - variable: | |
| name: DerivedMetaData/tpwc_index | |
| minvalue: 1.0 | |
| filter variables: | |
| - name: brightnessTemperature | |
| channels: 3-5 | |
| action: | |
| name: reject | |
| where: | |
| - variable: | |
| name: DerivedMetaData/tpwc_index | |
| minvalue: 1.000001 |
| # 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 |
There was a problem hiding this comment.
This BlackList filter rejects entire observations when tpwc_index >= 1.0, but the preceding comment describes only tossing channels 3–5 based on O–F > 2K. If the intent is to only reject specific channels (or only for tpwc_index > 1.0), add filter variables/action (and/or make the 1.0 bound exclusive) so the behavior matches the comment and avoids the current overlap with the subsequent tpwc_index maxvalue: 1.0 check.
| # 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 | |
| # Step K2: Toss channel 3-5 data with O-F > 2K | |
| - filter: Background Check | |
| filter variables: | |
| - name: brightnessTemperature | |
| channels: 3-5 | |
| absolute threshold: 2.0 |
…n 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>






Description
Adds UFO/JCB YAML configurations for MHS on Metop-B, Metop-C, and NOAA-19, reproducing GSI clear-sky observational errors and QC. Obs error counts and data passing QC are verified to match GSI output (tested at 00z, Feb 19, 2024).
Fix (this commit): Step H1 computed
inflationFactor1 = inflationFactor0**(-0.5)withtpwc_index maxvalue: 1.0. Attpwc_index == 1.0,inflationFactor0 = 1 - 1² = 0, causing a division-by-zero before Step H2 could overwrite. Changed the H1wherebound tomaxvalue: 0.9999999(exclusive) sotpwc_index == 1.0is handled solely by Step H2 (inflationFactor1 = 1.0). Applied to all three MHS templates.Companion PRs
Issues
Automated CI tests to run in Global Workflow