Skip to content

Commit

Permalink
Feature 1451 crpss (#1676)
Browse files Browse the repository at this point in the history
* Per #1450, add new ECNT columns for Hersback CRPS. Still need to actually compute the stats though.

* Per #1450, update NumArray functions to only sort if the data is not yet sorted. And check for bad data when computing the standard deviation.

* Per #1450, add code to compute the empirical CRPS value.

* Per #1450, large change to the new output for the empirical CRPS. In order to aggregate decomposed empirical CRPS reliability and potential correctly, we'd need to write (n+1)*2 additional columns. While the empirical crps can be aggregated as a weighted mean, the decomposition cannot. It just isn't feasible to do this in the ECNT line type. If this reliability and potential really are required, recommend that we add an entirely new CRPS line type instead of tacking onto ECNT. These changes simply remove reliabilit and potential from the output.

* Per #1450 and #1451, replacing single CRPS_CLIMO column with CRPSCL and CRPSCL_EMP which will be needed for #1451.

* Per #1450, delete temp files I'd accidentally committed.

* Per #1450, update the user's guide with CRPS updates.

* Per #1451, instead of computing the climo crps on the fly, compute and store it separately for each point.

* Per #1451, the ECNT line type will no longer be written separately for each CDF bin. Removing the bin-related arguments from the write_ecnt functions.

* Per #1451, the climo_cdf.write_bins option no longer applies. Since Ensemble-Stat will no longer compute stats separately for each climo bin, I'm removing the reference to write_bins from the Ensemble-Stat config files.

* Per #1451, compute and store the climo CRPS for each point. Also, break apart the normal climo computation into separate functions for crps, ign, and pit.

* Per #1451, update Ensemble-Stat logic to no longer subset pairs into climo CDF bins. We had done this to be consistent with the use of climo data in point and grid-stat. But this change to the handling of climo data is consitent with the NOAA/EMC approach.

* Per #1451, split out the setting of climo CDF thresholds into a separate function so that it can also be called by stat-analysis.

* Per #1451, in the Ensemble-Stat ORANK line type, rename CLIMO to CLIMO_MEAN and add a CLIMO_STDEV column.

* Per #1451, also need to update gsidens2orank to write a climo_stdev column.

* Per #1451, switch from constant pointer to ClimoCDFInfo object to a copy to make the logic of doing this in Stat-Analysis a little easier.

* Per #1451, the HiRA method in Point-Stat computes an ECNT output line type. Needed to call set_climo_cdf() there so that we know how many climo values to use when computing the empirical climo CRPS.

* Per #1451, need to store climo_cdf for both grid and point verification.

* Per #1451, update to write the CLIMO_STDEV header column for the ORANK line type.

* Per #1451, in Ensemble-Stat when doing point verification, check for empty OBS_UNIT string and write NA instead.

* Per #1451, update unit tests by enhancing the climatology call to Ensemble-Stat to also include point verification. Tweak the Ensemble-Stat cofiguration for that and also add a call to pb2nc to prepare the point observations for use.

* Per #1450, added a new section to the Ensemble-Stat chapter describing how climo mean/stdev are used in the computation of the skill scores.

* Update ensemble-stat.rst

Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com>
  • Loading branch information
JohnHalleyGotway and j-opatz committed Feb 24, 2021
1 parent 6231c1e commit 8fb5a47
Show file tree
Hide file tree
Showing 24 changed files with 358 additions and 388 deletions.
3 changes: 1 addition & 2 deletions met/data/config/EnsembleStatConfig_default
Expand Up @@ -189,9 +189,8 @@ climo_stdev = {
// May be set separately in each "obs.field" entry
//
climo_cdf = {
cdf_bins = 1;
cdf_bins = 10;
center_bins = FALSE;
write_bins = TRUE;
}

////////////////////////////////////////////////////////////////////////////////
Expand Down
2 changes: 1 addition & 1 deletion met/data/table_files/met_header_columns_V10.0.txt
Expand Up @@ -11,7 +11,7 @@ V10.0 : STAT : NBRCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID
V10.0 : STAT : NBRCTS : 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 BASER BASER_NCL BASER_NCU BASER_BCL BASER_BCU FMEAN FMEAN_NCL FMEAN_NCU FMEAN_BCL FMEAN_BCU ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU FBIAS FBIAS_BCL FBIAS_BCU PODY PODY_NCL PODY_NCU PODY_BCL PODY_BCU PODN PODN_NCL PODN_NCU PODN_BCL PODN_BCU POFD POFD_NCL POFD_NCU POFD_BCL POFD_BCU FAR FAR_NCL FAR_NCU FAR_BCL FAR_BCU CSI CSI_NCL CSI_NCU CSI_BCL CSI_BCU GSS GSS_BCL GSS_BCU HK HK_NCL HK_NCU HK_BCL HK_BCU HSS HSS_BCL HSS_BCU ODDS ODDS_NCL ODDS_NCU ODDS_BCL ODDS_BCU LODDS LODDS_NCL LODDS_NCU LODDS_BCL LODDS_BCU ORSS ORSS_NCL ORSS_NCU ORSS_BCL ORSS_BCU EDS EDS_NCL EDS_NCU EDS_BCL EDS_BCU SEDS SEDS_NCL SEDS_NCU SEDS_BCL SEDS_BCU EDI EDI_NCL EDI_NCU EDI_BCL EDI_BCU SEDI SEDI_NCL SEDI_NCU SEDI_BCL SEDI_BCU BAGSS BAGSS_BCL BAGSS_BCU
V10.0 : STAT : GRAD : 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 FGBAR OGBAR MGBAR EGBAR S1 S1_OG FGOG_RATIO DX DY
V10.0 : STAT : DMAP : 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 FY OY FBIAS BADDELEY HAUSDORFF MED_FO MED_OF MED_MIN MED_MAX MED_MEAN FOM_FO FOM_OF FOM_MIN FOM_MAX FOM_MEAN ZHU_FO ZHU_OF ZHU_MIN ZHU_MAX ZHU_MEAN
V10.0 : STAT : ORANK : 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 OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV OBS PIT RANK N_ENS_VLD (N_ENS) ENS_[0-9]* OBS_QC ENS_MEAN CLIMO SPREAD ENS_MEAN_OERR SPREAD_OERR SPREAD_PLUS_OERR
V10.0 : STAT : ORANK : 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 OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV OBS PIT RANK N_ENS_VLD (N_ENS) ENS_[0-9]* OBS_QC ENS_MEAN CLIMO_MEAN SPREAD ENS_MEAN_OERR SPREAD_OERR SPREAD_PLUS_OERR CLIMO_STDEV
V10.0 : STAT : PCT : 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_THRESH) THRESH_[0-9]* OY_[0-9]* ON_[0-9]*
V10.0 : STAT : PJC : 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_THRESH) THRESH_[0-9]* OY_TP_[0-9]* ON_TP_[0-9]* CALIBRATION_[0-9]* REFINEMENT_[0-9]* LIKELIHOOD_[0-9]* BASER_[0-9]*
V10.0 : STAT : PRC : 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_THRESH) THRESH_[0-9]* PODY_[0-9]* POFD_[0-9]*
Expand Down
31 changes: 19 additions & 12 deletions met/docs/Users_Guide/ensemble-stat.rst
Expand Up @@ -6,7 +6,7 @@ Ensemble-Stat Tool
Introduction
____________

