diff --git a/met/docs/Users_Guide/point-stat.rst b/met/docs/Users_Guide/point-stat.rst index e669c6490a..5756e40cd5 100644 --- a/met/docs/Users_Guide/point-stat.rst +++ b/met/docs/Users_Guide/point-stat.rst @@ -252,6 +252,8 @@ _____________________ The Point-Stat tool is used to perform verification of a gridded model field using point observations. The gridded model field to be verified must be in one of the supported file formats. The point observations must be formatted as the NetCDF output of the point reformatting tools described in :numref:`reformat_point`. The Point-Stat tool provides the capability of interpolating the gridded forecast data to the observation points using a variety of methods as described in :numref:`matching-methods`. The Point-Stat tool computes a number of continuous statistics on the matched pair data as well as discrete statistics once the matched pair data have been thresholded. +If no matched pairs are found for a particular verification task, a report listing counts for reasons why the observations were not used is written to the log output at the default verbosity level of 2. If matched pairs are found, this report is written at verbosity level 3. Inspecting these rejection reason counts is the first step in determining why Point-Stat found no matched pairs. The order of the log messages matches the order in which the processing logic is applied. Start from the last log message and work your way up, considering each of the non-zero rejection reason counts. + point_stat usage ~~~~~~~~~~~~~~~~ diff --git a/met/src/tools/core/point_stat/point_stat.cc b/met/src/tools/core/point_stat/point_stat.cc index e1b9454e1e..664243a721 100644 --- a/met/src/tools/core/point_stat/point_stat.cc +++ b/met/src/tools/core/point_stat/point_stat.cc @@ -999,27 +999,34 @@ void process_scores() { << shc.get_interp_pnts_str() << "), using " << pd_ptr->n_obs << " matched pairs.\n"; - // Dump out detailed information about why observations were rejected - mlog << Debug(3) - << "Number of matched pairs = " << pd_ptr->n_obs << "\n" - << "Observations processed = " << conf_info.vx_opt[i].vx_pd.n_try << "\n" - << "Rejected: station id = " << conf_info.vx_opt[i].vx_pd.rej_sid << "\n" - << "Rejected: obs var name = " << conf_info.vx_opt[i].vx_pd.rej_var << "\n" - << "Rejected: valid time = " << conf_info.vx_opt[i].vx_pd.rej_vld << "\n" - << "Rejected: bad obs value = " << conf_info.vx_opt[i].vx_pd.rej_obs << "\n" - << "Rejected: off the grid = " << conf_info.vx_opt[i].vx_pd.rej_grd << "\n" - << "Rejected: topography = " << conf_info.vx_opt[i].vx_pd.rej_topo << "\n" - << "Rejected: level mismatch = " << conf_info.vx_opt[i].vx_pd.rej_lvl << "\n" - << "Rejected: quality marker = " << conf_info.vx_opt[i].vx_pd.rej_qty << "\n" - << "Rejected: message type = " << conf_info.vx_opt[i].vx_pd.rej_typ[j][k][l] << "\n" - << "Rejected: masking region = " << conf_info.vx_opt[i].vx_pd.rej_mask[j][k][l] << "\n" - << "Rejected: bad fcst value = " << conf_info.vx_opt[i].vx_pd.rej_fcst[j][k][l] << "\n" - << "Rejected: bad climo mean = " << conf_info.vx_opt[i].vx_pd.rej_cmn[j][k][l] << "\n" - << "Rejected: bad climo stdev = " << conf_info.vx_opt[i].vx_pd.rej_csd[j][k][l] << "\n" - << "Rejected: duplicates = " << conf_info.vx_opt[i].vx_pd.rej_dup[j][k][l] << "\n"; - - // Continue for no matched pairs - if(pd_ptr->n_obs == 0) continue; + // List counts for reasons why observations were rejected + cs << cs_erase + << "Number of matched pairs = " << pd_ptr->n_obs << "\n" + << "Observations processed = " << conf_info.vx_opt[i].vx_pd.n_try << "\n" + << "Rejected: station id = " << conf_info.vx_opt[i].vx_pd.rej_sid << "\n" + << "Rejected: obs var name = " << conf_info.vx_opt[i].vx_pd.rej_var << "\n" + << "Rejected: valid time = " << conf_info.vx_opt[i].vx_pd.rej_vld << "\n" + << "Rejected: bad obs value = " << conf_info.vx_opt[i].vx_pd.rej_obs << "\n" + << "Rejected: off the grid = " << conf_info.vx_opt[i].vx_pd.rej_grd << "\n" + << "Rejected: topography = " << conf_info.vx_opt[i].vx_pd.rej_topo << "\n" + << "Rejected: level mismatch = " << conf_info.vx_opt[i].vx_pd.rej_lvl << "\n" + << "Rejected: quality marker = " << conf_info.vx_opt[i].vx_pd.rej_qty << "\n" + << "Rejected: message type = " << conf_info.vx_opt[i].vx_pd.rej_typ[j][k][l] << "\n" + << "Rejected: masking region = " << conf_info.vx_opt[i].vx_pd.rej_mask[j][k][l] << "\n" + << "Rejected: bad fcst value = " << conf_info.vx_opt[i].vx_pd.rej_fcst[j][k][l] << "\n" + << "Rejected: bad climo mean = " << conf_info.vx_opt[i].vx_pd.rej_cmn[j][k][l] << "\n" + << "Rejected: bad climo stdev = " << conf_info.vx_opt[i].vx_pd.rej_csd[j][k][l] << "\n" + << "Rejected: duplicates = " << conf_info.vx_opt[i].vx_pd.rej_dup[j][k][l] << "\n"; + + // Print report based on the number of matched pairs + if(pd_ptr->n_obs > 0) { + mlog << Debug(3) << cs; + } + // Continue for zero matched pairs + else { + mlog << Debug(2) << cs; + continue; + } // Process percentile thresholds conf_info.vx_opt[i].set_perc_thresh(pd_ptr);