PointStat: Use Point-Stat to Verify Points that meet the Red Flag Criteria

model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire.py

Scientific Objective

This use case evaluates the HRRR model using the Red Flag Criteria for Fire weather. The purpose is to identify points that meet the Red Flag Criteria. The evaluation is done two ways. The first is to identify areas that match the relative humidity, wind speed, and wind gust criteria separately. The second way takes a relative humidity mask and finds the points that meet the wind criteria inside each mask. This way we can identify the points that meet both the relative humidity and wind speed/wind gust criteria.

Version Added

METplus version 13.0

Datasets

Forecast: HRRR

Observation: MADIS

Climatology: None

Location: All of the input data required for this use case can be found in a sample data tarball. Each use case category will have one or more sample data tarballs. It is only necessary to download the tarball with the use case’s dataset and not the entire collection of sample data. Click here to access the METplus releases page and download sample data for the appropriate release: https://github.com/dtcenter/METplus/releases This tarball should be unpacked into the directory that you will set the value of INPUT_BASE. See Running METplus section for more information.

The MADIS observations are downloaded automatically. Make sure you have an internet connection.

METplus Components

This use case calls Data-Ingest once and Gen-Vx-Mask, Point-Stat, and Stat-Analysis 3 times. It also calls User-Script twice. Additionally, METcalcpy, METplotpy, and METdataio are required to run this use case. The METcalcpy scripts accessed include the following:

  • metcalcpy/util/read_env_vars_in_config.py

The METplopty scrips accessed include the following:

  • metplotpy/plots/performance_diagram/performance_diagram.py

The METdataio scripts accessed include the following:

  • METdbLoad/ush/read_data_files.py

  • METdbLoad/ush/read_load_xml.py

  • METreformat/write_stat_ascii.py

METplus Workflow

Beginning time (VALID_BEG): 2025-05-28 18 UTC

End time (VALID_END): 2025-05-29 18 UTC

Increment between beginning and end times (VALID_INCREMENT): 6 hours

Sequence of forecast leads to process (INIT_SEQ): 0, 6, 12, 18

Forecast lead min and max to process: 6 to 24 hours

The call to DataIngest, the second 2 calls to Gen-Vx-Mask, and the 3 calls to Point-Stat are processed at 6 hourly increments for the 0, 6, 12, and 18 hour model initializations using lead times between 6 and 24 hours, for a total of 20 runs. The first call to Gen-Vx-Mask is run once to create the mask for the Hanford CWA domain.

The first call of Point-Stat processes statistics for each variable (relative humidity, wind speed, and wind gusts) individually. The second call uses a data mask of relative humidity less than 15% and calculates statistics for wind speed and wind gusts. This enables the identification of points that meet both the wind and relative humidity threshold for fire weather. Similarly, the third call to Point-Stat uses a data mask of relative humidity less than 10% and calculates statistics for wind speed and wind gusts.

Stat-Analysis is called once for the entire time period for each of the 3 calls. Each of the 3 runs aggregates statistics for the different runs of Point-Stat above. Additionally, both of the 2 User-Scripts are also called once. The first User-Script reformats data, while the second creates the performance diagrams.

METplus Configuration

METplus first loads all of the configuration files found in parm/metplus_config, then it loads any configuration files passed to METplus via the command line, i.e. parm/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire.conf

[config]

# Documentation for this use case can be found at
# https://metplus.readthedocs.io/en/latest/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire.html

# For additional information, please see the METplus Users Guide.
# https://metplus.readthedocs.io/en/latest/Users_Guide

###
# Processes to run
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#process-list
###

PROCESS_LIST = DataIngest, GenVxMask(Hanford_CWA), GenVxMask(RH_mask_10), GenVxMask(RH_mask_15), PointStat(Separate_Variables), PointStat(Combined_rh15), PointStat(Combined_rh10), StatAnalysis(Separate_Variables), StatAnalysis(Combined_rh15), StatAnalysis(Combined_rh10), UserScript(reformat_CTS), UserScript(performance_diagram)


###
# Time Info
# LOOP_BY options are INIT, VALID, RETRO, and REALTIME
# If set to INIT or RETRO:
#   INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set
# If set to VALID or REALTIME:
#   VALID_TIME_FMT, VALID_BEG, VALID_END, and VALID_INCREMENT must also be set
# LEAD_SEQ is the list of forecast leads to process
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#timing-control
###

LOOP_BY = VALID
VALID_TIME_FMT = %Y%m%d%H%M
VALID_BEG = 202505281800
VALID_END = 202505291800
VALID_INCREMENT = 6H

INIT_SEQ = 0, 6, 12, 18
LEAD_SEQ_MIN = 6
LEAD_SEQ_MAX = 24


# Data Ingest Settings
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

DATA_INGEST_1_INPUT_TEMPLATE = https://dtcenter.ucar.edu/dfiles/code/METplus/DataIngest_input/MADIS/metar/{valid?fmt=%Y%m%d_%H%M}.nc
DATA_INGEST_1_OUTPUT_TEMPLATE = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/data_ingest/MADIS/metar/{valid?fmt=%Y%m%d_%H%M}.nc
DATA_INGEST_1_SKIP_IF_OUTPUT_EXISTS = True
DATA_INGEST_1_AUTO_DECOMPRESS = False