The Ensemble-Stat tool may be run to create simple ensemble forecasts (mean, probability, spread, etc) from a set of several forecast model files to be used by the MET statistics tools. If observations are also included, ensemble statistics such as rank histograms, probability integral transform histograms, spread/skill variance, relative position and continuous ranked probability score are produced. A climatology file may also be provided, and will be used as a reference forecast in several of the output statistics. Finally, observation error perturbations can be included prior to calculation of statistics. Details about and equations for the statistics produced for ensembles are given in :numref:`Appendix C, Section %s <App_C-ensemble>`.
The Ensemble-Stat tool may be run to create simple ensemble forecasts (mean, probability, spread, etc) from a set of several forecast model files to be used by the MET statistics tools. If observations are also included, ensemble statistics such as rank histograms, probability integral transform histograms, spread/skill variance, relative position and continuous ranked probability score are produced. Climatological mean and standard deviation data may also be provided, and will be used as a reference forecast in several of the output statistics. Finally, observation error perturbations can be included prior to calculation of statistics. Details about and equations for the statistics produced for ensembles are given in :numref:`Appendix C, Section %s <App_C-ensemble>`.

Scientific and statistical aspects
__________________________________
Expand All @@ -33,6 +33,11 @@ The relative position (RELP) is a count of the number of times each ensemble mem

