From 889f1b214665c68efd29f3f475e0bf280afaa1cb Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Wed, 22 May 2024 11:30:10 -0600 Subject: [PATCH] Feature #2395 TOTAL_DIR (#2892) * Per #2395, remove the n_dir_undef and n_dira_undef variables that are superceded by the new dcount and dacount VL1L2Info members to keep track of the number of valid wind direction vectors. * Per #2395, add TOTAL_DIR columns to the VL1L2, VAL1L2, and VCNT line types and update the header column tables. * Per #2395, update the User's Guide to list the new TOTAL_DIR columns in the VL1L2, VAL1L2, and VCNT line types. * Per #2395, update stat_analysis to parse the new TOTAL_DIR columns and use the values to aggregate results when needed. * Per #2395, for SonarQube change 'const char *' to 'const char * const' to satisfy the finding that 'Global variables should be const.' Should probably switch from 'char char *' to strings eventually. But for now, I'm just making up for some SonarQube technical debt. * Per #2395, fix typo in placement of the DIR_ME column name in the met_header_columns_V12.0.txt file * Per #2395, add 2 new Stat-Analysis jobs to demonstrate the processing of VL1L2 lines. * Per #2395, update logic of is_vector_dir_stat(). Instead of just checking 'DIR_', check 'DIR_ME', 'DIR_MAE', and 'DIR_MSE' to avoid an false positive match for the 'DIR_ERR' column which is computed from the vector partial sums rather than the individual direction differences. --- data/table_files/met_header_columns_V12.0.txt | 6 +- docs/Users_Guide/point-stat.rst | 25 ++++-- .../config/STATAnalysisConfig_point_stat | 6 +- internal/test_unit/hdr/met_12_0.hdr | 6 +- .../test_unit/xml/unit_stat_analysis_ps.xml | 2 + src/basic/vx_util/stat_column_defs.h | 87 ++++++++++--------- src/libcode/vx_stat_out/stat_columns.cc | 31 ++++--- src/libcode/vx_stat_out/stat_columns.h | 2 +- src/libcode/vx_statistics/met_stats.cc | 62 +++++-------- src/libcode/vx_statistics/met_stats.h | 10 +-- src/tools/core/ensemble_stat/ensemble_stat.h | 4 +- src/tools/core/grid_stat/grid_stat.h | 4 +- src/tools/core/point_stat/point_stat.h | 4 +- .../core/stat_analysis/aggr_stat_line.cc | 60 ++++++------- .../core/stat_analysis/parse_stat_line.cc | 2 + src/tools/tc_utils/tc_gen/tc_gen.h | 4 +- 16 files changed, 163 insertions(+), 152 deletions(-) diff --git a/data/table_files/met_header_columns_V12.0.txt b/data/table_files/met_header_columns_V12.0.txt index 299e6cb4d6..3d98f02206 100644 --- a/data/table_files/met_header_columns_V12.0.txt +++ b/data/table_files/met_header_columns_V12.0.txt @@ -27,9 +27,9 @@ V12.0 : STAT : RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID V12.0 : STAT : SAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FABAR OABAR FOABAR FFABAR OOABAR MAE V12.0 : STAT : SL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR OBAR FOBAR FFBAR OOBAR MAE V12.0 : STAT : SSVAR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_BIN BIN_i BIN_N VAR_MIN VAR_MAX VAR_MEAN FBAR OBAR FOBAR FFBAR OOBAR FBAR_NCL FBAR_NCU FSTDEV FSTDEV_NCL FSTDEV_NCU OBAR_NCL OBAR_NCU OSTDEV OSTDEV_NCL OSTDEV_NCU PR_CORR PR_CORR_NCL PR_CORR_NCU ME ME_NCL ME_NCU ESTDEV ESTDEV_NCL ESTDEV_NCU MBIAS MSE BCMSE RMSE -V12.0 : STAT : VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR FA_SPEED_BAR OA_SPEED_BAR DIRA_ME DIRA_MAE DIRA_MSE -V12.0 : STAT : VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR DIR_ME DIR_MAE DIR_MSE -V12.0 : STAT : VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU +V12.0 : STAT : VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR FA_SPEED_BAR OA_SPEED_BAR TOTAL_DIR DIRA_ME DIRA_MAE DIRA_MSE +V12.0 : STAT : VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR TOTAL_DIR DIR_ME DIR_MAE DIR_MSE +V12.0 : STAT : VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU TOTAL_DIR DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU V12.0 : STAT : GENMPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX STORM_ID PROB_LEAD PROB_VAL AGEN_INIT AGEN_FHR AGEN_LAT AGEN_LON AGEN_DLAND BGEN_LAT BGEN_LON BGEN_DLAND GEN_DIST GEN_TDIFF INIT_TDIFF DEV_CAT OPS_CAT V12.0 : STAT : SSIDX : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE FCST_MODEL REF_MODEL N_INIT N_TERM N_VLD SS_INDEX diff --git a/docs/Users_Guide/point-stat.rst b/docs/Users_Guide/point-stat.rst index 6c32537146..ec4e69178b 100644 --- a/docs/Users_Guide/point-stat.rst +++ b/docs/Users_Guide/point-stat.rst @@ -1289,12 +1289,15 @@ The first set of header columns are common to all of the output files generated - O_SPEED_BAR - Mean observed wind speed * - 35 + - TOTAL_DIR + - Total number of matched pairs for which both the forecast and observation wind directions are well-defined (i.e. non-zero vectors) + * - 36 - DIR_ME - Mean wind direction difference, from -180 to 180 degrees - * - 36 + * - 37 - DIR_MAE - Mean absolute wind direction difference - * - 37 + * - 38 - DIR_MSE - Mean squared wind direction difference @@ -1344,12 +1347,15 @@ The first set of header columns are common to all of the output files generated - OA_SPEED_BAR - Mean observed wind speed anomaly * - 35 + - TOTAL_DIR + - Total number of matched triplets for which the forecast, observation, and climatological wind directions are well-defined (i.e. non-zero vectors) + * - 36 - DIRA_ME - Mean wind direction anomaly difference, from -180 to 180 degrees - * - 36 + * - 37 - DIRA_MAE - Mean absolute wind direction anomaly difference - * - 37 + * - 38 - DIRA_MSE - Mean squared wind direction anomaly difference @@ -1431,16 +1437,19 @@ The first set of header columns are common to all of the output files generated * - 85-87 - ANOM_CORR_UNCNTR, :raw-html:`
` ANOM_CORR_UNCNTR_BCL, :raw-html:`
` ANOM_CORR_UNCNTR_BCU - Uncentered vector Anomaly Correlation excluding mean error including bootstrap upper and lower confidence limits - * - 88-90 + * - 88 + - TOTAL_DIR + - Total number of matched pairs for which both the forecast and observation wind directions are well-defined (i.e. non-zero vectors) + * - 89-91 - DIR_ME, :raw-html:`
` DIR_ME_BCL, :raw-html:`
` DIR_ME_BCU - Mean direction difference, from -180 to 180 degrees, including bootstrap upper and lower confidence limits - * - 91-93 + * - 92-94 - DIR_MAE, :raw-html:`
` DIR_MAE_BCL, :raw-html:`
` DIR_MAE_BCU - Mean absolute direction difference including bootstrap upper and lower confidence limits - * - 94-96 + * - 95-97 - DIR_MSE, :raw-html:`
` DIR_MSE_BCL, :raw-html:`
` DIR_MSE_BCU - Mean squared direction difference including bootstrap upper and lower confidence limits - * - 97-99 + * - 98-100 - DIR_RMSE, :raw-html:`
` DIR_RMSE_BCL, :raw-html:`
` DIR_RMSE_BCU - Root mean squared direction difference including bootstrap upper and lower confidence limits diff --git a/internal/test_unit/config/STATAnalysisConfig_point_stat b/internal/test_unit/config/STATAnalysisConfig_point_stat index 4f751b32dc..db7ab415a6 100644 --- a/internal/test_unit/config/STATAnalysisConfig_point_stat +++ b/internal/test_unit/config/STATAnalysisConfig_point_stat @@ -103,7 +103,11 @@ jobs = [ -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_sid.stat", "-job filter -fcst_var TMP -fcst_lev Z2 \ -line_type MPR -column_thresh abs(fcst-obs) >5 \ - -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat" + -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat", + "-job aggregate -line_type VL1L2 -by FCST_LEV \ + -out_stat ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_vl1l2.stat", + "-job aggregate_stat -line_type VL1L2 -out_line_type VCNT -by FCST_LEV \ + -out_stat ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_stat_vl1l2_to_vcnt.stat" ]; //////////////////////////////////////////////////////////////////////////////// diff --git a/internal/test_unit/hdr/met_12_0.hdr b/internal/test_unit/hdr/met_12_0.hdr index a1113d5102..bf8575039a 100644 --- a/internal/test_unit/hdr/met_12_0.hdr +++ b/internal/test_unit/hdr/met_12_0.hdr @@ -27,9 +27,9 @@ RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_L SAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FABAR OABAR FOABAR FFABAR OOABAR MAE SL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR OBAR FOBAR FFBAR OOBAR MAE SSVAR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_BIN BIN_i BIN_N VAR_MIN VAR_MAX VAR_MEAN FBAR OBAR FOBAR FFBAR OOBAR FBAR_NCL FBAR_NCU FSTDEV FSTDEV_NCL FSTDEV_NCU OBAR_NCL OBAR_NCU OSTDEV OSTDEV_NCL OSTDEV_NCU PR_CORR PR_CORR_NCL PR_CORR_NCU ME ME_NCL ME_NCU ESTDEV ESTDEV_NCL ESTDEV_NCU MBIAS MSE BCMSE RMSE -VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR DIR_ME DIR_MAE DIR_MSE -VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR FA_SPEED_BAR OA_SPEED_BAR DIRA_ME DIRA_MAE DIRA_MSE -VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU +VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR TOTAL_DIR DIR_ME DIR_MAE DIR_MSE +VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR FA_SPEED_BAR OA_SPEED_BAR TOTAL_DIR DIRA_ME DIRA_MAE DIRA_MSE +VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU TOTAL_DIR DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU GENMPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX STORM_ID PROB_LEAD PROB_VAL AGEN_INIT AGEN_FHR AGEN_LAT AGEN_LON AGEN_DLAND BGEN_LAT BGEN_LON BGEN_DLAND GEN_DIST GEN_TDIFF INIT_TDIFF DEV_CAT OPS_CAT SSIDX : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE FCST_MODEL REF_MODEL N_INIT N_TERM N_VLD SS_INDEX MODE_SOA : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE N_VALID GRID_RES OBJECT_ID OBJECT_CAT CENTROID_X CENTROID_Y CENTROID_LAT CENTROID_LON AXIS_ANG LENGTH WIDTH AREA AREA_THRESH CURVATURE CURVATURE_X CURVATURE_Y COMPLEXITY INTENSITY_10 INTENSITY_25 INTENSITY_50 INTENSITY_75 INTENSITY_90 INTENSITY_50 INTENSITY_SUM diff --git a/internal/test_unit/xml/unit_stat_analysis_ps.xml b/internal/test_unit/xml/unit_stat_analysis_ps.xml index 9fd50dcb2a..1ea5e2e19a 100644 --- a/internal/test_unit/xml/unit_stat_analysis_ps.xml +++ b/internal/test_unit/xml/unit_stat_analysis_ps.xml @@ -38,6 +38,8 @@ &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_stat_mpr_to_wdir_dump.stat &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_filter_mpr_sid.stat &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat + &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_vl1l2.stat + &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_stat_vl1l2_to_vcnt.stat diff --git a/src/basic/vx_util/stat_column_defs.h b/src/basic/vx_util/stat_column_defs.h index 826d5101c9..9a92cf0970 100644 --- a/src/basic/vx_util/stat_column_defs.h +++ b/src/basic/vx_util/stat_column_defs.h @@ -13,7 +13,7 @@ //////////////////////////////////////////////////////////////////////// -static const char * hdr_columns [] = { +static const char * const hdr_columns [] = { "VERSION", "MODEL", "DESC", "FCST_LEAD", "FCST_VALID_BEG", "FCST_VALID_END", @@ -29,17 +29,17 @@ static const char * hdr_columns [] = { "LINE_TYPE" }; -static const char * fho_columns [] = { +static const char * const fho_columns [] = { "TOTAL", "F_RATE", "H_RATE", "O_RATE" }; -static const char * ctc_columns [] = { +static const char * const ctc_columns [] = { "TOTAL", "FY_OY", "FY_ON", "FN_OY", "FN_ON", "EC_VALUE" }; -static const char * cts_columns [] = { +static const char * const cts_columns [] = { "TOTAL", "BASER", "BASER_NCL", "BASER_NCU", "BASER_BCL", "BASER_BCU", "FMEAN", "FMEAN_NCL", "FMEAN_NCU", "FMEAN_BCL", "FMEAN_BCU", @@ -64,11 +64,11 @@ static const char * cts_columns [] = { "HSS_EC", "HSS_EC_BCL", "HSS_EC_BCU", "EC_VALUE" }; -static const char * mctc_columns [] = { +static const char * const mctc_columns [] = { "TOTAL", "N_CAT", "Fi_Oj", "EC_VALUE" }; -static const char * mcts_columns [] = { +static const char * const mcts_columns [] = { "TOTAL", "N_CAT", "ACC", "ACC_NCL", "ACC_NCU", "ACC_BCL", "ACC_BCU", "HK", "HK_BCL", "HK_BCU", @@ -77,7 +77,7 @@ static const char * mcts_columns [] = { "HSS_EC", "HSS_EC_BCL", "HSS_EC_BCU", "EC_VALUE" }; -static const char * cnt_columns [] = { +static const char * const cnt_columns [] = { "TOTAL", "FBAR", "FBAR_NCL", "FBAR_NCU", "FBAR_BCL", "FBAR_BCU", "FSTDEV", "FSTDEV_NCL", "FSTDEV_NCU", "FSTDEV_BCL", "FSTDEV_BCU", @@ -108,36 +108,36 @@ static const char * cnt_columns [] = { "SI", "SI_BCL", "SI_BCU" }; -static const char * sl1l2_columns [] = { +static const char * const sl1l2_columns [] = { "TOTAL", "FBAR", "OBAR", "FOBAR", "FFBAR", "OOBAR", "MAE" }; -static const char * sal1l2_columns [] = { +static const char * const sal1l2_columns [] = { "TOTAL", "FABAR", "OABAR", "FOABAR", "FFABAR", "OOABAR", "MAE" }; -static const char * vl1l2_columns [] = { +static const char * const vl1l2_columns [] = { "TOTAL", "UFBAR", "VFBAR", "UOBAR", "VOBAR", "UVFOBAR", "UVFFBAR", "UVOOBAR", "F_SPEED_BAR", - "O_SPEED_BAR", "DIR_ME", "DIR_MAE", - "DIR_MSE" + "O_SPEED_BAR", "TOTAL_DIR", "DIR_ME", + "DIR_MAE", "DIR_MSE" }; -static const char * val1l2_columns [] = { +static const char * const val1l2_columns [] = { "TOTAL", "UFABAR", "VFABAR", "UOABAR", "VOABAR", "UVFOABAR", "UVFFABAR", "UVOOABAR", "FA_SPEED_BAR", - "OA_SPEED_BAR", "DIRA_ME", "DIRA_MAE", - "DIRA_MSE" + "OA_SPEED_BAR", "TOTAL_DIR", "DIRA_ME", + "DIRA_MAE", "DIRA_MSE" }; -static const char * vcnt_columns [] = { +static const char * const vcnt_columns [] = { "TOTAL", "FBAR", "FBAR_BCL", "FBAR_BCU", "OBAR", "OBAR_BCL", "OBAR_BCU", @@ -160,18 +160,19 @@ static const char * vcnt_columns [] = { "ANOM_CORR", "ANOM_CORR_NCL", "ANOM_CORR_NCU", "ANOM_CORR_BCL", "ANOM_CORR_BCU", "ANOM_CORR_UNCNTR", "ANOM_CORR_UNCNTR_BCL", "ANOM_CORR_UNCNTR_BCU", + "TOTAL_DIR", "DIR_ME", "DIR_ME_BCL", "DIR_ME_BCU", "DIR_MAE", "DIR_MAE_BCL", "DIR_MAE_BCU", "DIR_MSE", "DIR_MSE_BCL", "DIR_MSE_BCU", "DIR_RMSE", "DIR_RMSE_BCL", "DIR_RMSE_BCU" }; -static const char * pct_columns [] = { +static const char * const pct_columns [] = { "TOTAL", "N_THRESH", "THRESH_", "OY_", "ON_" }; -static const char * pstd_columns [] = { +static const char * const pstd_columns [] = { "TOTAL", "N_THRESH", "BASER", "BASER_NCL", "BASER_NCU", "RELIABILITY", "RESOLUTION", "UNCERTAINTY", "ROC_AUC", @@ -180,23 +181,23 @@ static const char * pstd_columns [] = { "BSS", "BSS_SMPL", "THRESH_", }; -static const char * pjc_columns [] = { +static const char * const pjc_columns [] = { "TOTAL", "N_THRESH", "THRESH_", "OY_TP_", "ON_TP_", "CALIBRATION_", "REFINEMENT_", "LIKELIHOOD_", "BASER_" }; -static const char * prc_columns [] = { +static const char * const prc_columns [] = { "TOTAL", "N_THRESH", "THRESH_", "PODY_", "POFD_" }; -static const char * eclv_columns [] = { +static const char * const eclv_columns [] = { "TOTAL", "BASER", "VALUE_BASER", "N_PNT", "CL_", "VALUE_" }; -static const char * mpr_columns [] = { +static const char * const mpr_columns [] = { "TOTAL", "INDEX", "OBS_SID", "OBS_LAT", "OBS_LON", "OBS_LVL", "OBS_ELV", "FCST", "OBS", @@ -204,12 +205,12 @@ static const char * mpr_columns [] = { "CLIMO_CDF" }; -static const char * nbrctc_columns [] = { +static const char * const nbrctc_columns [] = { "TOTAL", "FY_OY", "FY_ON", "FN_OY", "FN_ON" }; -static const char * nbrcts_columns [] = { +static const char * const nbrcts_columns [] = { "TOTAL", "BASER", "BASER_NCL", "BASER_NCU", "BASER_BCL", "BASER_BCU", "FMEAN", "FMEAN_NCL", "FMEAN_NCU", "FMEAN_BCL", "FMEAN_BCU", @@ -233,7 +234,7 @@ static const char * nbrcts_columns [] = { "BAGSS", "BAGSS_BCL", "BAGSS_BCU" }; -static const char * nbrcnt_columns [] = { +static const char * const nbrcnt_columns [] = { "TOTAL", "FBS", "FBS_BCL", "FBS_BCU", "FSS", "FSS_BCL", "FSS_BCU", @@ -243,14 +244,14 @@ static const char * nbrcnt_columns [] = { "O_RATE", "O_RATE_BCL", "O_RATE_BCU" }; -static const char * grad_columns [] = { +static const char * const grad_columns [] = { "TOTAL", "FGBAR", "OGBAR", "MGBAR", "EGBAR", "S1", "S1_OG", "FGOG_RATIO", "DX", "DY" }; -static const char * dmap_columns [] = { +static const char * const dmap_columns [] = { "TOTAL", "FY", "OY", "FBIAS", "BADDELEY", "HAUSDORFF", "MED_FO", "MED_OF", "MED_MIN", "MED_MAX", "MED_MEAN", @@ -259,7 +260,7 @@ static const char * dmap_columns [] = { "G", "GBETA", "BETA_VALUE" }; -static const char * isc_columns [] = { +static const char * const isc_columns [] = { "TOTAL", "TILE_DIM", "TILE_XLL", "TILE_YLL", "NSCALE", "ISCALE", "MSE", @@ -267,7 +268,7 @@ static const char * isc_columns [] = { "BASER", "FBIAS" }; -static const char * ecnt_columns [] = { +static const char * const ecnt_columns [] = { "TOTAL", "N_ENS", "CRPS", "CRPSS", "IGN", "ME", "RMSE", "SPREAD", "ME_OERR", @@ -279,22 +280,22 @@ static const char * ecnt_columns [] = { "ME_LT_OBS", "IGN_CONV_OERR", "IGN_CORR_OERR" }; -static const char * rps_columns [] = { +static const char * const rps_columns [] = { "TOTAL", "N_PROB", "RPS_REL", "RPS_RES", "RPS_UNC", "RPS", "RPSS", "RPSS_SMPL", "RPS_COMP" }; -static const char * rhist_columns [] = { +static const char * const rhist_columns [] = { "TOTAL", "N_RANK", "RANK_" }; -static const char * phist_columns [] = { +static const char * const phist_columns [] = { "TOTAL", "BIN_SIZE", "N_BIN", "BIN_" }; -static const char * orank_columns [] = { +static const char * const orank_columns [] = { "TOTAL", "INDEX", "OBS_SID", "OBS_LAT", "OBS_LON", "OBS_LVL", "OBS_ELV", "OBS", "PIT", @@ -304,7 +305,7 @@ static const char * orank_columns [] = { "SPREAD_OERR", "SPREAD_PLUS_OERR", "CLIMO_STDEV" }; -static const char * ssvar_columns [] = { +static const char * const ssvar_columns [] = { "TOTAL", "N_BIN", "BIN_i", "BIN_N", "VAR_MIN", "VAR_MAX", "VAR_MEAN", "FBAR", "OBAR", @@ -320,16 +321,16 @@ static const char * ssvar_columns [] = { "RMSE" }; -static const char * relp_columns [] = { +static const char * const relp_columns [] = { "TOTAL", "N_ENS", "RELP_" }; -static const char * ssidx_columns [] = { +static const char * const ssidx_columns [] = { "FCST_MODEL", "REF_MODEL", "N_INIT", "N_TERM", "N_VLD", "SS_INDEX" }; -static const char * genmpr_columns [] = { +static const char * const genmpr_columns [] = { "TOTAL", "INDEX", "STORM_ID", "PROB_LEAD", "PROB_VAL", "AGEN_INIT", "AGEN_FHR", @@ -339,7 +340,7 @@ static const char * genmpr_columns [] = { "DEV_CAT", "OPS_CAT" }; -static const char * job_summary_columns [] = { +static const char * const job_summary_columns [] = { "TOTAL", "MEAN", "MEAN_NCL", "MEAN_NCU", "MEAN_BCL", "MEAN_BCU", "STDEV", "STDEV_BCL", "STDEV_BCU", @@ -349,12 +350,12 @@ static const char * job_summary_columns [] = { "WMO_TYPE", "WMO_MEAN", "WMO_WEIGHTED_MEAN" }; -static const char * job_wdir_columns [] = { +static const char * const job_wdir_columns [] = { "TOTAL", "FBAR", "OBAR", "ME", "MAE" }; -static const char * job_ramp_columns [] = { +static const char * const job_ramp_columns [] = { "TYPE", "FCOLUMN", "OCOLUMN", "FTIME", "OTIME", @@ -363,7 +364,7 @@ static const char * job_ramp_columns [] = { "WINDOW_BEG", "WINDOW_END" }; -static const char * job_ramp_mpr_columns [] = { +static const char * const job_ramp_mpr_columns [] = { "TOTAL", "INDEX", "INIT", "LEAD", "VALID", "FPRV", "FCUR", "FDLT", "FRAMP", @@ -371,7 +372,7 @@ static const char * job_ramp_mpr_columns [] = { "CATEGORY" }; -static const char * seeps_mpr_columns [] = { +static const char * const seeps_mpr_columns [] = { "OBS_SID", "OBS_LAT", "OBS_LON", "FCST", "OBS", "OBS_QC", "FCST_CAT", "OBS_CAT", "P1", @@ -379,7 +380,7 @@ static const char * seeps_mpr_columns [] = { "SEEPS" }; -static const char * seeps_columns [] = { +static const char * const seeps_columns [] = { "TOTAL", "S12", "S13", "S21", "S23", "S31", "S32", "PF1", "PF2", diff --git a/src/libcode/vx_stat_out/stat_columns.cc b/src/libcode/vx_stat_out/stat_columns.cc index 07c4df90d6..b2ef7bce7a 100644 --- a/src/libcode/vx_stat_out/stat_columns.cc +++ b/src/libcode/vx_stat_out/stat_columns.cc @@ -99,7 +99,7 @@ ConcatString append_climo_bin(const ConcatString &mask_name, //////////////////////////////////////////////////////////////////////// -void write_header_row(const char **cols, int n_cols, int hdr_flag, +void write_header_row(const char * const * cols, int n_cols, int hdr_flag, AsciiTable &at, int r, int c) { int i; @@ -2975,8 +2975,8 @@ void write_vl1l2_cols(const VL1L2Info &vl1l2_info, // TOTAL, UFBAR, VFBAR, // UOBAR, VOBAR, UVFOBAR, // UVFFBAR, UVOOBAR F_SPEED_BAR, - // O_SPEED_BAR, DIR_ME, DIR_MAE, - // DIR_MSE + // O_SPEED_BAR, TOTAL_DIR, DIR_ME, + // DIR_MAE, DIR_MSE // at.set_entry(r, c+0, // Total Count @@ -3009,13 +3009,16 @@ void write_vl1l2_cols(const VL1L2Info &vl1l2_info, at.set_entry(r, c+9, // O_SPEED_BAR vl1l2_info.o_speed_bar); - at.set_entry(r, c+10, // DIR_ME + at.set_entry(r, c+10, // TOTAL_DIR + vl1l2_info.dcount); + + at.set_entry(r, c+11, // DIR_ME vl1l2_info.dir_bar); - at.set_entry(r, c+11, // DIR_MAE + at.set_entry(r, c+12, // DIR_MAE vl1l2_info.absdir_bar); - at.set_entry(r, c+12, // DIR_MSE + at.set_entry(r, c+13, // DIR_MSE vl1l2_info.dir2_bar); return; @@ -3032,8 +3035,8 @@ void write_val1l2_cols(const VL1L2Info &vl1l2_info, // TOTAL, UFABAR, VFABAR, // UOABAR, VOABAR, UVFOABAR, // UVFFABAR, UVOOABAR, FA_SPEED_BAR, - // OA_SPEED_BAR, DIRA_ME, DIRA_MAE, - // DIRA_MSE + // OA_SPEED_BAR, TOTAL_DIR, DIRA_ME, + // DIRA_MAE, DIRA_MSE // at.set_entry(r, c+0, // Total Anomaly Count @@ -3066,13 +3069,16 @@ void write_val1l2_cols(const VL1L2Info &vl1l2_info, at.set_entry(r, c+9, // OA_SPEED_BAR vl1l2_info.oa_speed_bar); - at.set_entry(r, c+10, // DIRA_ME + at.set_entry(r, c+10, // TOTAL_DIR + vl1l2_info.dacount); + + at.set_entry(r, c+11, // DIRA_ME vl1l2_info.dira_bar); - at.set_entry(r, c+11, // DIRA_MAE + at.set_entry(r, c+12, // DIRA_MAE vl1l2_info.absdira_bar); - at.set_entry(r, c+12, // DIRA_MSE + at.set_entry(r, c+13, // DIRA_MSE vl1l2_info.dira2_bar); return; @@ -3108,6 +3114,7 @@ void write_vcnt_cols(const VL1L2Info &vcnt_info, int i, // ANOM_CORR, ANOM_CORR_NCL, ANOM_CORR_NCU, // ANOM_CORR_BCL, ANOM_CORR_BCU // ANOM_CORR_UNCNTR, ANOM_CORR_UNCNTR_BCL, ANOM_CORR_UNCNTR_BCU, + // TOTAL_DIR, // DIR_ME, DIR_ME_BCL, DIR_ME_BCU, // DIR_MAE, DIR_MAE_BCL, DIR_MAE_BCU, // DIR_MSE, DIR_MSE_BCL, DIR_MSE_BCU, @@ -3201,6 +3208,8 @@ void write_vcnt_cols(const VL1L2Info &vcnt_info, int i, at.set_entry(r, c++, (string)na_str); // ANOM_CORR_UNCNTR_BCL at.set_entry(r, c++, (string)na_str); // ANOM_CORR_UNCNTR_BCU + at.set_entry(r, c++, vcnt_info.dcount); // TOTAL_DIR + at.set_entry(r, c++, vcnt_info.DIR_ME.v); // DIR_ME at.set_entry(r, c++, (string)na_str); // DIR_ME_BCL at.set_entry(r, c++, (string)na_str); // DIR_ME_BCU diff --git a/src/libcode/vx_stat_out/stat_columns.h b/src/libcode/vx_stat_out/stat_columns.h index 923425dabc..8af99ad730 100644 --- a/src/libcode/vx_stat_out/stat_columns.h +++ b/src/libcode/vx_stat_out/stat_columns.h @@ -35,7 +35,7 @@ extern void close_txt_file(std::ofstream *&, const char *); extern ConcatString append_climo_bin(const ConcatString &, int, int); // Write out the header row for fixed length line types -extern void write_header_row(const char **, int, int, AsciiTable &, int, int); +extern void write_header_row(const char * const *, int, int, AsciiTable &, int, int); // Write out the header row for variable length line types extern void write_mctc_header_row (int, int, AsciiTable &, int, int); diff --git a/src/libcode/vx_statistics/met_stats.cc b/src/libcode/vx_statistics/met_stats.cc index 587c5552a7..7f2af8b534 100644 --- a/src/libcode/vx_statistics/met_stats.cc +++ b/src/libcode/vx_statistics/met_stats.cc @@ -1363,6 +1363,7 @@ VL1L2Info & VL1L2Info::operator+=(const VL1L2Info &c) { for(int i=0; i 0) { v_info.uf_bar = (uf_bar*vcount + c.uf_bar*c.vcount) /v_info.vcount; @@ -1374,12 +1375,15 @@ VL1L2Info & VL1L2Info::operator+=(const VL1L2Info &c) { v_info.uvoo_bar = (uvoo_bar*vcount + c.uvoo_bar*c.vcount) /v_info.vcount; v_info.f_speed_bar = (f_speed_bar*vcount + c.f_speed_bar*c.vcount)/v_info.vcount; v_info.o_speed_bar = (o_speed_bar*vcount + c.o_speed_bar*c.vcount)/v_info.vcount; - v_info.dir_bar = (dir_bar*vcount + c.dir_bar*c.vcount) /v_info.vcount; - v_info.absdir_bar = (absdir_bar*vcount + c.absdir_bar*c.vcount) /v_info.vcount; - v_info.dir2_bar = (dir2_bar*vcount + c.dir2_bar*c.vcount) /v_info.vcount; + } + if(v_info.dcount > 0) { + v_info.dir_bar = (dir_bar*dcount + c.dir_bar*c.dcount) /v_info.dcount; + v_info.absdir_bar = (absdir_bar*dcount + c.absdir_bar*c.dcount) /v_info.dcount; + v_info.dir2_bar = (dir2_bar*dcount + c.dir2_bar*c.dcount) /v_info.dcount; } v_info.vacount = vacount + c.vacount; + v_info.dacount = dacount + c.dacount; if(v_info.vacount > 0) { v_info.ufa_bar = (ufa_bar*vacount + c.ufa_bar*c.vacount) /v_info.vacount; @@ -1391,9 +1395,11 @@ VL1L2Info & VL1L2Info::operator+=(const VL1L2Info &c) { v_info.uvooa_bar = (uvooa_bar*vacount + c.uvooa_bar*c.vacount) /v_info.vacount; v_info.fa_speed_bar = (fa_speed_bar*vacount + c.fa_speed_bar*c.vacount)/v_info.vacount; v_info.oa_speed_bar = (oa_speed_bar*vacount + c.oa_speed_bar*c.vacount)/v_info.vacount; - v_info.dira_bar = (dira_bar*vacount + c.dira_bar*c.vacount) /v_info.vacount; - v_info.absdira_bar = (absdira_bar*vacount + c.absdira_bar*c.vacount) /v_info.vacount; - v_info.dira2_bar = (dira2_bar*vacount + c.dira2_bar*c.vacount) /v_info.vacount; + } + if(v_info.dacount > 0) { + v_info.dira_bar = (dira_bar*dacount + c.dira_bar*c.dacount) /v_info.dacount; + v_info.absdira_bar = (absdira_bar*dacount + c.absdira_bar*c.dacount) /v_info.dacount; + v_info.dira2_bar = (dira2_bar*dacount + c.dira2_bar*c.dacount) /v_info.dacount; } v_info.compute_stats(); @@ -1436,6 +1442,7 @@ void VL1L2Info::zero_out() { dir2_bar = 0.0; vcount = 0; + dcount = 0; // // VAL1L2 Quantities @@ -1455,6 +1462,7 @@ void VL1L2Info::zero_out() { dira2_bar = 0.0; vacount = 0; + dacount = 0; return; } @@ -1464,8 +1472,6 @@ void VL1L2Info::zero_out() { void VL1L2Info::clear() { n = 0; - n_dir_undef = 0; - n_dira_undef = 0; n_alpha = 0; if(alpha) { delete [] alpha; alpha = (double *) nullptr; } @@ -1515,8 +1521,6 @@ void VL1L2Info::assign(const VL1L2Info &c) { logic = c.logic; n = c.n; - n_dir_undef = c.n_dir_undef; - n_dira_undef = c.n_dira_undef; allocate_n_alpha(c.n_alpha); for(i=0; i 0) { - mlog << Warning << "\nVL1L2Info::compute_stats() -> " - << "Skipping " << n_dir_undef << " of " << vcount - << " vector pairs for which the direction difference is undefined.\n" - << "Set the \"wind_thresh\" and \"wind_logic\" configuration options " - << "to exclude zero vectors.\n\n"; - } - DIR_ME.v = dir_bar; DIR_MAE.v = absdir_bar; DIR_MSE.v = dir2_bar; @@ -1912,15 +1907,6 @@ void VL1L2Info::compute_stats() { } ANOM_CORR_UNCNTR.v = compute_anom_corr_uncntr(uvffa_bar, uvooa_bar, uvfoa_bar); - - // Print undefined wind direction warning message - if(n_dira_undef > 0) { - mlog << Warning << "\nVL1L2Info::compute_stats() -> " - << "Skipping " << n_dira_undef << " of " << vacount - << " anomaly vector pairs for which the direction difference is undefined.\n" - << "Set the \"wind_thresh\" and \"wind_logic\" configuration options " - << "to exclude zero vectors.\n\n"; - } } // Compute parametric confidence intervals diff --git a/src/libcode/vx_statistics/met_stats.h b/src/libcode/vx_statistics/met_stats.h index 1d5def71a7..36a9e2f01d 100644 --- a/src/libcode/vx_statistics/met_stats.h +++ b/src/libcode/vx_statistics/met_stats.h @@ -277,10 +277,6 @@ class VL1L2Info { // Number of points int n; - // Number of points for which the wind direction difference is undefined - int n_dir_undef; - int n_dira_undef; - // VL1L2 Quantities double uf_bar; @@ -336,7 +332,8 @@ class VL1L2Info { CIInfo DIR_MSE; CIInfo DIR_RMSE; - int vcount; + int vcount; // Vector count + int dcount; // Direction count // VAL1L2 Quantities double ufa_bar; @@ -355,7 +352,8 @@ class VL1L2Info { double absdira_bar; // Average anomalous absolute direction difference double dira2_bar; // Average anomalous squared direction difference - int vacount; + int vacount; // Vector anomaly count + int dacount; // Direction anomaly count // Compute sums void set(const PairDataPoint &, const PairDataPoint &); diff --git a/src/tools/core/ensemble_stat/ensemble_stat.h b/src/tools/core/ensemble_stat/ensemble_stat.h index 28d26a5585..3e14ebbaa1 100644 --- a/src/tools/core/ensemble_stat/ensemble_stat.h +++ b/src/tools/core/ensemble_stat/ensemble_stat.h @@ -49,14 +49,14 @@ static const char * default_config_filename = "MET_BASE/config/EnsembleStatConfig_default"; // Text file abbreviations -static const char *txt_file_abbr[n_txt] = { +static const char * const txt_file_abbr[n_txt] = { "ecnt", "rps", "rhist", "phist", "orank", "ssvar", "relp", "pct", "pstd", "pjc", "prc", "eclv" }; // Header columns -static const char **txt_columns[n_txt] = { +static const char * const * txt_columns[n_txt] = { ecnt_columns, rps_columns, rhist_columns, phist_columns, orank_columns, ssvar_columns, relp_columns, pct_columns, pstd_columns, diff --git a/src/tools/core/grid_stat/grid_stat.h b/src/tools/core/grid_stat/grid_stat.h index ccd85c82ac..9f170b5a9f 100644 --- a/src/tools/core/grid_stat/grid_stat.h +++ b/src/tools/core/grid_stat/grid_stat.h @@ -66,7 +66,7 @@ static const char * default_config_filename = static const char * default_out_dir = "."; // Header columns -static const char **txt_columns[n_txt] = { +static const char * const * txt_columns[n_txt] = { fho_columns, ctc_columns, cts_columns, mctc_columns, mcts_columns, cnt_columns, sl1l2_columns, sal1l2_columns, vl1l2_columns, @@ -90,7 +90,7 @@ static const int n_txt_columns[n_txt] = { }; // Text file abbreviations -static const char *txt_file_abbr[n_txt] = { +static const char * const txt_file_abbr[n_txt] = { "fho", "ctc", "cts", "mctc", "mcts", "cnt", "sl1l2", "sal1l2", "vl1l2", diff --git a/src/tools/core/point_stat/point_stat.h b/src/tools/core/point_stat/point_stat.h index 0804650b0a..abe34d25ac 100644 --- a/src/tools/core/point_stat/point_stat.h +++ b/src/tools/core/point_stat/point_stat.h @@ -61,7 +61,7 @@ static const char * default_config_filename = "MET_BASE/config/PointStatConfig_default"; // Header columns -static const char **txt_columns[n_txt] = { +static const char * const * txt_columns[n_txt] = { fho_columns, ctc_columns, cts_columns, mctc_columns, mcts_columns, cnt_columns, sl1l2_columns, sal1l2_columns, vl1l2_columns, @@ -85,7 +85,7 @@ static const int n_txt_columns[n_txt] = { }; // Text file abbreviations -static const char *txt_file_abbr[n_txt] = { +static const char * const txt_file_abbr[n_txt] = { "fho", "ctc", "cts", "mctc", "mcts", "cnt", "sl1l2", "sal1l2", "vl1l2", diff --git a/src/tools/core/stat_analysis/aggr_stat_line.cc b/src/tools/core/stat_analysis/aggr_stat_line.cc index 7f3c16af10..c46c35c134 100644 --- a/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -65,8 +65,9 @@ using namespace std; //////////////////////////////////////////////////////////////////////// -static bool is_precip_var_name(const ConcatString &s); -static const std::string case_str = "CASE"; +static bool is_precip_var_name(const ConcatString &s); +static const string case_str = "CASE"; +static bool is_vector_dir_stat(const STATLineType &t, const ConcatString &s); //////////////////////////////////////////////////////////////////////// // @@ -834,14 +835,18 @@ void aggr_summary_lines(LineDataFile &f, STATAnalysisJob &job, } else if(line.type() == STATLineType::vl1l2 && lty == STATLineType::vcnt) { v = vl1l2_info.get_stat(req_col[i].c_str()); - w = vl1l2_info.vcount; + w = (is_vector_dir_stat(line.type(), req_col[i].c_str()) ? + vl1l2_info.dcount : + vl1l2_info.vcount); } else if(line.type() != lty) { continue; } else { v = job.get_column_double(line, req_col[i]); - w = atoi(line.get_item("TOTAL")); + w = (is_vector_dir_stat(line.type(), req_col[i].c_str()) ? + atoi(line.get_item("TOTAL_DIR")) : + atoi(line.get_item("TOTAL"))); } // @@ -2150,35 +2155,15 @@ void aggr_mpr_wind_lines(LineDataFile &f, STATAnalysisJob &job, it->second.pd_u.f_na[i], it->second.pd_v.f_na[i], it->second.pd_u.o_na[i], it->second.pd_v.o_na[i]); - if(is_bad_data(d_diff)) { - v_info.n_dir_undef = 1; - } - else { - v_info.n_dir_undef = 0; - v_info.dir_bar = d_diff; - v_info.absdir_bar = abs(d_diff); - v_info.dir2_bar = d_diff*d_diff; + if(!is_bad_data(d_diff)) { + v_info.dcount = 1; + v_info.dir_bar = d_diff; + v_info.absdir_bar = abs(d_diff); + v_info.dir2_bar = d_diff*d_diff; } aggr.vl1l2_info += v_info; - // - // Check for vectors of length zero - // - if((is_eq(it->second.pd_u.f_na[i], 0.0) && - is_eq(it->second.pd_v.f_na[i], 0.0)) || - (is_eq(it->second.pd_u.o_na[i], 0.0) && - is_eq(it->second.pd_v.o_na[i], 0.0))) { - mlog << Debug(4) << "aggr_mpr_wind_lines() -> " - << "angle not defined for zero forecast (" - << it->second.pd_u.f_na[i] << ", " << it->second.pd_v.f_na[i] - << ") or observation (" - << it->second.pd_u.o_na[i] << ", " << it->second.pd_v.o_na[i] - << ") vector for header:\n" - << it->second.hdr_sa[i] << "\n"; - continue; - } - // // Convert to and append unit vectors // @@ -4229,7 +4214,7 @@ double compute_vif(NumArray &na) { //////////////////////////////////////////////////////////////////////// -bool is_precip_var_name(const ConcatString &s) { +static bool is_precip_var_name(const ConcatString &s) { bool match = has_prefix(pinterp_precipitation_names, n_pinterp_precipitation_names, s.c_str()) || @@ -4239,4 +4224,19 @@ bool is_precip_var_name(const ConcatString &s) { return match; } + +//////////////////////////////////////////////////////////////////////// + +static bool is_vector_dir_stat(const STATLineType &t, const ConcatString &s) { + + bool match = (t == STATLineType::vl1l2 || + t == STATLineType::val1l2 || + t == STATLineType::vcnt) && + (s.startswith("DIR_ME") || + s.startswith("DIR_MAE") || + s.startswith("DIR_MSE")); + + return match; +} + //////////////////////////////////////////////////////////////////////// diff --git a/src/tools/core/stat_analysis/parse_stat_line.cc b/src/tools/core/stat_analysis/parse_stat_line.cc index ebdc9d9a0a..b3662a8eeb 100644 --- a/src/tools/core/stat_analysis/parse_stat_line.cc +++ b/src/tools/core/stat_analysis/parse_stat_line.cc @@ -238,6 +238,7 @@ void parse_vl1l2_line(STATLine &l, VL1L2Info &v_info) { v_info.uvoo_bar = atof(l.get_item("UVOOBAR")); v_info.f_speed_bar = atof(l.get_item("F_SPEED_BAR")); v_info.o_speed_bar = atof(l.get_item("O_SPEED_BAR")); + v_info.dcount = atoi(l.get_item("TOTAL_DIR")); v_info.dir_bar = atof(l.get_item("DIR_ME")); v_info.absdir_bar = atof(l.get_item("DIR_MAE")); v_info.dir2_bar = atof(l.get_item("DIR_MSE")); @@ -263,6 +264,7 @@ void parse_val1l2_line(STATLine &l, VL1L2Info &v_info) { v_info.uvooa_bar = atof(l.get_item("UVOOABAR")); v_info.fa_speed_bar = atof(l.get_item("FA_SPEED_BAR")); v_info.oa_speed_bar = atof(l.get_item("OA_SPEED_BAR")); + v_info.dacount = atoi(l.get_item("TOTAL_DIR")); v_info.dira_bar = atof(l.get_item("DIRA_ME")); v_info.absdira_bar = atof(l.get_item("DIRA_MAE")); v_info.dira2_bar = atof(l.get_item("DIRA_MSE")); diff --git a/src/tools/tc_utils/tc_gen/tc_gen.h b/src/tools/tc_utils/tc_gen/tc_gen.h index fa19075829..13c31a2ae9 100644 --- a/src/tools/tc_utils/tc_gen/tc_gen.h +++ b/src/tools/tc_utils/tc_gen/tc_gen.h @@ -59,7 +59,7 @@ static const char * default_config_filename = "MET_BASE/config/TCGenConfig_default"; // Header columns -static const char **txt_columns[n_txt] = { +static const char * const * txt_columns[n_txt] = { fho_columns, ctc_columns, cts_columns, pct_columns, pstd_columns, pjc_columns, prc_columns, genmpr_columns @@ -73,7 +73,7 @@ static const int n_txt_columns[n_txt] = { }; // Text file abbreviations -static const char *txt_file_abbr[n_txt] = { +static const char * const txt_file_abbr[n_txt] = { "fho", "ctc", "cts", "pct", "pstd", "pjc", "prc", "genmpr" };