# Common Settings for Point-Stat
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

FCST_POINT_STAT_INPUT_DIR = {INPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/HRRR
FCST_POINT_STAT_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/hrrr_wrfsfc_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.grib2

OBS_POINT_STAT_INPUT_DIR =
OBS_POINT_STAT_INPUT_TEMPLATE = PYTHON_NUMPY= {PARM_BASE}/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/convert_madis_sfc_rh_wind.py {DATA_INGEST_1_OUTPUT_TEMPLATE}


###
# PointStat Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#pointstat
###

POINT_STAT_CONFIG_FILE ={PARM_BASE}/met_config/PointStatConfig_wrapped

POINT_STAT_INTERP_TYPE_METHOD = BILIN
POINT_STAT_INTERP_TYPE_WIDTH = 2

POINT_STAT_OUTPUT_FLAG_CTC = STAT
POINT_STAT_OUTPUT_FLAG_CTS = STAT
POINT_STAT_OUTPUT_FLAG_MPR = STAT

MODEL = HRRR
OBTYPE = MADIS

POINT_STAT_MESSAGE_TYPE = ADPSFC

OBS_POINT_STAT_WINDOW_BEGIN = -1800
OBS_POINT_STAT_WINDOW_END = 1800


# Common Settings for Stat-Analysis
###
# StatAnalysis Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis
###

STAT_ANALYSIS_CONFIG_FILE = {PARM_BASE}/met_config/STATAnalysisConfig_wrapped

MODEL1 = HRRR
MODEL1_OBTYPE = ADPSFC

MODEL_LIST = {MODEL1}
GROUP_LIST_ITEMS =
LOOP_LIST_ITEMS = MODEL_LIST

STAT_ANALYSIS_JOB1 = -job aggregate_stat -line_type CTC -out_line_type CTS -by FCST_VAR,FCST_THRESH,VX_MASK,FCST_LEAD -out_stat [out_stat_file]_separate_leads_allValidHours_CTS.stat
STAT_ANALYSIS_JOB2 = -job aggregate_stat -line_type CTC -out_line_type CTS -by FCST_VAR,FCST_THRESH,VX_MASK,FCST_VALID_BEG -out_stat [out_stat_file]_all_leads_separateValidHours_CTS.stat
STAT_ANALYSIS_JOB3 = -job aggregate_stat -line_type CTC -out_line_type CTS -by FCST_VAR,FCST_THRESH,VX_MASK -out_stat [out_stat_file]_all_leads_allValidHours_CTS.stat


[Hanford_CWA]
# Hanford CWA Mask Settings
# Only needs to be run once so editing the timing information
INIT_SEQ = 18
LEAD_SEQ_MIN = 0
LEAD_SEQ_MAX = 0
VALID_END = {VALID_BEG}


###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

GEN_VX_MASK_INPUT_DIR = {INPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/HRRR
GEN_VX_MASK_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/hrrr_wrfsfc_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.grib2

GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/Hanford_CWA
GEN_VX_MASK_INPUT_MASK_TEMPLATE = w_18mr25.shp

GEN_VX_MASK_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks
GEN_VX_MASK_OUTPUT_TEMPLATE = Hanford_CWA_mask.nc


###
# GenVxMask Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask
###

GEN_VX_MASK_OPTIONS = -type shape -shape_str CWA HNX -name Hanford_CWA


[RH_mask_15]
# Settings to create the RH <= 15% masks for each time
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

GEN_VX_MASK_INPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks
GEN_VX_MASK_INPUT_TEMPLATE = Hanford_CWA_mask.nc

GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/HRRR
GEN_VX_MASK_INPUT_MASK_TEMPLATE = {init?fmt=%Y%m%d%H}/hrrr_wrfsfc_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.grib2

GEN_VX_MASK_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks/RH_15
GEN_VX_MASK_OUTPUT_TEMPLATE = RH_mask_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.nc


###
# GenVxMask Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask
###

GEN_VX_MASK_OPTIONS = -type data -mask_field 'name="RH"; level="Z2";' -thresh 'le 15' -intersection


[RH_mask_10]
# Settings to create the RH <= 10% masks for each time
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

GEN_VX_MASK_INPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks
GEN_VX_MASK_INPUT_TEMPLATE = Hanford_CWA_mask.nc

GEN_VX_MASK_INPUT_MASK_DIR = {INPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/HRRR
GEN_VX_MASK_INPUT_MASK_TEMPLATE = {init?fmt=%Y%m%d%H}/hrrr_wrfsfc_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.grib2

GEN_VX_MASK_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks/RH_10
GEN_VX_MASK_OUTPUT_TEMPLATE = RH_mask_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.nc


###
# GenVxMask Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#genvxmask
###
#
GEN_VX_MASK_OPTIONS = -type data -mask_field 'name="RH"; level="Z2";' -thresh 'le 10' -intersection


[Separate_Variables]
# Settings to run PointStat and StatAnalysis for each individual variable
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/PointStat/Individual_Variables
POINT_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}

MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {POINT_STAT_OUTPUT_DIR}
STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/StatAnalysis/Individual_Variables
MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE = {model?fmt=%s}_MADIS_{fcst_valid_beg?fmt=%Y%m%d%H}_{fcst_valid_end?fmt=%Y%m%d%H}
MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = {MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE}


###
# PointStat Field Info
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info
###

FCST_POINT_STAT_VAR1_NAME = WIND
FCST_POINT_STAT_VAR1_LEVELS = Z10
FCST_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR1_THRESH = ge15, ge25
OBS_POINT_STAT_VAR1_NAME = WIND
OBS_POINT_STAT_VAR1_LEVELS = Z10
OBS_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR1_THRESH = ge15, ge25

FCST_POINT_STAT_VAR2_NAME = GUST
FCST_POINT_STAT_VAR2_LEVELS = L0
FCST_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR2_THRESH = ge25, ge35
OBS_POINT_STAT_VAR2_NAME = GUST
OBS_POINT_STAT_VAR2_LEVELS = L0
OBS_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR2_THRESH = ge25, ge35

FCST_POINT_STAT_VAR3_NAME = RH
FCST_POINT_STAT_VAR3_LEVELS = Z2
FCST_POINT_STAT_VAR3_THRESH = le10, le15
OBS_POINT_STAT_VAR3_NAME = RH
OBS_POINT_STAT_VAR3_LEVELS = Z2
OBS_POINT_STAT_VAR3_THRESH = le10, le15

POINT_STAT_MASK_GRID = 
POINT_STAT_MASK_POLY = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks/Hanford_CWA_mask.nc


###
# StatAnalysis Settings
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#statanalysis
###
# Omit the second 2 jobs so that we can easily create the reformatted data for plotting
STAT_ANALYSIS_JOB2 =
STAT_ANALYSIS_JOB3 = 


[Combined_rh15]
# Settings to run PointStat and StatAnalysis for Wind using the RH <=15 mask
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/PointStat/RH_15
POINT_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}

MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {POINT_STAT_OUTPUT_DIR}
STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/StatAnalysis/RH_15
MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE = {model?fmt=%s}_MADIS_RH15_wind25_gust35_{fcst_valid_beg?fmt=%Y%m%d%H}_{fcst_valid_end?fmt=%Y%m%d%H}
MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = {MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE}


###
# PointStat Field Info
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info
###

FCST_POINT_STAT_VAR1_NAME = WIND
FCST_POINT_STAT_VAR1_LEVELS = Z10
FCST_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR1_THRESH = ge25
OBS_POINT_STAT_VAR1_NAME = WIND
OBS_POINT_STAT_VAR1_LEVELS = Z10
OBS_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR1_THRESH = ge25

FCST_POINT_STAT_VAR2_NAME = GUST
FCST_POINT_STAT_VAR2_LEVELS = L0
FCST_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR2_THRESH = ge35
OBS_POINT_STAT_VAR2_NAME = GUST
OBS_POINT_STAT_VAR2_LEVELS = L0
OBS_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR2_THRESH = ge35

POINT_STAT_MASK_GRID =
POINT_STAT_VERIFICATION_MASK_TEMPLATE = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks/RH_15/RH_mask_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.nc


[Combined_rh10]
# Settings to run PointStat and StatAnalysis for Wind using the RH <=10 mask
###
# File I/O
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#directory-and-filename-template-info
###

POINT_STAT_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/PointStat/RH_10
POINT_STAT_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}

