From 663fda76d0663a22a9b721d4d7d8b2ebd516b002 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Wed, 22 May 2024 15:02:08 -0600 Subject: [PATCH] Bugfix #2897 develop python_valid_time (#2899) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Per #2897, fix typos in 2 log messages. Also fix the bug in storing the valid time strings. The time string in vld_array should exactly correspond to the numeric unixtime values in vld_num_array. Therefore they need to be updated inside the same if block. The bug is that we were storing only the unique unixtime values but storing ALL of the valid time string, not just the unique ones. * Per #2897, minor change to formatting of log message * MET #2897, don’t waste time searching, just set the index to n - 1 * Per #2897, remove unused add_prec_point_obs(...) function * Per #2897, update add_point_obs(...) logic for DEBUG(9) to print very detailed log messages about what obs are being rejected and which are being used for each verification task. * Per #2897, refine the 'using' log message to make the wording consistent with the summary rejection reason counts log message * Per #2897, update the User's Guide about -v 9 for Point-Stat --------- Co-authored-by: j-opatz Co-authored-by: MET Tools Test Account --- docs/Users_Guide/appendixA.rst | 5 + docs/Users_Guide/point-stat.rst | 2 +- .../vx_pointdata_python/python_pointdata.cc | 11 +- src/libcode/vx_statistics/pair_data_point.cc | 333 ++++++++++++++---- src/libcode/vx_statistics/pair_data_point.h | 4 - 5 files changed, 276 insertions(+), 79 deletions(-) diff --git a/docs/Users_Guide/appendixA.rst b/docs/Users_Guide/appendixA.rst index 83b10c2c32..4dbf571008 100644 --- a/docs/Users_Guide/appendixA.rst +++ b/docs/Users_Guide/appendixA.rst @@ -121,6 +121,11 @@ Q. How can I understand the number of matched pairs? in the configuration file. So all of the 1166 observations are rejected for the same reason. + In addition, running point_stat with at least verbosity level 9 (-v 9) + will result in a log message being printed to explain why each + observation is skipped or retained for each verification task. + This level of detail is intended only for debugging purposes. + Q. What types of NetCDF files can MET read? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/Users_Guide/point-stat.rst b/docs/Users_Guide/point-stat.rst index ec4e69178b..025b462f23 100644 --- a/docs/Users_Guide/point-stat.rst +++ b/docs/Users_Guide/point-stat.rst @@ -264,7 +264,7 @@ Practical Information 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. +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. Verbosity level 9 prints a very detailed explanation about why each observation is used or skipped for each verification task. point_stat Usage ---------------- diff --git a/src/libcode/vx_pointdata_python/python_pointdata.cc b/src/libcode/vx_pointdata_python/python_pointdata.cc index df27f81c9a..5eae0b7403 100644 --- a/src/libcode/vx_pointdata_python/python_pointdata.cc +++ b/src/libcode/vx_pointdata_python/python_pointdata.cc @@ -350,8 +350,10 @@ bool process_point_data_list(PyObject *python_point_data, MetPointDataPython &me // get valid time index vld_time = obs.getValidTime(); if ( !header_data->vld_num_array.has(vld_time, vld_idx) ) { + // MET #2897 keep vld_array and vld_num_array in sync + header_data->vld_array.add(obs.getValidTimeString()); header_data->vld_num_array.add(vld_time); - header_data->vld_num_array.has(vld_time, vld_idx); + vld_idx = header_data->vld_num_array.n() - 1; } if (!is_eq(prev_lat, lat) || !is_eq(prev_lon, lon) || !is_eq(prev_elv, elv) @@ -363,7 +365,6 @@ bool process_point_data_list(PyObject *python_point_data, MetPointDataPython &me header_data->sid_idx_array.add(sid); header_data->typ_idx_array.add(typ_idx); header_data->vld_idx_array.add(vld_idx); - header_data->vld_array.add(obs.getValidTimeString()); prev_lat = lat; prev_lon = lon; @@ -763,7 +764,7 @@ void print_met_data(MetPointObsData *obs_data, MetPointHeader *header_data, << header_data->vld_idx_array.n() << ", lat=" << header_data->lat_array.n() << ", lon=" << header_data->lon_array.n() << ", elv=" - << header_data->elv_array.n() << ", message_type=" + << header_data->elv_array.n() << ", message_type=" << header_data->typ_array.n() << ", station_id=" << header_data->sid_array.n() << ", valid_time=" << header_data->vld_array.n() << ", prpt=" @@ -774,7 +775,7 @@ void print_met_data(MetPointObsData *obs_data, MetPointHeader *header_data, log_count = (header_data->hdr_count > min_count) ? min_count : header_data->hdr_count; mlog << Debug(debug_level) << method_name - << "header_data: message_type,station_id,time_time,lat,lon.elv\n"; + << "header_data: message_type,station_id,time_time,lat,lon,elv\n"; for (int idx=0; idxmagic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation station id:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_sid++; return; } - + // Check whether the GRIB code for the observation matches // the specified code if((var_name != 0) && (0 < strlen(var_name))) { if(var_name != obs_info->name()) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation variable name:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_var++; return; } } else if(obs_info->code() != nint(obs_arr[1])) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation variable GRIB code:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_var++; return; } - + // Check the observation quality include and exclude options if((obs_qty_inc_filt.n() > 0 && !obs_qty_inc_filt.has(obs_qty)) || (obs_qty_exc_filt.n() > 0 && obs_qty_exc_filt.has(obs_qty))) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation quality control string:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_qty++; return; } - + // Check whether the observation time falls within the valid time // window if(hdr_ut < beg_ut || hdr_ut > end_ut) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation valid time:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_vld++; return; } @@ -1043,13 +1100,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check whether the observation value contains valid data if(is_bad_data(obs_v)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation with bad data value:\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation with bad data value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_obs++; return; } @@ -1063,15 +1124,18 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, if(((x < 0 || x >= gr.nx()) && !gr.wrap_lon()) || y < 0 || y >= gr.ny()) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation off the grid where (x, y) = (" - << x << ", " << y << ") and grid (nx, ny) = (" << gr.nx() - << ", " << gr.ny() << "):\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation off the grid where (x, y) = (" + << x << ", " << y << ") and grid (nx, ny) = (" << gr.nx() + << ", " << gr.ny() << "):\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_grd++; return; } @@ -1088,32 +1152,40 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Skip bad topography values if(is_bad_data(hdr_elv) || is_bad_data(topo)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation due to bad topography values " - << "where observation elevation = " << hdr_elv - << " and model topography = " << topo << ":\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to bad topography values " + << "where observation elevation = " << hdr_elv + << " and model topography = " << topo << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_topo++; return; } // Check the topography difference threshold if(!sfc_info.topo_use_obs_thresh.check(topo - hdr_elv)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation due to topography difference " - << "where observation elevation (" << hdr_elv - << ") minus model topography (" << topo << ") = " - << topo - hdr_elv << " is not " - << sfc_info.topo_use_obs_thresh.get_str() << ":\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to topography difference " + << "where observation elevation (" << hdr_elv + << ") minus model topography (" << topo << ") = " + << topo - hdr_elv << " is not " + << sfc_info.topo_use_obs_thresh.get_str() << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_topo++; return; } @@ -1125,6 +1197,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, if(obs_lvl < obs_info->level().lower() || obs_lvl > obs_info->level().upper()) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation pressure level value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_lvl++; return; } @@ -1135,6 +1218,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, if(obs_lvl < obs_info->level().lower() || obs_lvl > obs_info->level().upper()) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation accumulation interval:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_lvl++; return; } @@ -1147,6 +1241,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, if(!msg_typ_sfc.reg_exp_match(hdr_typ_str) && (obs_hgt < obs_info->level().lower() || obs_hgt > obs_info->level().upper())) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation level value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + rej_lvl++; return; } @@ -1218,8 +1323,18 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // // Check for a matching PrepBufr message type // - if(!pd[i][0][0].msg_typ_vals.has(hdr_typ_str)) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation message type:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_typ, i); continue; } @@ -1230,6 +1345,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check for the obs falling within the masking region if(pd[i][j][0].mask_area_ptr != (MaskPlane *) 0) { if(!pd[i][j][0].mask_area_ptr->s_is_on(x, y)) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based on spatial masking region:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_mask, i, j); continue; } @@ -1238,8 +1364,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // masking SID list else if(pd[i][j][0].mask_sid_ptr != (StringArray *) 0) { if(!pd[i][j][0].mask_sid_ptr->has(hdr_sid_str)) { - mlog << Debug(9) << "Checking for the obs station id in the masking SID list: rejected hdr_sid_str = " - << hdr_sid_str << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based on masking station id list:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_mask, i, j); continue; } @@ -1248,6 +1383,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, else if(pd[i][j][0].mask_llpnt_ptr != (MaskLatLon *) 0) { if(!pd[i][j][0].mask_llpnt_ptr->lat_thresh.check(hdr_lat) || !pd[i][j][0].mask_llpnt_ptr->lon_thresh.check(hdr_lon)) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based on latitude/longitude thesholds:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_mask, i, j); continue; } @@ -1272,6 +1418,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check for bad data if(climo_mn_dpa.n_planes() > 0 && is_bad_data(cmn_v)) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based on bad climatological mean value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_cmn, i, j, k); continue; } @@ -1300,6 +1457,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check for bad data if(climo_sd_dpa.n_planes() > 0 && is_bad_data(csd_v)) { + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based on bad climatological standard deviation value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_csd, i, j, k); continue; } @@ -1336,16 +1504,20 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, } if(is_bad_data(fcst_v)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation due to bad data in the " - << interpmthd_to_string(pd[0][0][k].interp_mthd) << "(" - << pd[0][0][k].interp_wdth * pd[0][0][k].interp_wdth - << ") interpolated forecast value:\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation based due to bad data in the " + << interpmthd_to_string(pd[0][0][k].interp_mthd) << "(" + << pd[0][0][k].interp_wdth * pd[0][0][k].interp_wdth + << ") interpolated forecast value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_fcst, i, j, k); continue; } @@ -1353,14 +1525,18 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check matched pair filtering options if(!check_mpr_thresh(fcst_v, obs_v, cmn_v, csd_v, mpr_column, mpr_thresh, &reason_cs)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation due to matched pair filter since " - << reason_cs << ":\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to matched pair filter since " + << reason_cs << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_mpr, i, j, k); continue; } @@ -1375,13 +1551,17 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, hdr_lat, hdr_lon, obs_x, obs_y, hdr_ut, obs_lvl, obs_hgt, fcst_v, obs_v, obs_qty, cmn_v, csd_v, wgt_v)) { - mlog << Debug(4) - << "For " << fcst_info->magic_str() << " versus " - << obs_info->magic_str() - << ", skipping observation since it is a duplicate:\n" - << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty, obs_arr, var_name) - << "\n"; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation since it is a duplicate:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + inc_count(rej_dup, i, j, k); } seeps = 0; @@ -1390,6 +1570,21 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, } pd[i][j][k].set_seeps_score(seeps); if (seeps) delete seeps; + + if(mlog.verbosity_level() >= REJECT_DEBUG_LEVEL) { + mlog << Debug(REJECT_DEBUG_LEVEL) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() << ", for observation type " + << pd[i][0][0].msg_typ << ", over region " + << pd[0][j][0].mask_name << ", for interpolation method " + << interpmthd_to_string(pd[0][0][k].interp_mthd) << "(" + << pd[0][0][k].interp_wdth * pd[0][0][k].interp_wdth + << "), using observation:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + } + } // end for k } // end for j } // end for i @@ -1939,8 +2134,8 @@ ConcatString point_obs_to_string(float *hdr_arr, const char *hdr_typ_str, const char *var_name) { ConcatString obs_cs, name; - if((var_name != 0) && (0 < m_strlen(var_name))) name = var_name; - else name = obs_arr[1]; + if((var_name != 0) && (0 < m_strlen(var_name))) name << var_name; + else name << nint(obs_arr[1]); // // Write the 11-column MET point format: diff --git a/src/libcode/vx_statistics/pair_data_point.h b/src/libcode/vx_statistics/pair_data_point.h index a32e4dbe4e..c68ddf1f33 100644 --- a/src/libcode/vx_statistics/pair_data_point.h +++ b/src/libcode/vx_statistics/pair_data_point.h @@ -244,10 +244,6 @@ class VxPairDataPoint { const char *, float *, Grid &, const char * = 0, const DataPlane * = 0); - void add_prec_point_obs(float *, const char *, const char *, unixtime, - const char *, float *, Grid &, int month, int hour, - const char * = 0, const DataPlane * = 0); - int get_n_pair() const; void set_duplicate_flag(DuplicateType duplicate_flag);