The ranked probability score (RPS) is included in the Ranked Probability Score (RPS) line type. It is the mean of the Brier scores computed from ensemble probabilities derived for each probability category threshold (prob_cat_thresh) specified in the configuration file. The continuous ranked probability score (CRPS) is the average the distance between the forecast (ensemble) cumulative distribution function and the observation cumulative distribution function. It is an analog of the Brier score, but for continuous forecast and observation fields. The CRPS statistic is computed using two methods: assuming a normal distribution defined by the ensemble mean and spread (:ref:`Gneiting et al., 2004 <Gneiting-2004>`) and using the empirical ensemble distribution (:ref:`Hersbach, 2000 <Hersbach-2000>`). The CRPS statistic is included in the Ensemble Continuous Statistics (ECNT) line type, along with other statistics quantifying the ensemble spread and ensemble mean skill.

Climatology data
~~~~~~~~~~~~~~~~

The Ensemble-Stat output includes at least three statistics computed relative to external climatology data. The climatology is defined by mean and standard deviation fields, and both are required in the computation of ensemble skill score statistics. MET assumes that the climatology follows a normal distribution, defined by the mean and standard deviation at each point. When computing the CRPS skill score for (:ref:`Gneiting et al., 2004 <Gneiting-2004>`) the reference CRPS statistic is computed using the climatological mean and standard deviation directly. When computing the CRPS skill score for (:ref:`Hersbach, 2000 <Hersbach-2000>`) the reference CRPS statistic is computed by selecting equal-area-spaced values from the assumed normal climatological distribution. The number of points selected is determined by the *cdf_bins* setting in the *climo_cdf* dictionary. The reference CRPS is computed empirically from this ensemble of climatology values. The climatological distribution is also used for the RPSS. The forecast RPS statistic is computed from a probabilistic contingency table in which the probabilities are derived from the ensemble member values. In a simliar fashion, the climatogical probability for each observed value is derived from the climatological distribution. The area of the distribution to the left of the observed value is interpreted as the climatological probability. These climatological probabilities are also evaluated using a probabilistic contingency table from which the reference RPS score is computed. The skill scores are derived by comparing the forecast statistic to the reference climatology statistic.

Ensemble observation error
~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand All @@ -45,7 +50,7 @@ Observation errors differ according to instrument, temporal and spatial represen
Practical Information
_____________________

This section contains information about configuring and running the Ensemble-Stat tool. The Ensemble-Stat tool creates or verifies gridded model data. For verification, this tool can accept either gridded or point observations. If provided, the climatology file must be gridded. The input gridded model, observation, and climatology datasets must be on the same grid prior to calculation of any statistics, and in one of the MET supported gridded file formats. If gridded files are not on the same grid, MET will do the regridding for you if you specify the desired output grid. The point observations must be formatted as the NetCDF output of the point reformatting tools described in :numref:`reformat_point`.
This section contains information about configuring and running the Ensemble-Stat tool. The Ensemble-Stat tool creates or verifies gridded model data. For verification, this tool can accept either gridded or point observations. If provided, the climatology data files must be gridded. The input gridded model, observation, and climatology datasets must be on the same grid prior to calculation of any statistics, and in one of the MET supported gridded file formats. If gridded files are not on the same grid, MET will do the regridding for you if you specify the desired output grid. The point observations must be formatted as the NetCDF output of the point reformatting tools described in :numref:`reformat_point`.