MODEL1_STAT_ANALYSIS_LOOKIN_DIR = {POINT_STAT_OUTPUT_DIR}
STAT_ANALYSIS_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/StatAnalysis/RH_10
MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE = {model?fmt=%s}_MADIS_RH10_wind15_gust25_{fcst_valid_beg?fmt=%Y%m%d%H}_{fcst_valid_end?fmt=%Y%m%d%H}
MODEL1_STAT_ANALYSIS_DUMP_ROW_TEMPLATE = {MODEL1_STAT_ANALYSIS_OUT_STAT_TEMPLATE}


###
# PointStat Field Info
# https://metplus.readthedocs.io/en/latest/Users_Guide/systemconfiguration.html#field-info
###

FCST_POINT_STAT_VAR1_NAME = WIND
FCST_POINT_STAT_VAR1_LEVELS = Z10
FCST_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR1_THRESH = ge15
OBS_POINT_STAT_VAR1_NAME = WIND
OBS_POINT_STAT_VAR1_LEVELS = Z10
OBS_POINT_STAT_VAR1_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR1_THRESH = ge15

FCST_POINT_STAT_VAR2_NAME = GUST
FCST_POINT_STAT_VAR2_LEVELS = L0
FCST_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
FCST_POINT_STAT_VAR2_THRESH = ge25
OBS_POINT_STAT_VAR2_NAME = GUST
OBS_POINT_STAT_VAR2_LEVELS = L0
OBS_POINT_STAT_VAR2_OPTIONS = convert(x) = x * (3600/1609.34);
OBS_POINT_STAT_VAR2_THRESH = ge25

POINT_STAT_MASK_GRID =
POINT_STAT_VERIFICATION_MASK_TEMPLATE = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/VxMasks/RH_10/RH_mask_{init?fmt=%Y%m%d%H}_f{lead?fmt=%HHH}.nc


[reformat_CTS]
###
# UserScript Settings to reformat the CTS linetype
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript
###

USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE
USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/reformat_linetype.py {PARM_BASE}/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/reformat_CTS.yaml


