From e753847ae3674431465eb216abc77df80a672dc8 Mon Sep 17 00:00:00 2001 From: "edward.safford" Date: Wed, 27 Dec 2023 15:23:10 +0000 Subject: [PATCH] Ref #13 Initial commit --- parm/gfs/conTime.yaml | 482 ++++++++++++++++++++++++++++++++++++++++ parm/gfs/gfs_plots.yaml | 6 + ush/plotObsMon.py | 34 ++- 3 files changed, 518 insertions(+), 4 deletions(-) create mode 100644 parm/gfs/conTime.yaml diff --git a/parm/gfs/conTime.yaml b/parm/gfs/conTime.yaml new file mode 100644 index 0000000..14db0e1 --- /dev/null +++ b/parm/gfs/conTime.yaml @@ -0,0 +1,482 @@ +############################################################################### +# +# Time series plots for ConMon gfs +# +# Generate separate 30 day time series plots for: +# - global +# num assimilated (count1.1, count1.2, where .1 = ges, .2 = anl) +# num rejected by vqc (count_vqc1.1, count_vqc1.2) +# num rejected by gc (count2.1, count2.2) +# num monitored (count3.1, count3.2) +# +############################################################################### + +diagnostics: + +# Data read +# --------- +datasets: + - name: ges + type: {{OBSTYPE}} + subtype: 00 + type: MonDataSpace + control_file: + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.ctl + filenames: + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATE | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm6 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm12 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm18 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm24 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm30 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm36 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm42 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm48 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm54 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm60 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm66 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm72 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm78 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm84 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm90 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm96 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm102 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm108 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm114 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm120 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm126 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm132 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm138 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm144 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm150 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm156 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm162 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm168 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm174 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm180 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm186 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm192 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm198 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm204 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm210 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm216 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm222 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm228 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm234 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm240 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm246 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm252 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm258 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm264 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm270 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm276 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm282 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm288 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm294 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm300 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm306 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm312 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm318 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm324 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm330 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm336 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm342 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm348 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm354 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm360 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm366 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm372 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm378 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm384 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm390 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm396 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm402 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm408 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm414 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm420 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm426 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm432 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm438 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm444 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm450 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm456 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm462 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm468 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm474 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm480 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm486 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm492 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm498 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm504 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm510 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm516 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm522 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm528 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm534 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm540 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm546 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm552 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm558 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm564 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm570 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm576 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm582 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm588 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm594 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm600 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm606 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm612 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm618 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm624 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm630 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm636 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm642 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm648 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm654 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm660 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm666 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm672 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm678 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm684 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm690 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm696 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm702 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm708 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm714 | to_YMDH }} + - {{DATA}}/con_data/ges_{{OBSTYPE}}_stas.{{ PDATEm720 | to_YMDH }} + + regions: 1 + + groups: + - name: ges + + - name: anl + type: {{OBSTYPE}} + subtype: 00 + type: MonDataSpace + control_file: + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.ctl + filenames: + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATE | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm6 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm12 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm18 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm24 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm30 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm36 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm42 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm48 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm54 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm60 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm66 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm72 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm78 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm84 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm90 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm96 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm102 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm108 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm114 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm120 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm126 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm132 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm138 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm144 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm150 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm156 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm162 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm168 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm174 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm180 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm186 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm192 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm198 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm204 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm210 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm216 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm222 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm228 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm234 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm240 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm246 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm252 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm258 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm264 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm270 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm276 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm282 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm288 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm294 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm300 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm306 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm312 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm318 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm324 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm330 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm336 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm342 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm348 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm354 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm360 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm366 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm372 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm378 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm384 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm390 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm396 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm402 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm408 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm414 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm420 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm426 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm432 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm438 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm444 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm450 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm456 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm462 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm468 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm474 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm480 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm486 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm492 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm498 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm504 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm510 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm516 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm522 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm528 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm534 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm540 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm546 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm552 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm558 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm564 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm570 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm576 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm582 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm588 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm594 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm600 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm606 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm612 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm618 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm624 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm630 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm636 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm642 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm648 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm654 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm660 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm666 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm672 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm678 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm684 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm690 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm696 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm702 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm708 | to_YMDH }} + - {{DATA}}/con_data/anl_{{OBSTYPE}}_stas.{{ PDATEm714 | to_YMDH }} + + regions: 1 + + datatypes: &datatypes ['q120_0', 'q130_0'] + + groups: + - name: anl + +transforms: + - transform: accept where + new name: ges::ges::count1_allev + starting field: ges::ges::count1 + where: + - ges::ges::level == 1 + for: + variable: [none] + + - transform: accept where + new name: anl::anl::count1_allev + starting field: anl::anl::count1 + where: + - anl::anl::level == 1 + for: + variable: [none] + + - transform: accept where + new name: ges::ges::count_vqc1_allev + starting field: ges::ges::count_vqc1 + where: + - ges::ges::level == 1 + for: + variable: [none] + + - transform: accept where + new name: anl::anl::count_vqc1_allev + starting field: anl::anl::count_vqc1 + where: + - anl::anl::level == 1 + for: + variable: [none] + + - transform: accept where + new name: ges::ges::count2_allev + starting field: ges::ges::count2 + where: + - ges::ges::level == 1 + for: + variable: [none] + + - transform: accept where + new name: anl::anl::count2_allev + starting field: anl::anl::count2 + where: + - anl::anl::level == 1 + for: + variable: [none] + + - transform: accept where + new name: ges::ges::count3_allev + starting field: ges::ges::count3 + where: + - ges::ges::level == 1 + for: + variable: [none] + + - transform: accept where + new name: anl::anl::count3_allev + starting field: anl::anl::count3 + where: + - anl::anl::level == 1 + for: + variable: [none] + +graphics: + + plotting_backend: Emcpy + figure_list: + + # 4 plot ConMon time series + # ------------------------- + - batch figure: + datatypes: *datatypes + variables: ['count1_allev', 'count_vqc1_allev', 'count2_allev'] + + figure: + layout: [4,1] + figure size: [20,18] + tight layout: + title: "Valid: {{ PDATE | to_YMDH }} \n ${datatype}, Global, All Levels" + output name: line_plots/conmon/${datatype}.time.png + plot logo: + which: 'noaa/nws' + loc: 'upper left' + subplot_orientation: 'last' + + plots: + - add_xlabel: 'Assimilated' + add_ylabel: 'Count' + add_grid: + axis: 'both' + linestyle: 'dotted' + linewidth: 0.5 + color: 'black' + add_legend: + loc: 'upper right' + layers: + - type: LinePlot + x: + variable: ges::ges::cycle + y: + variable: ges::ges::count1_allev + color: 'black' + datatype: ${datatype} + label: 'initial outloop' + - type: LinePlot + x: + variable: anl::anl::cycle + y: + variable: anl::anl::count1_allev + color: 'blue' + datatype: ${datatype} + label: 'final outloop' + + - add_xlabel: 'Rejected by VQC' + add_ylabel: 'Count' + add_grid: + axis: 'both' + linestyle: 'dotted' + linewidth: 0.5 + color: 'black' + add_legend: + loc: 'upper right' + layers: + - type: LinePlot + x: + variable: ges::ges::cycle + y: + variable: ges::ges::count_vqc1_allev + color: 'black' + datatype: ${datatype} + label: 'initial outloop' + - type: LinePlot + x: + variable: anl::anl::cycle + y: + variable: anl::anl::count_vqc1_allev + color: 'blue' + datatype: ${datatype} + label: 'final outloop' + + - add_xlabel: 'Rejected by GC' + add_ylabel: 'Count' + add_grid: + axis: 'both' + linestyle: 'dotted' + linewidth: 0.5 + color: 'black' + add_legend: + loc: 'upper right' + layers: + - type: LinePlot + x: + variable: ges::ges::cycle + y: + variable: ges::ges::count2_allev + color: 'black' + datatype: ${datatype} + label: 'initial outloop' + - type: LinePlot + x: + variable: anl::anl::cycle + y: + variable: anl::anl::count2_allev + color: 'blue' + datatype: ${datatype} + label: 'final outloop' + + - add_xlabel: 'Monitored' + add_ylabel: 'Count' + add_grid: + axis: 'both' + linestyle: 'dotted' + linewidth: 0.5 + color: 'black' + add_legend: + loc: 'upper right' + layers: + - type: LinePlot + x: + variable: ges::ges::cycle + y: + variable: ges::ges::count3_allev + color: 'black' + datatype: ${datatype} + label: 'initial outloop' + - type: LinePlot + x: + variable: anl::anl::cycle + y: + variable: anl::anl::count3_allev + color: 'blue' + datatype: ${datatype} + label: 'final outloop' diff --git a/parm/gfs/gfs_plots.yaml b/parm/gfs/gfs_plots.yaml index 6dceccf..336367f 100644 --- a/parm/gfs/gfs_plots.yaml +++ b/parm/gfs/gfs_plots.yaml @@ -64,3 +64,9 @@ minimization: - plot: min gnorm one cycle run: gdas times: 28 + +observations: + - obstype: q + plot_list: + - plot: con time + times: 121 diff --git a/ush/plotObsMon.py b/ush/plotObsMon.py index 7a8bca9..94506ab 100755 --- a/ush/plotObsMon.py +++ b/ush/plotObsMon.py @@ -48,13 +48,14 @@ def camelCase(s): # -------------------------------------------------------------------------------------------- -def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_location, net=None): +def loadConfig(satname, instrument, obstype, plot, cycle_tm, cycle_interval, data_location, net=None): """ Load configuration dictionary. Parameters: satname (str): Name of satellite instrument (str): Name of instrument + obstype (str): Type of observation plot (str): plot template cycle_tm (datetime): Cycle time of plot cycle_interval (int): number of hours between cycles @@ -66,6 +67,7 @@ def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_locatio config = { 'SAT': satname, 'SENSOR': instrument, + 'OBSTYPE': obstype, 'LEVELS': plot.get('levels'), 'CHANNELS': plot.get('channels'), 'NET': net, @@ -110,6 +112,8 @@ def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_locatio Read and parse input yaml file, load configuration and apply to requested yaml template(s), and plot results. + + Example calling sequence: >python plotObsMon.py -i ../parm/gfs/gfs_plots.yaml -p 2023122000 """ logger = Logger('plotObsMon') @@ -130,17 +134,20 @@ def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_locatio cycle_interval = mon_dict.get('cycle_interval') data_location = mon_dict.get('data') + logger.info(f" mon_dict.keys(): {mon_dict.keys()}") # if specified, generate template YAMLS and figures for satellite based obs + # for satellites, minimization, and observations if 'satellites' in mon_dict.keys(): for sat in mon_dict.get('satellites'): satname = sat.get('name') + obstype = None for inst in sat.get('instruments'): instrument = inst.get('name') for plot in inst.get('plot_list'): - config = loadConfig(satname, instrument, plot, cycle_tm, + config = loadConfig(satname, instrument, obstype, plot, cycle_tm, cycle_interval, data_location) plot_template = f"{config['PLOT_TEMPLATE']}.yaml" plot_yaml = f"{config['SENSOR']}_{config['SAT']}_{plot_template}" @@ -151,15 +158,15 @@ def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_locatio eva(plot_yaml) os.remove(plot_yaml) - # if specified, generate template YAMLs and figures for minimization if 'minimization' in mon_dict.keys(): satname = None instrument = None + obstype = None for min in mon_dict.get('minimization'): net = min.get('net') for plot in min.get('plot_list'): - config = loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, + config = loadConfig(satname, instrument, obstype, plot, cycle_tm, cycle_interval, data_location, net) plot_template = f"{config['PLOT_TEMPLATE']}.yaml" @@ -169,3 +176,22 @@ def loadConfig(satname, instrument, plot, cycle_tm, cycle_interval, data_locatio genYaml(plot_template, plot_yaml, config) eva(plot_yaml) os.remove(plot_yaml) + + if 'observations' in mon_dict.keys(): + satname = None + instrument = None + obstype = None + for obs in mon_dict.get('observations'): + obstype = obs.get('obstype') + + for plot in obs.get('plot_list'): + config = loadConfig(satname, instrument, obstype, plot, cycle_tm, cycle_interval, + data_location) + + plot_template = f"{config['PLOT_TEMPLATE']}.yaml" + plot_yaml = f"{config['OBSTYPE']}_{plot_template}" + plot_template = os.path.join('../parm/gfs/', plot_template) + + genYaml(plot_template, plot_yaml, config) + eva(plot_yaml) + os.remove(plot_yaml)