ensemble_stat usage
~~~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -256,7 +261,7 @@ The **obs** dictionary looks very similar to the **fcst** dictionary. If verifyi
The **ens_ssvar_bin_size** and **ens_phist_bin_size** specify the width of the categorical bins used to accumulate frequencies for spread-skill-variance or probability integral transform statistics, respectively.


The **prob_cat_thresh** entry is an array of thresholds to be applied in the computation of the RPS line type. Since these thresholds can change for each variable, they can be specified separately for each **fcst.field** entry. If left empty but climatology data is provided, the **climo_cdf** thresholds will be used instead. If no climatology data is provided, and the RPS output line type is requested, then the **prob_cat_thresh** array must be defined.
The **prob_cat_thresh** entry is an array of thresholds to be applied in the computation of the RPS line type. Since these thresholds can change for each variable, they can be specified separately for each **fcst.field** entry. If left empty but climatological mean and standard deviation data is provided, the **climo_cdf** thresholds will be used instead. If no climatology data is provided, and the RPS output line type is requested, then the **prob_cat_thresh** array must be defined.

__________________

Expand Down Expand Up @@ -800,28 +805,30 @@ The format of the STAT and ASCII output of the Ensemble-Stat tool are described
* - 37
- ENS_i
- Value of the ith ensemble member (repeated)
* - Last-6
* - Last-7
- OBS_QC
- Quality control string for the observation
* - Last-5
* - Last-6
- ENS_MEAN
- The unperturbed ensemble mean value
* - Last-5
- CLIMO_MEAN
- Climatological mean value (named CLIMO prior to met-10.0.0)
* - Last-4
- CLIMO
- The value of the included climatology
* - Last-3
- SPREAD
- The spread (standard deviation) of the unperturbed ensemble member values
* - Last-2
* - Last-3
- ENS_MEAN _OERR
- The PERTURBED ensemble mean (e.g. with Observation Error).
* - Last-1
* - Last-2
- SPREAD_OERR
- The spread (standard deviation) of the PERTURBED ensemble member values (e.g. with Observation Error).
* - Last
* - Last-1
- SPREAD_PLUS_OERR
- The square root of the sum of the unperturbed ensemble variance and the observation error variance.

* - Last
- CLIMO_STDEV
- Climatological standard deviation value