[performance_diagram]
###
# UserScript Settings to create a performance diagram
# https://metplus.readthedocs.io/en/latest/Users_Guide/wrappers.html#userscript
###

USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE
USER_SCRIPT_COMMAND = {PARM_BASE}/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/plot_performance_diagram.py


[user_env_vars]
# This section contains some needed variables for the reformatting and plotting
# Paths to METdataio, METcalcpy, and METplotpy as needed for the use case
METDATAIO_BASE = {METPLUS_BASE}/../METdataio
METCALCPY_BASE = {METPLUS_BASE}/../METcalcpy
METPLOTPY_BASE = {METPLUS_BASE}/../METplotpy
PYTHONPATH = {METDATAIO_BASE}:{METDATAIO_BASE}/METdbLoad:{METDATAIO_BASE}/METdbLoad/ush:{METDATAIO_BASE}/METreformat:{METCALCPY_BASE}:{METCALCPY_BASE}/metcalcpy:{METPLOTPY_BASE}:{METPLOTPY_BASE}/metplotpy/plots


###
# Settings for the reformatting of the CTS linetype, which will be later used for plotting
### 
# Input directory where the .stat files you need to reformat are located 
REFORMAT_CTS_INPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/StatAnalysis/Individual_Variables

# Output directory to store the reformatted data
REFORMAT_CTS_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/reformatted

# Name of the output file containing reformatted data
REFORMAT_CTS_OUTPUT_FILENAME = reformat_CTS_leads.data

# Line type to reformat
# Currently support FHO, CTC, CTS, CNT, SL1L2, VL1L2, PCT, MCTC, VCNT, ECNT, RHIST, TCDiag, and MPR line types
REFORMAT_CTS_LINETYPE = CTS


###
# Settings for creating the Performance Diagram plots
###
# Directory where the YAML configurations for plotting are located
PERF_DIAGRAM_YAML_CONFIG_DIR = {PARM_BASE}/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire

# YAML Configuration file list
PERF_DIAGRAM_YAML_CONFIG_FILE_LIST = performance_diagram_wind_leads.yaml, performance_diagram_rh_leads.yaml

# Directory where input files are located
PERF_DIAGRAM_STAT_INPUT_DIR = {REFORMAT_CTS_OUTPUT_DIR}

# Input files with RH and wind to use for plotting
# Needs to have the same number of elements as PERF_DIAGRAM_YAML_CONFIG_FILE_LIST
PERF_DIAGRAM_STAT_INPUT_FILES = reformat_CTS_leads.data, reformat_CTS_leads.data

