Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature 1644 ps_log #1651

Merged
merged 2 commits into from
Feb 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions met/docs/Users_Guide/point-stat.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
~~~~~~~~~~~~~~~~

Expand Down
49 changes: 28 additions & 21 deletions met/src/tools/core/point_stat/point_stat.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down