.. role:: raw-html(raw)
:format: html
Expand Down
3 changes: 1 addition & 2 deletions met/scripts/config/EnsembleStatConfig
Expand Up @@ -198,9 +198,8 @@ climo_stdev = {
// May be set separately in each "obs.field" entry
//
climo_cdf = {
cdf_bins = 1;
cdf_bins = 10;
center_bins = FALSE;
write_bins = TRUE;
}

////////////////////////////////////////////////////////////////////////////////
Expand Down
9 changes: 5 additions & 4 deletions met/src/basic/vx_config/config_constants.h
Expand Up @@ -284,11 +284,11 @@ struct RegridInfo {
ThreshArray censor_thresh; // Censoring thesholds
NumArray censor_val; // and replacement values

void * hook; // not allocated
void * hook; // not allocated

void clear();
void validate(); // ensure that width and method are accordant
void validate_point(); // ensure that width and method are accordant
void clear();
void validate(); // ensure that width and method are accordant
void validate_point(); // ensure that width and method are accordant
};

////////////////////////////////////////////////////////////////////////
Expand All @@ -305,6 +305,7 @@ struct ClimoCDFInfo {

ClimoCDFInfo();
void clear();
void set_cdf_ta(int, bool &); // Construct equally-likely thresholds
};

////////////////////////////////////////////////////////////////////////
Expand Down
110 changes: 58 additions & 52 deletions met/src/basic/vx_config/config_util.cc
Expand Up @@ -1483,6 +1483,61 @@ ClimoCDFInfo::ClimoCDFInfo() {

///////////////////////////////////////////////////////////////////////////////

void ClimoCDFInfo::set_cdf_ta(int n_bin, bool &center) {

// Must be greater than 0
if(n_bin <= 0) {
mlog << Error << "\nClimoCDFInfo::set_cdf_ta() -> "
<< "The \"" << conf_key_cdf_bins << "\" entry (" << n_bin
<< ") must be greater than zero.\n\n";
exit(1);
}

// Even number of bins cannot be centered
if(n_bin%2 == 0 && center) {
mlog << Warning << "\nClimoCDFInfo::set_cdf_ta() -> "
<< "Resetting \"" << conf_key_center_bins
<< "\" to false since the \"" << conf_key_cdf_bins
<< "\" entry (" << n_bin << ") is even.\n\n";
center = false;
}

// For a single bin, set center to false
if(n_bin == 1) center = false;

// Add the first threshold for 0.0
cdf_ta.add(0.0, thresh_ge);

double cdf_inc = (center ? 1.0/(n_bin - 1.0) : 1.0/n_bin);
double cdf_val = (center ? cdf_inc/2 : cdf_inc );

// Add thresholds between 0.0 and 1.0
while(cdf_val < 1.0 && !is_eq(cdf_val, 1.0)) {
cdf_ta.add(cdf_val, thresh_ge);
cdf_val += cdf_inc;
}

// Add the last threshold for 1.0
cdf_ta.add(1.0, thresh_ge);

if(n_bin == 1) {
mlog << Debug(4) << "ClimoCDFInfo::set_cdf_ta() -> "
<< "Since \"" << conf_key_cdf_bins << "\" = 1, "
<< "no climatology CDF bins will be applied.\n";
}
else {
mlog << Debug(4) << "ClimoCDFInfo::set_cdf_ta() -> "
<< "For \"" << conf_key_cdf_bins << "\" (" << n_bin << ") and \""
<< conf_key_center_bins << "\" (" << bool_to_string(center)
<< "), defined climatology CDF thresholds: "
<< write_css(cdf_ta) << "\n";
}

return;
}

///////////////////////////////////////////////////////////////////////////////

ClimoCDFInfo parse_conf_climo_cdf(Dictionary *dict) {
Dictionary *cdf_dict = (Dictionary *) 0;
ClimoCDFInfo info;
Expand All @@ -1506,7 +1561,8 @@ ClimoCDFInfo parse_conf_climo_cdf(Dictionary *dict) {
center = cdf_dict->lookup_bool(conf_key_center_bins);

// Conf: write_bins
info.write_bins = cdf_dict->lookup_bool(conf_key_write_bins);
// Used by Grid-Stat and Point-Stat but not by Ensemble-Stat
info.write_bins = cdf_dict->lookup_bool(conf_key_write_bins, false, false);

// Check that at least one value is provided
if(bins.n() == 0) {
Expand All @@ -1522,57 +1578,7 @@ ClimoCDFInfo parse_conf_climo_cdf(Dictionary *dict) {
}
// Interpret a single value as the number of bins
else {

// Store the number of bins
int n_bins = nint(bins[0]);

// Must be greater than 0
if(n_bins <= 0) {
mlog << Error << "\nparse_conf_climo_cdf() -> "
<< "The \"" << conf_key_cdf_bins << "\" entry (" << n_bins
<< ") must be greater than zero.\n\n";
exit(1);
}

// Even number of bins cannot be centered
if(n_bins%2 == 0 && center) {
mlog << Warning << "\nparse_conf_climo_cdf() -> "
<< "Resetting \"" << conf_key_center_bins
<< "\" to false since the \"" << conf_key_cdf_bins
<< "\" entry (" << n_bins << ") is even.\n\n";
center = false;
}

// For a single bin, set center to false
if(n_bins == 1) center = false;

// Add the first threshold for 0.0
info.cdf_ta.add(0.0, thresh_ge);

double cdf_inc = (center ? 1.0/(bins[0] - 1.0) : 1.0/bins[0]);
double cdf_val = (center ? cdf_inc/2 : cdf_inc );

// Add thresholds between 0.0 and 1.0
while(cdf_val < 1.0 && !is_eq(cdf_val, 1.0)) {
info.cdf_ta.add(cdf_val, thresh_ge);
cdf_val += cdf_inc;
}

// Add the last threshold for 1.0
info.cdf_ta.add(1.0, thresh_ge);

if(n_bins == 1) {
mlog << Debug(4) << "parse_conf_climo_cdf() -> "
<< "Since \"" << conf_key_cdf_bins << "\" = 1, "
<< "no climatology CDF bins will be applied.\n";
}
else {
mlog << Debug(4) << "parse_conf_climo_cdf() -> "
<< "For \"" << conf_key_cdf_bins << "\" (" << n_bins << ") and \""
<< conf_key_center_bins << "\" (" << bool_to_string(center)
<< "), defined climatology CDF thresholds: "
<< write_css(info.cdf_ta) << "\n";
}
info.set_cdf_ta(bins[0], center);
}

// Sanity check the end points
Expand Down
16 changes: 8 additions & 8 deletions met/src/basic/vx_util/stat_column_defs.h
Expand Up @@ -281,13 +281,13 @@ static const char * phist_columns [] = {
};

static const char * orank_columns [] = {
"TOTAL", "INDEX", "OBS_SID",
"OBS_LAT", "OBS_LON", "OBS_LVL",
"OBS_ELV", "OBS", "PIT",
"RANK", "N_ENS_VLD", "N_ENS",
"ENS_", "OBS_QC", "ENS_MEAN",
"CLIMO", "SPREAD", "ENS_MEAN_OERR",
"SPREAD_OERR", "SPREAD_PLUS_OERR"
"TOTAL", "INDEX", "OBS_SID",
"OBS_LAT", "OBS_LON", "OBS_LVL",
"OBS_ELV", "OBS", "PIT",
"RANK", "N_ENS_VLD", "N_ENS",
"ENS_", "OBS_QC", "ENS_MEAN",
"CLIMO_MEAN", "SPREAD", "ENS_MEAN_OERR",
"SPREAD_OERR", "SPREAD_PLUS_OERR", "CLIMO_STDEV"
};

static const char * ssvar_columns [] = {
Expand Down Expand Up @@ -424,7 +424,7 @@ inline int get_n_eclv_columns (int n) { return(4 + 2*n); } // n =
inline int get_n_rhist_columns (int n) { return(2 + n); } // n = N_RANK
inline int get_n_phist_columns (int n) { return(3 + n); } // n = N_BINS
inline int get_n_relp_columns (int n) { return(2 + n); } // n = N_ENS
inline int get_n_orank_columns (int n) { return(19 + n); } // n = N_ENS
inline int get_n_orank_columns (int n) { return(20 + n); } // n = N_ENS

////////////////////////////////////////////////////////////////////////

Expand Down
3 changes: 2 additions & 1 deletion met/src/libcode/vx_analysis_util/stat_job.cc
Expand Up @@ -2439,7 +2439,8 @@ ConcatString STATAnalysisJob::get_jobstring() const {
// Jobs which use out_bin_size
if(line_type.n_elements() > 0) {
if(string_to_statlinetype(line_type[0].c_str()) == stat_orank &&
out_line_type.has(stat_phist_str)) {
(out_line_type.has(stat_phist_str) ||
out_line_type.has(stat_ecnt_str))) {

// out_bin_size
js << "-out_bin_size " << out_bin_size << " ";
Expand Down

0 comments on commit 8fb5a47

Please sign in to comment.