# Output directory for plots
PERF_DIAGRAM_OUTPUT_DIR = {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/plots

# Log file for the plotting
PERF_DIAGRAM_LOG_FILENAME = {LOG_DIR}/perf_diagram_plotting.log

MET Configuration

METplus sets environment variables based on user settings in the METplus configuration file. See How METplus controls MET config file settings for more details.

YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!

If there is a setting in the MET configuration file that is currently not supported by METplus you’d like to control, please refer to: Overriding Unsupported MET config file settings

PointStatConfig_wrapped
////////////////////////////////////////////////////////////////////////////////
//
// Point-Stat configuration file.
//
// For additional information, see the MET_BASE/config/README file.
//
////////////////////////////////////////////////////////////////////////////////

//
// Output model name to be written
//
// model =
${METPLUS_MODEL}

//
// Output description to be written
// May be set separately in each "obs.field" entry
//
// desc =
${METPLUS_DESC}

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

//
// Verification grid
//
// regrid = {
${METPLUS_REGRID_DICT}

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

//
// May be set separately in each "field" entry
//
censor_thresh = [];
censor_val    = [];
cat_thresh    = [ NA ];
cnt_thresh    = [ NA ];
cnt_logic     = UNION;
wind_thresh   = [ NA ];
wind_logic    = UNION;
eclv_points   = 0.05;
//hss_ec_value =
${METPLUS_HSS_EC_VALUE}
rank_corr_flag = FALSE;

//
// Forecast and observation fields to be verified
//
fcst = {
  ${METPLUS_FCST_FILE_TYPE}
  //field = [
  ${METPLUS_FCST_FIELD}
  ${METPLUS_FCST_CLIMO_MEAN_DICT}
  ${METPLUS_FCST_CLIMO_STDEV_DICT}
}

obs = {
  ${METPLUS_OBS_FILE_TYPE}
  //field = [
  ${METPLUS_OBS_FIELD}
  ${METPLUS_OBS_CLIMO_MEAN_DICT}
  ${METPLUS_OBS_CLIMO_STDEV_DICT}
}
////////////////////////////////////////////////////////////////////////////////

//
// Point observation filtering options
// May be set separately in each "obs.field" entry
//
// message_type =
${METPLUS_MESSAGE_TYPE}
sid_exc        = [];

//obs_quality_inc =
${METPLUS_OBS_QUALITY_INC}

//obs_quality_exc =
${METPLUS_OBS_QUALITY_EXC}

//duplicate_flag =
${METPLUS_DUPLICATE_FLAG}

//obs_summary =
${METPLUS_OBS_SUMMARY}

//obs_perc_value =
${METPLUS_OBS_PERC_VALUE}

//
// Mapping of message type group name to comma-separated list of values.
//
//message_type_group_map =
${METPLUS_MESSAGE_TYPE_GROUP_MAP}

//obtype_as_group_val_flag =
${METPLUS_OBTYPE_AS_GROUP_VAL_FLAG}

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

//
// Climatology data
//
//climo_mean = {
${METPLUS_CLIMO_MEAN_DICT}


//climo_stdev = {
${METPLUS_CLIMO_STDEV_DICT}

//
// May be set separately in each "obs.field" entry
//
//climo_cdf = {
${METPLUS_CLIMO_CDF_DICT}

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

//
// Land/Sea mask
// For LANDSF message types, only use forecast grid points where land = TRUE.
// For WATERSF message types, only use forecast grid points where land = FALSE.
// land_mask.flag may be set separately in each "obs.field" entry.
//
//land_mask = {
${METPLUS_LAND_MASK_DICT}

//
// Topography
// For SURFACE message types, only use observations where the topo - station
// elevation difference meets the use_obs_thresh threshold.
// For the observations kept, when interpolating forecast data to the
// observation location, only use forecast grid points where the topo - station
// difference meets the interp_fcst_thresh threshold.
// topo_mask.flag may be set separately in each "obs.field" entry.
//
//topo_mask = {
${METPLUS_TOPO_MASK_DICT}

//lapse_rate_correction = {
${METPLUS_LAPSE_RATE_CORRECTION_DICT}

//msl_agl_conversion = {
${METPLUS_MSL_AGL_CONVERSION_DICT}

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

//
// Point observation time window
//
// obs_window = {
${METPLUS_OBS_WINDOW_DICT}

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

//
// Verification masking regions
//
//mask = {
${METPLUS_MASK_DICT}

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

//
// Confidence interval settings
//
ci_alpha  = [ 0.05 ];

boot = {
   interval = PCTILE;
   rep_prop = 1.0;
   n_rep    = 0;
   rng      = "mt19937";
   seed     = "";
}

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

//
// Interpolation methods
//
//interp = {
${METPLUS_INTERP_DICT}

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

//
// HiRA verification method
//
//hira = {
${METPLUS_HIRA_DICT}

////////////////////////////////////////////////////////////////////////////////
// Threshold for SEEPS p1 (Probability of being dry)

//seeps_p1_thresh =
${METPLUS_SEEPS_P1_THRESH}

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

//
// Statistical output types
//
//output_flag = {
${METPLUS_OUTPUT_FLAG_DICT}

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

//ugrid_dataset =
${METPLUS_UGRID_DATASET}

//ugrid_max_distance_km =
${METPLUS_UGRID_MAX_DISTANCE_KM}

//ugrid_coordinates_file =
${METPLUS_UGRID_COORDINATES_FILE}

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

//point_weight_flag =
${METPLUS_POINT_WEIGHT_FLAG}

tmp_dir = "${MET_TMP_DIR}";

// output_prefix =
${METPLUS_OUTPUT_PREFIX}
//version        = "V10.0.0";

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

${METPLUS_MET_CONFIG_OVERRIDES}
StatAnalysisConfig_wrapped
////////////////////////////////////////////////////////////////////////////////
//
// STAT-Analysis configuration file.
//
// For additional information, see the MET_BASE/config/README file.
//
////////////////////////////////////////////////////////////////////////////////

//
// Filtering input STAT lines by the contents of each column
//
//model = [
${METPLUS_MODEL}

//desc  = [
${METPLUS_DESC}

//fcst_lead = [
${METPLUS_FCST_LEAD}

//obs_lead  = [
${METPLUS_OBS_LEAD}

//fcst_valid_beg  =
${METPLUS_FCST_VALID_BEG}

//fcst_valid_end  =
${METPLUS_FCST_VALID_END}

fcst_valid_inc  = [];
fcst_valid_exc  = [];

//fcst_valid_hour = [
${METPLUS_FCST_VALID_HOUR}


//obs_valid_beg   =
${METPLUS_OBS_VALID_BEG}

//obs_valid_end   =
${METPLUS_OBS_VALID_END}

obs_valid_inc   = [];
obs_valid_exc   = [];

//obs_valid_hour  = [
${METPLUS_OBS_VALID_HOUR}


//fcst_init_beg   =
${METPLUS_FCST_INIT_BEG}

//fcst_init_end   =
${METPLUS_FCST_INIT_END}

fcst_init_inc   = [];
fcst_init_exc   = [];

//fcst_init_hour  = [
${METPLUS_FCST_INIT_HOUR}


//obs_init_beg    =
${METPLUS_OBS_INIT_BEG}

//obs_init_end    =
${METPLUS_OBS_INIT_END}

obs_init_inc    = [];
obs_init_exc    = [];

//obs_init_hour   = [
${METPLUS_OBS_INIT_HOUR}


//fcst_var = [
${METPLUS_FCST_VAR}
//obs_var  = [
${METPLUS_OBS_VAR}

//fcst_units = [
${METPLUS_FCST_UNITS}
//obs_units  = [
${METPLUS_OBS_UNITS}

//fcst_lev = [
${METPLUS_FCST_LEVEL}
//obs_lev  = [
${METPLUS_OBS_LEVEL}

//obtype = [
${METPLUS_OBTYPE}

//vx_mask = [
${METPLUS_VX_MASK}

//interp_mthd = [
${METPLUS_INTERP_MTHD}

//interp_pnts = [
${METPLUS_INTERP_PNTS}

//fcst_thresh = [
${METPLUS_FCST_THRESH}
//obs_thresh = [
${METPLUS_OBS_THRESH}
//cov_thresh = [
${METPLUS_COV_THRESH}

//alpha = [
${METPLUS_ALPHA}

//line_type = [
${METPLUS_LINE_TYPE}

//column = [
${METPLUS_COLUMN}

//weight = [
${METPLUS_WEIGHT}

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

//
// Array of STAT-Analysis jobs to be performed on the filtered data
//
//jobs = [
${METPLUS_JOBS}

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

//
// Confidence interval settings
//
out_alpha = 0.05;

boot = {
   interval = PCTILE;
   rep_prop = 1.0;
   n_rep    = 0;
   rng      = "mt19937";
   seed     = "";
}

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

//
// WMO mean computation logic
//
wmo_sqrt_stats   = [ "CNT:FSTDEV",  "CNT:OSTDEV",  "CNT:ESTDEV",
                     "CNT:RMSE",    "CNT:RMSFA",   "CNT:RMSOA",
                     "VCNT:FS_RMS", "VCNT:OS_RMS", "VCNT:RMSVE",
                     "VCNT:FSTDEV", "VCNT:OSTDEV" ];

wmo_fisher_stats = [ "CNT:PR_CORR", "CNT:SP_CORR",
                     "CNT:KT_CORR", "CNT:ANOM_CORR" ];

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

//
// Skill score index options
//
//ss_index_name =
${METPLUS_SS_INDEX_NAME}
//ss_index_vld_thresh =
${METPLUS_SS_INDEX_VLD_THRESH}

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

//hss_ec_value =
${METPLUS_HSS_EC_VALUE}
rank_corr_flag = FALSE;
vif_flag       = FALSE;

tmp_dir = "${MET_TMP_DIR}";

//version        = "V10.0";

${METPLUS_MET_CONFIG_OVERRIDES}

Python Embedding

This use case calls a Python embedding script to read the MADIS data. While the MADIS data would run through MET after calling madis2nc, in this case, the Python embedding script is used to calculate relative humidity, which is needed for the Red Flag Criteria but didn’t exist in the MADIS data. The script is /parm/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire/convert_madis_sfc_rh_wind.py

convert_madis_sfc_rh_wind.py
#!/usr/bin/env python3

import sys
import netCDF4
from datetime import datetime
from metpy.calc import wind_components,relative_humidity_from_dewpoint,altimeter_to_station_pressure
from metpy.units import units


# Get Arguments
if len(sys.argv) != 2:
    print("ERROR: Must supply input file to script")
    sys.exit(1)

# read input data
infile = sys.argv[1]

var_list = ['WIND','GUST','RH']

# Read the file
ncin = netCDF4.Dataset(infile)

# Read in latitude, longitude, and elevation
lat_arr = ncin['latitude'][:]
lon_arr = ncin['longitude'][:]
elev_arr = ncin['elevation'][:]

dlen = len(lat_arr)

# Read in the station and time
station = ncin['stationName'][:]
timevar = ncin['timeObs']
timevar_cftime = netCDF4.num2date(timevar[:],timevar.units)
valid_time = [datetime.strftime(datetime(tv.year, tv.month, tv.day, tv.hour, tv.minute, tv.second), '%Y%m%d_%H%M%S') for tv in timevar_cftime]

# Set up output data list
point_data = []

# Read in or calculate variable
for var in var_list:
    if var == 'WIND':
        outvar = ncin['windSpeed'][:]
        var_lvl = 10
        var_qc = ncin['windSpeedDD'][:]

    elif var == 'GUST':
        outvar = ncin['windGust'][:]
        var_lvl = 10
        var_qc = ncin['windGustDD'][:]

    elif var == 'RH':
        tmp = ncin['temperature'][:]
        tmp_units = ncin['temperature'].units
        dpt = ncin['dewpoint'][:]
        dpt_units = ncin['dewpoint'].units

        # Add Units
        tmp = units.Quantity(tmp,tmp_units)
        dpt = units.Quantity(dpt,dpt_units)

        # Calculate RH
        rhcalc = relative_humidity_from_dewpoint(tmp,dpt).to('percent')
        outvar = rhcalc.magnitude
        var_lvl = 2
        var_qc = ncin['dewpointDD'][:]

    else:
        # No support for selected variable
        # Error with message
        raise NameError(f'Variable {var} not currently supported.'
                        ' Use WIND or RH in the input variable list')


    # Create the point_data object MET expects
    for dl in range(dlen):
        cur_qc = var_qc[dl].tobytes().decode('utf-8')
        if (cur_qc != 'Z') and (cur_qc != 'X'):
            cur_valid_time = datetime.strftime(datetime(timevar_cftime[dl].year, timevar_cftime[dl].month, 
                timevar_cftime[dl].day, timevar_cftime[dl].hour, timevar_cftime[dl].minute, 
                timevar_cftime[dl].second), '%Y%m%d_%H%M%S')
            point_data.append(['ADPSFC',station[dl].tobytes().decode('utf-8').split('\x00',1)[0],cur_valid_time,
                lat_arr[dl].item(),lon_arr[dl].item(),elev_arr[dl].item(),var,var_lvl,elev_arr[dl].item(),
                cur_qc,outvar[dl].item()])

User Scripting

There are two Python scripts used in this use case, called using the “UserScript” keyword in the METplus wrappers PROCESS_LIST configuration item. These scripts provide an interface to the functions in the METdataio, METcalcpy, and METplotpy Python modules of METplus. The functions used in these scripts demonstrate reformatting aggregated StatAnalysis output to meet the format required by METcalcpy and METplotpy, and then plotting that reformatted output using functions from METcalcpy and METplotpy.

The first Python script is called reformat_CTS_linetype.py. This script takes the aggregated output CTS linetype from Stat Analysis and reformats it so that the data can be plotted. The script takes an input .yaml file, reformat_CTS.yaml. Environment variables in the yaml file are specified in the [user_env_vars] section of the PointStat_fcstHRRR_obsMADIS_FrazierFire.conf METplus configuration file.

The second Python script is plot_performance_diagram.py. This script creates performance diagrams for wind and relative humidity. Some input variables to the script are set in the [user_env_vars] section of the PointStat_fcstHRRR_obsMADIS_FrazierFire.conf METplus configuration file.

For more information about YAML configuration options for the Performance Diagram plots, see the METplotpy Performance Diagram plot documentation.

Both Python scripts are located at:

parm/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire
reformat_linetype.py
#!/usr/bin/env python3


import os
import sys
import time
import logging

from METdbLoad.ush.read_data_files import ReadDataFiles
from METdbLoad.ush.read_load_xml import XmlLoadFile
from METreformat.write_stat_ascii import WriteStatAscii
from metcalcpy.util import read_env_vars_in_config as readconfig


logger = logging.getLogger(__name__)

def main():

    if len(sys.argv) == 2:
        input_config_file = sys.argv[1]
    else:
        print("Must specify exactly one input yaml configuration file.")
        sys.exit(1)

    # Read in the YAML configuration file.  Environment variables in the 
    # configuration file are supported.
    #input_cnt_config_file = os.getenv(input_yaml_file, "reformat_VCNT.yaml")
    settings = readconfig.parse_config(input_config_file)
    logging.info(settings)

    # Replacing the need for an XML specification file, pass in the XMLLoadFile and
    # ReadDataFile parameters
    rdf_obj: ReadDataFiles = ReadDataFiles()
    xml_loadfile_obj: XmlLoadFile = XmlLoadFile(None)

    # Retrieve all the filenames in the data_dir specified in the YAML config file
    load_files = xml_loadfile_obj.filenames_from_template(settings['input_data_dir'],{})
    flags = xml_loadfile_obj.flags
    line_types = xml_loadfile_obj.line_types
    beg_read_data = time.perf_counter()
    rdf_obj.read_data(flags, load_files, line_types)
    end_read_data = time.perf_counter()
    time_to_read = end_read_data - beg_read_data
    logger.info("Time to read input .stat data files using METdbLoad: %f", time_to_read)
    file_df = rdf_obj.stat_data

    # Check if the output directory exists.  If not, make it
    if not os.path.exists(settings['output_dir']):
        os.makedirs(settings['output_dir'])

    # Check if the output file already exists, if so, delete it to avoid
    # appending output from subsequent runs into the same file.
    existing_output_file = os.path.join(settings['output_dir'], settings['output_filename'])
    logger.info("Checking if {existing_output_file}  already exists")
    if os.path.exists(existing_output_file):
        logger.info("Removing existing output file {existing_output_file}")
        os.remove(existing_output_file)

    # Write stat file in ASCII format
    stat_lines_obj: WriteStatAscii = WriteStatAscii(settings, logger)
    stat_lines_obj.write_stat_ascii(file_df, settings)


if __name__ == "__main__":
    main()
plot_performance_diagram.py
#!/usr/bin/env python3

import os
from time import perf_counter
import logging
import yaml
import metcalcpy.util.read_env_vars_in_config as readconfig
from metplotpy.plots.performance_diagram import performance_diagram


def main():

    # Read the input files
    yaml_files_str = os.environ['PERF_DIAGRAM_YAML_CONFIG_FILE_LIST'].split(',')
    yaml_files = [yf.lstrip() for yf in yaml_files_str]
    yaml_file_dir = os.environ['PERF_DIAGRAM_YAML_CONFIG_DIR']
    plot_input_dir = os.environ['PERF_DIAGRAM_STAT_INPUT_DIR']
    plot_input_files_list_str = os.environ['PERF_DIAGRAM_STAT_INPUT_FILES'].split(',')
    plot_input_files_list = [pi.lstrip() for pi in plot_input_files_list_str]
    plot_output_dir = os.environ['PERF_DIAGRAM_OUTPUT_DIR']

    # Check to see that the two lists have the same number of elements
    # If they dont', error out
    if len(plot_input_files_list) != len(yaml_files):
        raise RuntimeError('The number of files in PERF_DIAGRAM_STAT_INPUT_FILES must be equal to the number of files in PERF_DIAGRAM_YAML_CONFIG_FILE_LIST')

    # Check to see that the output directory exists
    # If not, make a directory
    if not os.path.exists(plot_output_dir):
        os.makedirs(plot_output_dir)

    # Loop through data
    for f,i in zip(yaml_files,plot_input_files_list):
        os.environ['PERF_DIAGRAM_STAT_INPUT'] = os.path.join(plot_input_dir,i)
        os.environ['PERF_DIAGRAM_YAML_CONFIG_NAME'] = os.path.join(yaml_file_dir,f)

        # Read in the YAML configuration file.  Environment variables in
        # the configuration file are supported.
        try:
            input_config_file = os.getenv("PERF_DIAGRAM_YAML_CONFIG_NAME", "custom_performance_diagram.yaml")
            print(input_config_file)
            settings = readconfig.parse_config(input_config_file)
            logging.info(settings)
        except yaml.YAMLError as exc:
            logging.error(exc)

        start = perf_counter()
        plot = performance_diagram.PerformanceDiagram(settings)
        plot.save_to_file()
        plot.write_output_file()
        end = perf_counter()
        execution_time = end - start
        plot.logger.info(f"Finished creating performance diagram, execution time: {execution_time} seconds")


if __name__ == "__main__":
  main()

Running METplus

Pass the use case configuration file to the run_metplus.py script along with any user-specific system configuration files if desired:

run_metplus.py /path/to/METplus/parm/use_cases/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire.conf /path/to/user_system.conf

See Running METplus for more information.

Expected Output

A successful run will output the following both to the screen and to the logfile:

INFO: METplus has successfully finished running.

Refer to the value set for OUTPUT_BASE to find where the output data was generated. Output for this use case will be found in {OUTPUT_BASE}/model_applications/fire/PointStat_fcstHRRR_obsMADIS_FrazierFire. There will be 6 directories of output, data_ingest, VxMasks, PointStat, StatAnalysis, reformatted, and plots. The data_ingest directory contains the observation data that has been downloaded and will contain one subdirectory, MADIS/metar. That directory will contain a number of files:

* 20250528_1800.nc
* 20250529_0000.nc
* 20250529_0600.nc
* 20250529_1200.nc
* 20250529_1800.nc
* 20250530_0000.nc
* 20250530_0600.nc
* 20250530_1200.nc
* 20250530_1800.nc

The output from Gen-Vx-Mask will be in the VxMasks directory. The VxMasks directory contains the Hanford CWA mask:

* Hanford_CWA_mask.nc

It also contains the relative humidity masks using thresholds of 10% and 15% these are in directories RH_10 and RH_15. There is one mask for each time run, with the following format:

* RH_mask_YYYYMMDDHH_fHHH.nc

Where the YYYYMMDDHH is the year, month, day, and hour of the model initialization time, and HHH is the forecast lead time. There should be 20 files in both the RH_10 and RH_15 directories.

The output from Point-Stat will contain 3 directories, Individual_Variables, RH_10, and RH_16. Each of these directories will contain sub-directories labeled with the model initializaiton time in YYYYMMDDHH. There should be 20 files total output for each Point-Stat directory. The files have the following format:

* point_stat_HHMMSSL_YYYYMMDD_HHMMSSV.stat

Where HHMMSSL is the hour, minute, and second of the forecast lead time, YYYYMMDD is the valid year, month, and day, and HHMMSSV is the hour, minute, and second of the valid time.

The output from Stat-Analysis has the same three directories as are output from Point-Stat, Individual_Variables, RH_10, and RH_15. The Individual_Variables directory contains 1 file:

* HRRR_MADIS_2025052818_2025052918_separate_leads_allValidHours_CTS.stat

The RH_10 directory contains 3 files:

* HRRR_MADIS_RH10_wind15_gust25_2025052818_2025052918_all_leads_allValidHours_CTS.stat
* HRRR_MADIS_RH10_wind15_gust25_2025052818_2025052918_all_leads_separateValidHours_CTS.stat
* HRRR_MADIS_RH10_wind15_gust25_2025052818_2025052918_separate_leads_allValidHours_CTS.stat

The RH_15 directory also contains 3 files:

* HRRR_MADIS_RH15_wind25_gust35_2025052818_2025052918_all_leads_allValidHours_CTS.stat
* HRRR_MADIS_RH15_wind25_gust35_2025052818_2025052918_all_leads_separateValidHours_CTS.stat
* HRRR_MADIS_RH15_wind25_gust35_2025052818_2025052918_separate_leads_allValidHours_CTS.stat

Output from the 2 UserScripts are in 2 directories, reformatted and plots. The reformatted directory contains 1 file:

* reformat_CTS_leads.data

The plots directory contains 2 plots:

* performance_diagram_rh_lead.png
* performance_diagram_wind_lead.png

Keywords

Note

  • FireAppUseCase

  • DataIngestUseCase

  • PointStatToolUseCase

  • GenVxMaskToolUseCase

  • StatAnalysisToolUseCase

  • UserScriptUseCase

  • METdataioUseCase

  • METcalcpyUseCase

  • METplotpyUseCase

  • GRIB2FileUseCase

Navigate to the METplus Quick Search for Use Cases page to discover other similar use cases.

sphinx_gallery_thumbnail_path = ‘_static/fire-PointStat_fcstHRRR_obsMADIS_FrazierFire.png’

Gallery generated by Sphinx-Gallery