diff --git a/metplus/util/config_metplus.py b/metplus/util/config_metplus.py index 5e9b02c07c..507bb3f783 100644 --- a/metplus/util/config_metplus.py +++ b/metplus/util/config_metplus.py @@ -22,7 +22,7 @@ from produtil.config import ProdConfig -from .constants import RUNTIME_CONFS, MISSING_DATA_VALUE +from .constants import RUNTIME_CONFS, MISSING_DATA_VALUE, DEPRECATED_DICT from .string_template_substitution import get_tags, do_string_sub from .string_manip import getlist, remove_quotes, is_python_script from .string_manip import validate_thresholds @@ -90,6 +90,7 @@ # set all loggers to use UTC logging.Formatter.converter = time.gmtime + def setup(args, logger=None, base_confs=None): """!The METplus setup function. @param args list of configuration files or configuration @@ -116,6 +117,7 @@ def setup(args, logger=None, base_confs=None): return config + def _get_default_config_list(parm_base=None): """! Get list of default METplus config files. Look through BASE_CONFS list and check if each file exists under the parm base. Add each to a list @@ -145,6 +147,7 @@ def _get_default_config_list(parm_base=None): return default_config_list + def _parse_launch_args(args, logger): """! Parsed arguments to scripts that launch the METplus wrappers. @@ -210,6 +213,7 @@ def _parse_launch_args(args, logger): return override_list + def launch(config_list): """! Process configuration files and explicit configuration variables overrides. Subsequent configuration files override values in previously @@ -275,6 +279,7 @@ def launch(config_list): return config + def _set_logvars(config, logger=None): """!Sets and adds the LOG_METPLUS and LOG_TIMESTAMP to the config object. If LOG_METPLUS was already defined by the @@ -339,6 +344,7 @@ def _set_logvars(config, logger=None): # expand LOG_METPLUS to ensure it is available config.set('config', 'LOG_METPLUS', metpluslog) + def get_logger(config, sublog=None): """!This function will return a logger with a formatted file handler for writing to the LOG_METPLUS and it sets the LOG_LEVEL. If LOG_METPLUS is @@ -414,6 +420,7 @@ def get_logger(config, sublog=None): config.logger = logger return logger + def replace_config_from_section(config, section, required=True): """! Check if config has a section named [section] If it does, create a new METplusConfig object, set each value from the input config, then @@ -460,6 +467,7 @@ def replace_config_from_section(config, section, required=True): return new_config + class METplusConfig(ProdConfig): """! Configuration class to store configuration values read from METplus config files. @@ -937,6 +945,7 @@ def format(self, record): return output + def validate_configuration_variables(config, force_check=False): all_sed_cmds = [] @@ -965,6 +974,7 @@ def validate_configuration_variables(config, force_check=False): return deprecated_isOK, field_isOK, inoutbase_isOK, deprecatedMET_isOK, all_sed_cmds + def check_for_deprecated_config(config): """!Checks user configuration files and reports errors or warnings if any deprecated variable is found. If an alternate variable name can be suggested, add it to the 'alt' section @@ -976,259 +986,6 @@ def check_for_deprecated_config(config): if it is not correct, the 2nd item is a list of sed commands that can be run to help fix the incorrect configuration variables """ - - # key is the name of the depreacted variable that is no longer allowed in any config files - # value is a dictionary containing information about what to do with the deprecated config - # 'sec' is the section of the config file where the replacement resides, i.e. config, dir, - # filename_templates - # 'alt' is the alternative name for the deprecated config. this can be a single variable name or - # text to describe multiple variables or how to handle it. Set to None to tell the user to - # just remove the variable - # 'copy' is an optional item (defaults to True). set this to False if one cannot simply replace - # the deprecated config variable name with the value in 'alt' - # 'req' is an optional item (defaults to True). this to False to report a warning for the - # deprecated config and allow execution to continue. this is generally no longer used - # because we are requiring users to update the config files. if used, the developer must - # modify the code to handle both variables accordingly - deprecated_dict = { - 'LOOP_BY_INIT' : {'sec' : 'config', 'alt' : 'LOOP_BY', 'copy': False}, - 'PREPBUFR_DIR_REGEX' : {'sec' : 'regex_pattern', 'alt' : None}, - 'PREPBUFR_FILE_REGEX' : {'sec' : 'regex_pattern', 'alt' : None}, - 'OBS_INPUT_DIR_REGEX' : {'sec' : 'regex_pattern', 'alt' : 'OBS_POINT_STAT_INPUT_DIR', 'copy': False}, - 'FCST_INPUT_DIR_REGEX' : {'sec' : 'regex_pattern', 'alt' : 'FCST_POINT_STAT_INPUT_DIR', 'copy': False}, - 'FCST_INPUT_FILE_REGEX' : - {'sec' : 'regex_pattern', 'alt' : 'FCST_POINT_STAT_INPUT_TEMPLATE', 'copy': False}, - 'OBS_INPUT_FILE_REGEX' : {'sec' : 'regex_pattern', 'alt' : 'OBS_POINT_STAT_INPUT_TEMPLATE', 'copy': False}, - 'PREPBUFR_DATA_DIR' : {'sec' : 'dir', 'alt' : 'PB2NC_INPUT_DIR'}, - 'PREPBUFR_MODEL_DIR_NAME' : {'sec' : 'dir', 'alt' : 'PB2NC_INPUT_DIR', 'copy': False}, - 'OBS_INPUT_FILE_TMPL' : - {'sec' : 'filename_templates', 'alt' : 'OBS_POINT_STAT_INPUT_TEMPLATE'}, - 'FCST_INPUT_FILE_TMPL' : - {'sec' : 'filename_templates', 'alt' : 'FCST_POINT_STAT_INPUT_TEMPLATE'}, - 'NC_FILE_TMPL' : {'sec' : 'filename_templates', 'alt' : 'PB2NC_OUTPUT_TEMPLATE'}, - 'FCST_INPUT_DIR' : {'sec' : 'dir', 'alt' : 'FCST_POINT_STAT_INPUT_DIR'}, - 'OBS_INPUT_DIR' : {'sec' : 'dir', 'alt' : 'OBS_POINT_STAT_INPUT_DIR'}, - 'REGRID_TO_GRID' : {'sec' : 'config', 'alt' : 'POINT_STAT_REGRID_TO_GRID'}, - 'FCST_HR_START' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'FCST_HR_END' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'FCST_HR_INTERVAL' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'START_DATE' : {'sec' : 'config', 'alt' : 'INIT_BEG or VALID_BEG', 'copy': False}, - 'END_DATE' : {'sec' : 'config', 'alt' : 'INIT_END or VALID_END', 'copy': False}, - 'INTERVAL_TIME' : {'sec' : 'config', 'alt' : 'INIT_INCREMENT or VALID_INCREMENT', 'copy': False}, - 'BEG_TIME' : {'sec' : 'config', 'alt' : 'INIT_BEG or VALID_BEG', 'copy': False}, - 'END_TIME' : {'sec' : 'config', 'alt' : 'INIT_END or VALID_END', 'copy': False}, - 'START_HOUR' : {'sec' : 'config', 'alt' : 'INIT_BEG or VALID_BEG', 'copy': False}, - 'END_HOUR' : {'sec' : 'config', 'alt' : 'INIT_END or VALID_END', 'copy': False}, - 'OBS_BUFR_VAR_LIST' : {'sec' : 'config', 'alt' : 'PB2NC_OBS_BUFR_VAR_LIST'}, - 'TIME_SUMMARY_FLAG' : {'sec' : 'config', 'alt' : 'PB2NC_TIME_SUMMARY_FLAG'}, - 'TIME_SUMMARY_BEG' : {'sec' : 'config', 'alt' : 'PB2NC_TIME_SUMMARY_BEG'}, - 'TIME_SUMMARY_END' : {'sec' : 'config', 'alt' : 'PB2NC_TIME_SUMMARY_END'}, - 'TIME_SUMMARY_VAR_NAMES' : {'sec' : 'config', 'alt' : 'PB2NC_TIME_SUMMARY_VAR_NAMES'}, - 'TIME_SUMMARY_TYPE' : {'sec' : 'config', 'alt' : 'PB2NC_TIME_SUMMARY_TYPE'}, - 'OVERWRITE_NC_OUTPUT' : {'sec' : 'config', 'alt' : 'PB2NC_SKIP_IF_OUTPUT_EXISTS', 'copy': False}, - 'VERTICAL_LOCATION' : {'sec' : 'config', 'alt' : 'PB2NC_VERTICAL_LOCATION'}, - 'VERIFICATION_GRID' : {'sec' : 'config', 'alt' : 'REGRID_DATA_PLANE_VERIF_GRID'}, - 'WINDOW_RANGE_BEG' : {'sec' : 'config', 'alt' : 'OBS_WINDOW_BEGIN'}, - 'WINDOW_RANGE_END' : {'sec' : 'config', 'alt' : 'OBS_WINDOW_END'}, - 'OBS_EXACT_VALID_TIME' : - {'sec' : 'config', 'alt' : 'OBS_WINDOW_BEGIN and OBS_WINDOW_END', 'copy': False}, - 'FCST_EXACT_VALID_TIME' : - {'sec' : 'config', 'alt' : 'FCST_WINDOW_BEGIN and FCST_WINDOW_END', 'copy': False}, - 'PCP_COMBINE_METHOD' : - {'sec' : 'config', 'alt' : 'FCST_PCP_COMBINE_METHOD and/or OBS_PCP_COMBINE_METHOD', 'copy': False}, - 'FHR_BEG' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'FHR_END' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'FHR_INC' : {'sec' : 'config', 'alt' : 'LEAD_SEQ', 'copy': False}, - 'FHR_GROUP_BEG' : {'sec' : 'config', 'alt' : 'LEAD_SEQ_[N]', 'copy': False}, - 'FHR_GROUP_END' : {'sec' : 'config', 'alt' : 'LEAD_SEQ_[N]', 'copy': False}, - 'FHR_GROUP_LABELS' : {'sec' : 'config', 'alt' : 'LEAD_SEQ_[N]_LABEL', 'copy': False}, - 'CYCLONE_OUT_DIR' : {'sec' : 'dir', 'alt' : 'CYCLONE_OUTPUT_DIR'}, - 'ENSEMBLE_STAT_OUT_DIR' : {'sec' : 'dir', 'alt' : 'ENSEMBLE_STAT_OUTPUT_DIR'}, - 'EXTRACT_OUT_DIR' : {'sec' : 'dir', 'alt' : 'EXTRACT_TILES_OUTPUT_DIR'}, - 'GRID_STAT_OUT_DIR' : {'sec' : 'dir', 'alt' : 'GRID_STAT_OUTPUT_DIR'}, - 'MODE_OUT_DIR' : {'sec' : 'dir', 'alt' : 'MODE_OUTPUT_DIR'}, - 'MTD_OUT_DIR' : {'sec' : 'dir', 'alt' : 'MTD_OUTPUT_DIR'}, - 'SERIES_INIT_OUT_DIR' : {'sec' : 'dir', 'alt' : 'SERIES_ANALYSIS_OUTPUT_DIR'}, - 'SERIES_LEAD_OUT_DIR' : {'sec' : 'dir', 'alt' : 'SERIES_ANALYSIS_OUTPUT_DIR'}, - 'SERIES_INIT_FILTERED_OUT_DIR' : - {'sec' : 'dir', 'alt' : 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, - 'SERIES_LEAD_FILTERED_OUT_DIR' : - {'sec' : 'dir', 'alt' : 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, - 'STAT_ANALYSIS_OUT_DIR' : - {'sec' : 'dir', 'alt' : 'STAT_ANALYSIS_OUTPUT_DIR'}, - 'TCMPR_PLOT_OUT_DIR' : {'sec' : 'dir', 'alt' : 'TCMPR_PLOT_OUTPUT_DIR'}, - 'FCST_MIN_FORECAST' : {'sec' : 'config', 'alt' : 'LEAD_SEQ_MIN'}, - 'FCST_MAX_FORECAST' : {'sec' : 'config', 'alt' : 'LEAD_SEQ_MAX'}, - 'OBS_MIN_FORECAST' : {'sec' : 'config', 'alt' : 'OBS_PCP_COMBINE_MIN_LEAD'}, - 'OBS_MAX_FORECAST' : {'sec' : 'config', 'alt' : 'OBS_PCP_COMBINE_MAX_LEAD'}, - 'FCST_INIT_INTERVAL' : {'sec' : 'config', 'alt' : None}, - 'OBS_INIT_INTERVAL' : {'sec' : 'config', 'alt' : None}, - 'FCST_DATA_INTERVAL' : {'sec' : '', 'alt' : 'FCST_PCP_COMBINE_DATA_INTERVAL'}, - 'OBS_DATA_INTERVAL' : {'sec' : '', 'alt' : 'OBS_PCP_COMBINE_DATA_INTERVAL'}, - 'FCST_IS_DAILY_FILE' : {'sec' : '', 'alt' : 'FCST_PCP_COMBINE_IS_DAILY_FILE'}, - 'OBS_IS_DAILY_FILE' : {'sec' : '', 'alt' : 'OBS_PCP_COMBINE_IS_DAILY_FILE'}, - 'FCST_TIMES_PER_FILE' : {'sec' : '', 'alt' : 'FCST_PCP_COMBINE_TIMES_PER_FILE'}, - 'OBS_TIMES_PER_FILE' : {'sec' : '', 'alt' : 'OBS_PCP_COMBINE_TIMES_PER_FILE'}, - 'FCST_LEVEL' : {'sec' : '', 'alt' : 'FCST_PCP_COMBINE_INPUT_ACCUMS', 'copy': False}, - 'OBS_LEVEL' : {'sec' : '', 'alt' : 'OBS_PCP_COMBINE_INPUT_ACCUMS', 'copy': False}, - 'MODE_FCST_CONV_RADIUS' : {'sec' : 'config', 'alt' : 'FCST_MODE_CONV_RADIUS'}, - 'MODE_FCST_CONV_THRESH' : {'sec' : 'config', 'alt' : 'FCST_MODE_CONV_THRESH'}, - 'MODE_FCST_MERGE_FLAG' : {'sec' : 'config', 'alt' : 'FCST_MODE_MERGE_FLAG'}, - 'MODE_FCST_MERGE_THRESH' : {'sec' : 'config', 'alt' : 'FCST_MODE_MERGE_THRESH'}, - 'MODE_OBS_CONV_RADIUS' : {'sec' : 'config', 'alt' : 'OBS_MODE_CONV_RADIUS'}, - 'MODE_OBS_CONV_THRESH' : {'sec' : 'config', 'alt' : 'OBS_MODE_CONV_THRESH'}, - 'MODE_OBS_MERGE_FLAG' : {'sec' : 'config', 'alt' : 'OBS_MODE_MERGE_FLAG'}, - 'MODE_OBS_MERGE_THRESH' : {'sec' : 'config', 'alt' : 'OBS_MODE_MERGE_THRESH'}, - 'MTD_FCST_CONV_RADIUS' : {'sec' : 'config', 'alt' : 'FCST_MTD_CONV_RADIUS'}, - 'MTD_FCST_CONV_THRESH' : {'sec' : 'config', 'alt' : 'FCST_MTD_CONV_THRESH'}, - 'MTD_OBS_CONV_RADIUS' : {'sec' : 'config', 'alt' : 'OBS_MTD_CONV_RADIUS'}, - 'MTD_OBS_CONV_THRESH' : {'sec' : 'config', 'alt' : 'OBS_MTD_CONV_THRESH'}, - 'RM_EXE' : {'sec' : 'exe', 'alt' : 'RM'}, - 'CUT_EXE' : {'sec' : 'exe', 'alt' : 'CUT'}, - 'TR_EXE' : {'sec' : 'exe', 'alt' : 'TR'}, - 'NCAP2_EXE' : {'sec' : 'exe', 'alt' : 'NCAP2'}, - 'CONVERT_EXE' : {'sec' : 'exe', 'alt' : 'CONVERT'}, - 'NCDUMP_EXE' : {'sec' : 'exe', 'alt' : 'NCDUMP'}, - 'EGREP_EXE' : {'sec' : 'exe', 'alt' : 'EGREP'}, - 'ADECK_TRACK_DATA_DIR' : {'sec' : 'dir', 'alt' : 'TC_PAIRS_ADECK_INPUT_DIR'}, - 'BDECK_TRACK_DATA_DIR' : {'sec' : 'dir', 'alt' : 'TC_PAIRS_BDECK_INPUT_DIR'}, - 'MISSING_VAL_TO_REPLACE' : {'sec' : 'config', 'alt' : 'TC_PAIRS_MISSING_VAL_TO_REPLACE'}, - 'MISSING_VAL' : {'sec' : 'config', 'alt' : 'TC_PAIRS_MISSING_VAL'}, - 'TRACK_DATA_SUBDIR_MOD' : {'sec' : 'dir', 'alt' : None}, - 'ADECK_FILE_PREFIX' : {'sec' : 'config', 'alt' : 'TC_PAIRS_ADECK_TEMPLATE', 'copy': False}, - 'BDECK_FILE_PREFIX' : {'sec' : 'config', 'alt' : 'TC_PAIRS_BDECK_TEMPLATE', 'copy': False}, - 'TOP_LEVEL_DIRS' : {'sec' : 'config', 'alt' : 'TC_PAIRS_READ_ALL_FILES'}, - 'TC_PAIRS_DIR' : {'sec' : 'dir', 'alt' : 'TC_PAIRS_OUTPUT_DIR'}, - 'CYCLONE' : {'sec' : 'config', 'alt' : 'TC_PAIRS_CYCLONE'}, - 'STORM_ID' : {'sec' : 'config', 'alt' : 'TC_PAIRS_STORM_ID'}, - 'BASIN' : {'sec' : 'config', 'alt' : 'TC_PAIRS_BASIN'}, - 'STORM_NAME' : {'sec' : 'config', 'alt' : 'TC_PAIRS_STORM_NAME'}, - 'DLAND_FILE' : {'sec' : 'config', 'alt' : 'TC_PAIRS_DLAND_FILE'}, - 'TRACK_TYPE' : {'sec' : 'config', 'alt' : 'TC_PAIRS_REFORMAT_DECK'}, - 'FORECAST_TMPL' : {'sec' : 'filename_templates', 'alt' : 'TC_PAIRS_ADECK_TEMPLATE'}, - 'REFERENCE_TMPL' : {'sec' : 'filename_templates', 'alt' : 'TC_PAIRS_BDECK_TEMPLATE'}, - 'TRACK_DATA_MOD_FORCE_OVERWRITE' : - {'sec' : 'config', 'alt' : 'TC_PAIRS_SKIP_IF_REFORMAT_EXISTS', 'copy': False}, - 'TC_PAIRS_FORCE_OVERWRITE' : {'sec' : 'config', 'alt' : 'TC_PAIRS_SKIP_IF_OUTPUT_EXISTS', 'copy': False}, - 'GRID_STAT_CONFIG' : {'sec' : 'config', 'alt' : 'GRID_STAT_CONFIG_FILE'}, - 'MODE_CONFIG' : {'sec' : 'config', 'alt': 'MODE_CONFIG_FILE'}, - 'FCST_PCP_COMBINE_INPUT_LEVEL': {'sec': 'config', 'alt' : 'FCST_PCP_COMBINE_INPUT_ACCUMS'}, - 'OBS_PCP_COMBINE_INPUT_LEVEL': {'sec': 'config', 'alt' : 'OBS_PCP_COMBINE_INPUT_ACCUMS'}, - 'TIME_METHOD': {'sec': 'config', 'alt': 'LOOP_BY', 'copy': False}, - 'MODEL_DATA_DIR': {'sec': 'dir', 'alt': 'EXTRACT_TILES_GRID_INPUT_DIR'}, - 'STAT_LIST': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_STAT_LIST'}, - 'NLAT': {'sec': 'config', 'alt': 'EXTRACT_TILES_NLAT'}, - 'NLON': {'sec': 'config', 'alt': 'EXTRACT_TILES_NLON'}, - 'DLAT': {'sec': 'config', 'alt': 'EXTRACT_TILES_DLAT'}, - 'DLON': {'sec': 'config', 'alt': 'EXTRACT_TILES_DLON'}, - 'LON_ADJ': {'sec': 'config', 'alt': 'EXTRACT_TILES_LON_ADJ'}, - 'LAT_ADJ': {'sec': 'config', 'alt': 'EXTRACT_TILES_LAT_ADJ'}, - 'OVERWRITE_TRACK': {'sec': 'config', 'alt': 'EXTRACT_TILES_OVERWRITE_TRACK'}, - 'BACKGROUND_MAP': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_BACKGROUND_MAP'}, - 'GFS_FCST_FILE_TMPL': {'sec': 'filename_templates', 'alt': 'FCST_EXTRACT_TILES_INPUT_TEMPLATE'}, - 'GFS_ANLY_FILE_TMPL': {'sec': 'filename_templates', 'alt': 'OBS_EXTRACT_TILES_INPUT_TEMPLATE'}, - 'SERIES_BY_LEAD_FILTERED_OUTPUT_DIR': {'sec': 'dir', 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, - 'SERIES_BY_INIT_FILTERED_OUTPUT_DIR': {'sec': 'dir', 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, - 'SERIES_BY_LEAD_OUTPUT_DIR': {'sec': 'dir', 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, - 'SERIES_BY_INIT_OUTPUT_DIR': {'sec': 'dir', 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, - 'SERIES_BY_LEAD_GROUP_FCSTS': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_GROUP_FCSTS'}, - 'SERIES_ANALYSIS_BY_LEAD_CONFIG_FILE': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_CONFIG_FILE'}, - 'SERIES_ANALYSIS_BY_INIT_CONFIG_FILE': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_CONFIG_FILE'}, - 'ENSEMBLE_STAT_MET_OBS_ERROR_TABLE': {'sec': 'config', 'alt': 'ENSEMBLE_STAT_MET_OBS_ERR_TABLE'}, - 'VAR_LIST': {'sec': 'config', 'alt': 'BOTH_VAR_NAME BOTH_VAR_LEVELS or SERIES_ANALYSIS_VAR_LIST', 'copy': False}, - 'SERIES_ANALYSIS_VAR_LIST': {'sec': 'config', 'alt': 'BOTH_VAR_NAME BOTH_VAR_LEVELS', 'copy': False}, - 'EXTRACT_TILES_VAR_LIST': {'sec': 'config', 'alt': ''}, - 'STAT_ANALYSIS_LOOKIN_DIR': {'sec': 'dir', 'alt': 'MODEL1_STAT_ANALYSIS_LOOKIN_DIR'}, - 'VALID_HOUR_METHOD': {'sec': 'config', 'alt': None}, - 'VALID_HOUR_BEG': {'sec': 'config', 'alt': None}, - 'VALID_HOUR_END': {'sec': 'config', 'alt': None}, - 'VALID_HOUR_INCREMENT': {'sec': 'config', 'alt': None}, - 'INIT_HOUR_METHOD': {'sec': 'config', 'alt': None}, - 'INIT_HOUR_BEG': {'sec': 'config', 'alt': None}, - 'INIT_HOUR_END': {'sec': 'config', 'alt': None}, - 'INIT_HOUR_INCREMENT': {'sec': 'config', 'alt': None}, - 'STAT_ANALYSIS_CONFIG': {'sec': 'config', 'alt': 'STAT_ANALYSIS_CONFIG_FILE'}, - 'JOB_NAME': {'sec': 'config', 'alt': 'STAT_ANALYSIS_JOB_NAME'}, - 'JOB_ARGS': {'sec': 'config', 'alt': 'STAT_ANALYSIS_JOB_ARGS'}, - 'FCST_LEAD': {'sec': 'config', 'alt': 'FCST_LEAD_LIST'}, - 'FCST_VAR_NAME': {'sec': 'config', 'alt': 'FCST_VAR_LIST'}, - 'FCST_VAR_LEVEL': {'sec': 'config', 'alt': 'FCST_VAR_LEVEL_LIST'}, - 'OBS_VAR_NAME': {'sec': 'config', 'alt': 'OBS_VAR_LIST'}, - 'OBS_VAR_LEVEL': {'sec': 'config', 'alt': 'OBS_VAR_LEVEL_LIST'}, - 'REGION': {'sec': 'config', 'alt': 'VX_MASK_LIST'}, - 'INTERP': {'sec': 'config', 'alt': 'INTERP_LIST'}, - 'INTERP_PTS': {'sec': 'config', 'alt': 'INTERP_PTS_LIST'}, - 'CONV_THRESH': {'sec': 'config', 'alt': 'CONV_THRESH_LIST'}, - 'FCST_THRESH': {'sec': 'config', 'alt': 'FCST_THRESH_LIST'}, - 'LINE_TYPE': {'sec': 'config', 'alt': 'LINE_TYPE_LIST'}, - 'STAT_ANALYSIS_DUMP_ROW_TMPL': {'sec': 'filename_templates', 'alt': 'STAT_ANALYSIS_DUMP_ROW_TEMPLATE'}, - 'STAT_ANALYSIS_OUT_STAT_TMPL': {'sec': 'filename_templates', 'alt': 'STAT_ANALYSIS_OUT_STAT_TEMPLATE'}, - 'PLOTTING_SCRIPTS_DIR': {'sec': 'dir', 'alt': 'MAKE_PLOTS_SCRIPTS_DIR'}, - 'STAT_FILES_INPUT_DIR': {'sec': 'dir', 'alt': 'MAKE_PLOTS_INPUT_DIR'}, - 'PLOTTING_OUTPUT_DIR': {'sec': 'dir', 'alt': 'MAKE_PLOTS_OUTPUT_DIR'}, - 'VERIF_CASE': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_CASE'}, - 'VERIF_TYPE': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_TYPE'}, - 'PLOT_TIME': {'sec': 'config', 'alt': 'DATE_TIME'}, - 'MODEL_NAME': {'sec': 'config', 'alt': 'MODEL'}, - 'MODEL_OBS_NAME': {'sec': 'config', 'alt': 'MODEL_OBTYPE'}, - 'MODEL_STAT_DIR': {'sec': 'dir', 'alt': 'MODEL_STAT_ANALYSIS_LOOKIN_DIR'}, - 'MODEL_NAME_ON_PLOT': {'sec': 'config', 'alt': 'MODEL_REFERENCE_NAME'}, - 'REGION_LIST': {'sec': 'config', 'alt': 'VX_MASK_LIST'}, - 'PLOT_STATS_LIST': {'sec': 'config', 'alt': 'MAKE_PLOT_STATS_LIST'}, - 'CI_METHOD': {'sec': 'config', 'alt': 'MAKE_PLOTS_CI_METHOD'}, - 'VERIF_GRID': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_GRID'}, - 'EVENT_EQUALIZATION': {'sec': 'config', 'alt': 'MAKE_PLOTS_EVENT_EQUALIZATION'}, - 'MTD_CONFIG': {'sec': 'config', 'alt': 'MTD_CONFIG_FILE'}, - 'CLIMO_GRID_STAT_INPUT_DIR': {'sec': 'dir', 'alt': 'GRID_STAT_CLIMO_MEAN_INPUT_DIR'}, - 'CLIMO_GRID_STAT_INPUT_TEMPLATE': {'sec': 'filename_templates', 'alt': 'GRID_STAT_CLIMO_MEAN_INPUT_TEMPLATE'}, - 'CLIMO_POINT_STAT_INPUT_DIR': {'sec': 'dir', 'alt': 'POINT_STAT_CLIMO_MEAN_INPUT_DIR'}, - 'CLIMO_POINT_STAT_INPUT_TEMPLATE': {'sec': 'filename_templates', 'alt': 'POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE'}, - 'GEMPAKTOCF_CLASSPATH': {'sec': 'exe', 'alt': 'GEMPAKTOCF_JAR', 'copy': False}, - 'CUSTOM_INGEST__OUTPUT_DIR': {'sec': 'dir', 'alt': 'PY_EMBED_INGEST__OUTPUT_DIR'}, - 'CUSTOM_INGEST__OUTPUT_TEMPLATE': {'sec': 'filename_templates', 'alt': 'PY_EMBED_INGEST__OUTPUT_TEMPLATE'}, - 'CUSTOM_INGEST__OUTPUT_GRID': {'sec': 'config', 'alt': 'PY_EMBED_INGEST__OUTPUT_GRID'}, - 'CUSTOM_INGEST__SCRIPT': {'sec': 'config', 'alt': 'PY_EMBED_INGEST__SCRIPT'}, - 'CUSTOM_INGEST__TYPE': {'sec': 'config', 'alt': 'PY_EMBED_INGEST__TYPE'}, - 'TC_STAT_RUN_VIA': {'sec': 'config', 'alt': 'TC_STAT_CONFIG_FILE', - 'copy': False}, - 'TC_STAT_CMD_LINE_JOB': {'sec': 'config', 'alt': 'TC_STAT_JOB_ARGS'}, - 'TC_STAT_JOBS_LIST': {'sec': 'config', 'alt': 'TC_STAT_JOB_ARGS'}, - 'EXTRACT_TILES_OVERWRITE_TRACK': {'sec': 'config', - 'alt': 'EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS', - 'copy': False}, - 'EXTRACT_TILES_PAIRS_INPUT_DIR': {'sec': 'dir', - 'alt': 'EXTRACT_TILES_STAT_INPUT_DIR', - 'copy': False}, - 'EXTRACT_TILES_FILTERED_OUTPUT_TEMPLATE': {'sec': 'filename_template', - 'alt': 'EXTRACT_TILES_STAT_INPUT_TEMPLATE',}, - 'EXTRACT_TILES_GRID_INPUT_DIR': {'sec': 'dir', - 'alt': 'FCST_EXTRACT_TILES_INPUT_DIR' - 'and ' - 'OBS_EXTRACT_TILES_INPUT_DIR', - 'copy': False}, - 'SERIES_ANALYSIS_FILTER_OPTS': {'sec': 'config', - 'alt': 'TC_STAT_JOB_ARGS', - 'copy': False}, - 'SERIES_ANALYSIS_INPUT_DIR': {'sec': 'dir', - 'alt': 'FCST_SERIES_ANALYSIS_INPUT_DIR ' - 'and ' - 'OBS_SERIES_ANALYSIS_INPUT_DIR'}, - 'FCST_SERIES_ANALYSIS_TILE_INPUT_TEMPLATE': {'sec': 'filename_templates', - 'alt': 'FCST_SERIES_ANALYSIS_INPUT_TEMPLATE '}, - 'OBS_SERIES_ANALYSIS_TILE_INPUT_TEMPLATE': {'sec': 'filename_templates', - 'alt': 'OBS_SERIES_ANALYSIS_INPUT_TEMPLATE '}, - 'EXTRACT_TILES_STAT_INPUT_DIR': {'sec': 'dir', - 'alt': 'EXTRACT_TILES_TC_STAT_INPUT_DIR',}, - 'EXTRACT_TILES_STAT_INPUT_TEMPLATE': {'sec': 'filename_templates', - 'alt': 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE',}, - 'SERIES_ANALYSIS_STAT_INPUT_DIR': {'sec': 'dir', - 'alt': 'SERIES_ANALYSIS_TC_STAT_INPUT_DIR', }, - 'SERIES_ANALYSIS_STAT_INPUT_TEMPLATE': {'sec': 'filename_templates', - 'alt': 'SERIES_ANALYSIS_TC_STAT_INPUT_TEMPLATE', }, - } - - # template '' : {'sec' : '', 'alt' : '', 'copy': True}, - logger = config.logger # create list of errors and warnings to report for deprecated configs @@ -1236,35 +993,37 @@ def check_for_deprecated_config(config): w_list = [] all_sed_cmds = [] - for old, depr_info in deprecated_dict.items(): - if isinstance(depr_info, dict): - - # check if is found in the old item, use regex to find variables if found - if '' in old: - old_regex = old.replace('', r'(\d+)') - indices = find_indices_in_config_section(old_regex, - config, - index_index=1).keys() - for index in indices: - old_with_index = old.replace('', index) - if depr_info['alt']: - alt_with_index = depr_info['alt'].replace('', index) - else: - alt_with_index = '' - - handle_deprecated(old_with_index, alt_with_index, depr_info, - config, all_sed_cmds, w_list, e_list) + for old, depr_info in DEPRECATED_DICT.items(): + if not isinstance(depr_info, dict): + continue + + # check if is found in old item, use regex to find vars if found + if '' not in old: + handle_deprecated(old, depr_info['alt'], depr_info, + config, all_sed_cmds, w_list, e_list) + continue + + old_regex = old.replace('', r'(\d+)') + indices = find_indices_in_config_section(old_regex, + config, + index_index=1).keys() + for index in indices: + old_with_index = old.replace('', index) + if depr_info['alt']: + alt_with_index = depr_info['alt'].replace('', index) else: - handle_deprecated(old, depr_info['alt'], depr_info, - config, all_sed_cmds, w_list, e_list) + alt_with_index = '' + handle_deprecated(old_with_index, alt_with_index, depr_info, + config, all_sed_cmds, w_list, e_list) # check all templates and error if any deprecated tags are used # value of dict is replacement tag, set to None if no replacement exists # deprecated tags: region (replace with basin) - deprecated_tags = {'region' : 'basin'} + deprecated_tags = {'region': 'basin'} template_vars = config.keys('config') - template_vars = [tvar for tvar in template_vars if tvar.endswith('_TEMPLATE')] + template_vars = [tvar for tvar in template_vars + if tvar.endswith('_TEMPLATE')] for temp_var in template_vars: template = config.getraw('filename_templates', temp_var) tags = get_tags(template) @@ -1285,7 +1044,7 @@ def check_for_deprecated_config(config): # if any errors exist, report them and exit if e_list: - logger.error('DEPRECATED CONFIG ITEMS WERE FOUND. ' +\ + logger.error('DEPRECATED CONFIG ITEMS WERE FOUND. ' 'PLEASE REMOVE/REPLACE THEM FROM CONFIG FILES') for error_msg in e_list: logger.error(error_msg) @@ -1293,6 +1052,7 @@ def check_for_deprecated_config(config): return True, [] + def check_for_deprecated_met_config(config): sed_cmds = [] all_good = True @@ -1320,6 +1080,7 @@ def check_for_deprecated_met_config(config): return all_good, sed_cmds + def check_for_deprecated_met_config_file(config, met_config, sed_cmds, met_tool): all_good = True @@ -1393,6 +1154,7 @@ def check_for_deprecated_met_config_file(config, met_config, sed_cmds, met_tool) return all_good + def validate_field_info_configs(config, force_check=False): """!Verify that config variables with _VAR_ in them are valid. Returns True if all are valid. Returns False if any items are invalid""" @@ -1446,6 +1208,7 @@ def validate_field_info_configs(config, force_check=False): return all_good, all_sed_cmds + def check_user_environment(config): """!Check if any environment variables set in [user_env_vars] are already set in the user's environment. Warn them that it will be overwritten from the conf if it is""" @@ -1458,6 +1221,7 @@ def check_user_environment(config): 'Overwriting from conf file' config.logger.warning(msg) + def find_indices_in_config_section(regex, config, sec='config', index_index=1, id_index=None): """! Use regular expression to get all config variables that match and @@ -1499,29 +1263,35 @@ def find_indices_in_config_section(regex, config, sec='config', return indices + def handle_deprecated(old, alt, depr_info, config, all_sed_cmds, w_list, e_list): - sec = depr_info['sec'] + sec = config config_files = config.getstr('config', 'CONFIG_INPUT', '').split(',') # if deprecated config item is found - if config.has_option(sec, old): - # if it is not required to remove, add to warning list - if 'req' in depr_info.keys() and depr_info['req'] is False: - msg = '[{}] {} is deprecated and will be '.format(sec, old) + \ - 'removed in a future version of METplus' - if alt: - msg += ". Please replace with {}".format(alt) - w_list.append(msg) - # if it is required to remove, add to error list - else: - if not alt: - e_list.append("[{}] {} should be removed".format(sec, old)) - else: - e_list.append("[{}] {} should be replaced with {}".format(sec, old, alt)) + if not config.has_option(sec, old): + return + + # if it is not required to remove, add to warning list + if 'req' in depr_info.keys() and depr_info['req'] is False: + msg = '[{}] {} is deprecated and will be '.format(sec, old) + \ + 'removed in a future version of METplus' + if alt: + msg += ". Please replace with {}".format(alt) + w_list.append(msg) + return + + # if it is required to remove, add to error list + if not alt: + e_list.append("[{}] {} should be removed".format(sec, old)) + return + + e_list.append("[{}] {} should be replaced with {}".format(sec, old, alt)) + + if 'copy' not in depr_info.keys() or depr_info['copy']: + for config_file in config_files: + all_sed_cmds.append(f"sed -i 's|^{old}|{alt}|g' {config_file}") + all_sed_cmds.append(f"sed -i 's|{{{old}}}|{{{alt}}}|g' {config_file}") - if 'copy' not in depr_info.keys() or depr_info['copy']: - for config_file in config_files: - all_sed_cmds.append(f"sed -i 's|^{old}|{alt}|g' {config_file}") - all_sed_cmds.append(f"sed -i 's|{{{old}}}|{{{alt}}}|g' {config_file}") def get_custom_string_list(config, met_tool): var_name = 'CUSTOM_LOOP_LIST' @@ -1536,6 +1306,7 @@ def get_custom_string_list(config, met_tool): return custom_loop_list + def _replace_output_prefix(line): op_replacements = {'${MODEL}': '{MODEL}', '${FCST_VAR}': '{CURRENT_FCST_NAME}', @@ -1550,6 +1321,7 @@ def _replace_output_prefix(line): return prefix + def parse_var_list(config, time_info=None, data_type=None, met_tool=None, levels_as_list=False): """ read conf items and populate list of dictionaries containing @@ -1839,6 +1611,7 @@ def skip_field_info_validation(config): return True + def get_process_list(config): """!Read process list, Extract instance string if specified inside parenthesis. Remove dashes/underscores and change to lower case, @@ -1873,6 +1646,7 @@ def get_process_list(config): return out_process_list + def get_field_search_prefixes(data_type, met_tool=None): """! Get list of prefixes to search for field variables. @@ -1902,6 +1676,7 @@ def get_field_search_prefixes(data_type, met_tool=None): return search_prefixes + def is_var_item_valid(item_list, index, ext, config): """!Given a list of data types (FCST, OBS, ENS, or BOTH) check if the combination is valid. @@ -1964,6 +1739,7 @@ def is_var_item_valid(item_list, index, ext, config): return not bool(msg), msg, sed_cmds + def get_field_config_variables(config, index, search_prefixes): """! Search for variables that are set in the config that correspond to the fields requested. Some field info items have diff --git a/metplus/util/constants.py b/metplus/util/constants.py index 5e6f3dcb99..6f3f57d551 100644 --- a/metplus/util/constants.py +++ b/metplus/util/constants.py @@ -113,3 +113,327 @@ # we often check for None if a variable is not set, but 0 and None # have the same result in a test. 0 may be a valid integer value MISSING_DATA_VALUE = -9999 + +# key is the name of the depreacted variable that is no longer allowed in any config files +# value is a dictionary containing information about what to do with the deprecated config +# 'sec' is the section of the config file where the replacement resides, i.e. config, dir, +# filename_templates +# 'alt' is the alternative name for the deprecated config. this can be a single variable name or +# text to describe multiple variables or how to handle it. Set to None to tell the user to +# just remove the variable +# 'copy' is an optional item (defaults to True). set this to False if one cannot simply replace +# the deprecated config variable name with the value in 'alt' +# 'req' is an optional item (defaults to True). this to False to report a warning for the +# deprecated config and allow execution to continue. this is generally no longer used +# because we are requiring users to update the config files. if used, the developer must +# modify the code to handle both variables accordingly +DEPRECATED_DICT = { + 'LOOP_BY_INIT': {'sec': 'config', 'alt': 'LOOP_BY', 'copy': False}, + 'PREPBUFR_DIR_REGEX': {'sec': 'regex_pattern', 'alt': None}, + 'PREPBUFR_FILE_REGEX': {'sec': 'regex_pattern', 'alt': None}, + 'OBS_INPUT_DIR_REGEX': {'sec': 'regex_pattern', + 'alt': 'OBS_POINT_STAT_INPUT_DIR', 'copy': False}, + 'FCST_INPUT_DIR_REGEX': {'sec': 'regex_pattern', + 'alt': 'FCST_POINT_STAT_INPUT_DIR', + 'copy': False}, + 'FCST_INPUT_FILE_REGEX': + {'sec': 'regex_pattern', 'alt': 'FCST_POINT_STAT_INPUT_TEMPLATE', + 'copy': False}, + 'OBS_INPUT_FILE_REGEX': {'sec': 'regex_pattern', + 'alt': 'OBS_POINT_STAT_INPUT_TEMPLATE', + 'copy': False}, + 'PREPBUFR_DATA_DIR': {'sec': 'config', 'alt': 'PB2NC_INPUT_DIR'}, + 'PREPBUFR_MODEL_DIR_NAME': {'sec': 'config', 'alt': 'PB2NC_INPUT_DIR', + 'copy': False}, + 'OBS_INPUT_FILE_TMPL': + {'sec': 'config', 'alt': 'OBS_POINT_STAT_INPUT_TEMPLATE'}, + 'FCST_INPUT_FILE_TMPL': + {'sec': 'config', 'alt': 'FCST_POINT_STAT_INPUT_TEMPLATE'}, + 'NC_FILE_TMPL': {'sec': 'config', + 'alt': 'PB2NC_OUTPUT_TEMPLATE'}, + 'FCST_INPUT_DIR': {'sec': 'config', 'alt': 'FCST_POINT_STAT_INPUT_DIR'}, + 'OBS_INPUT_DIR': {'sec': 'config', 'alt': 'OBS_POINT_STAT_INPUT_DIR'}, + 'REGRID_TO_GRID': {'sec': 'config', 'alt': 'POINT_STAT_REGRID_TO_GRID'}, + 'FCST_HR_START': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'FCST_HR_END': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'FCST_HR_INTERVAL': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'START_DATE': {'sec': 'config', 'alt': 'INIT_BEG or VALID_BEG', + 'copy': False}, + 'END_DATE': {'sec': 'config', 'alt': 'INIT_END or VALID_END', + 'copy': False}, + 'INTERVAL_TIME': {'sec': 'config', + 'alt': 'INIT_INCREMENT or VALID_INCREMENT', + 'copy': False}, + 'BEG_TIME': {'sec': 'config', 'alt': 'INIT_BEG or VALID_BEG', + 'copy': False}, + 'END_TIME': {'sec': 'config', 'alt': 'INIT_END or VALID_END', + 'copy': False}, + 'START_HOUR': {'sec': 'config', 'alt': 'INIT_BEG or VALID_BEG', + 'copy': False}, + 'END_HOUR': {'sec': 'config', 'alt': 'INIT_END or VALID_END', + 'copy': False}, + 'OBS_BUFR_VAR_LIST': {'sec': 'config', 'alt': 'PB2NC_OBS_BUFR_VAR_LIST'}, + 'TIME_SUMMARY_FLAG': {'sec': 'config', 'alt': 'PB2NC_TIME_SUMMARY_FLAG'}, + 'TIME_SUMMARY_BEG': {'sec': 'config', 'alt': 'PB2NC_TIME_SUMMARY_BEG'}, + 'TIME_SUMMARY_END': {'sec': 'config', 'alt': 'PB2NC_TIME_SUMMARY_END'}, + 'TIME_SUMMARY_VAR_NAMES': {'sec': 'config', + 'alt': 'PB2NC_TIME_SUMMARY_VAR_NAMES'}, + 'TIME_SUMMARY_TYPE': {'sec': 'config', 'alt': 'PB2NC_TIME_SUMMARY_TYPE'}, + 'OVERWRITE_NC_OUTPUT': {'sec': 'config', + 'alt': 'PB2NC_SKIP_IF_OUTPUT_EXISTS', + 'copy': False}, + 'VERTICAL_LOCATION': {'sec': 'config', 'alt': 'PB2NC_VERTICAL_LOCATION'}, + 'VERIFICATION_GRID': {'sec': 'config', + 'alt': 'REGRID_DATA_PLANE_VERIF_GRID'}, + 'WINDOW_RANGE_BEG': {'sec': 'config', 'alt': 'OBS_WINDOW_BEGIN'}, + 'WINDOW_RANGE_END': {'sec': 'config', 'alt': 'OBS_WINDOW_END'}, + 'OBS_EXACT_VALID_TIME': + {'sec': 'config', 'alt': 'OBS_WINDOW_BEGIN and OBS_WINDOW_END', + 'copy': False}, + 'FCST_EXACT_VALID_TIME': + {'sec': 'config', 'alt': 'FCST_WINDOW_BEGIN and FCST_WINDOW_END', + 'copy': False}, + 'PCP_COMBINE_METHOD': + {'sec': 'config', + 'alt': 'FCST_PCP_COMBINE_METHOD and/or OBS_PCP_COMBINE_METHOD', + 'copy': False}, + 'FHR_BEG': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'FHR_END': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'FHR_INC': {'sec': 'config', 'alt': 'LEAD_SEQ', 'copy': False}, + 'FHR_GROUP_BEG': {'sec': 'config', 'alt': 'LEAD_SEQ_[N]', 'copy': False}, + 'FHR_GROUP_END': {'sec': 'config', 'alt': 'LEAD_SEQ_[N]', 'copy': False}, + 'FHR_GROUP_LABELS': {'sec': 'config', 'alt': 'LEAD_SEQ_[N]_LABEL', + 'copy': False}, + 'CYCLONE_OUT_DIR': {'sec': 'config', 'alt': 'CYCLONE_OUTPUT_DIR'}, + 'ENSEMBLE_STAT_OUT_DIR': {'sec': 'config', 'alt': 'ENSEMBLE_STAT_OUTPUT_DIR'}, + 'EXTRACT_OUT_DIR': {'sec': 'config', 'alt': 'EXTRACT_TILES_OUTPUT_DIR'}, + 'GRID_STAT_OUT_DIR': {'sec': 'config', 'alt': 'GRID_STAT_OUTPUT_DIR'}, + 'MODE_OUT_DIR': {'sec': 'config', 'alt': 'MODE_OUTPUT_DIR'}, + 'MTD_OUT_DIR': {'sec': 'config', 'alt': 'MTD_OUTPUT_DIR'}, + 'SERIES_INIT_OUT_DIR': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, + 'SERIES_LEAD_OUT_DIR': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, + 'SERIES_INIT_FILTERED_OUT_DIR': + {'sec': 'config', 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, + 'SERIES_LEAD_FILTERED_OUT_DIR': + {'sec': 'config', 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, + 'STAT_ANALYSIS_OUT_DIR': + {'sec': 'config', 'alt': 'STAT_ANALYSIS_OUTPUT_DIR'}, + 'TCMPR_PLOT_OUT_DIR': {'sec': 'config', 'alt': 'TCMPR_PLOT_OUTPUT_DIR'}, + 'FCST_MIN_FORECAST': {'sec': 'config', 'alt': 'LEAD_SEQ_MIN'}, + 'FCST_MAX_FORECAST': {'sec': 'config', 'alt': 'LEAD_SEQ_MAX'}, + 'OBS_MIN_FORECAST': {'sec': 'config', 'alt': 'OBS_PCP_COMBINE_MIN_LEAD'}, + 'OBS_MAX_FORECAST': {'sec': 'config', 'alt': 'OBS_PCP_COMBINE_MAX_LEAD'}, + 'FCST_INIT_INTERVAL': {'sec': 'config', 'alt': None}, + 'OBS_INIT_INTERVAL': {'sec': 'config', 'alt': None}, + 'FCST_DATA_INTERVAL': {'sec': '', 'alt': 'FCST_PCP_COMBINE_DATA_INTERVAL'}, + 'OBS_DATA_INTERVAL': {'sec': '', 'alt': 'OBS_PCP_COMBINE_DATA_INTERVAL'}, + 'FCST_IS_DAILY_FILE': {'sec': '', 'alt': 'FCST_PCP_COMBINE_IS_DAILY_FILE'}, + 'OBS_IS_DAILY_FILE': {'sec': '', 'alt': 'OBS_PCP_COMBINE_IS_DAILY_FILE'}, + 'FCST_TIMES_PER_FILE': {'sec': '', + 'alt': 'FCST_PCP_COMBINE_TIMES_PER_FILE'}, + 'OBS_TIMES_PER_FILE': {'sec': '', 'alt': 'OBS_PCP_COMBINE_TIMES_PER_FILE'}, + 'FCST_LEVEL': {'sec': '', 'alt': 'FCST_PCP_COMBINE_INPUT_ACCUMS', + 'copy': False}, + 'OBS_LEVEL': {'sec': '', 'alt': 'OBS_PCP_COMBINE_INPUT_ACCUMS', + 'copy': False}, + 'MODE_FCST_CONV_RADIUS': {'sec': 'config', 'alt': 'FCST_MODE_CONV_RADIUS'}, + 'MODE_FCST_CONV_THRESH': {'sec': 'config', 'alt': 'FCST_MODE_CONV_THRESH'}, + 'MODE_FCST_MERGE_FLAG': {'sec': 'config', 'alt': 'FCST_MODE_MERGE_FLAG'}, + 'MODE_FCST_MERGE_THRESH': {'sec': 'config', + 'alt': 'FCST_MODE_MERGE_THRESH'}, + 'MODE_OBS_CONV_RADIUS': {'sec': 'config', 'alt': 'OBS_MODE_CONV_RADIUS'}, + 'MODE_OBS_CONV_THRESH': {'sec': 'config', 'alt': 'OBS_MODE_CONV_THRESH'}, + 'MODE_OBS_MERGE_FLAG': {'sec': 'config', 'alt': 'OBS_MODE_MERGE_FLAG'}, + 'MODE_OBS_MERGE_THRESH': {'sec': 'config', 'alt': 'OBS_MODE_MERGE_THRESH'}, + 'MTD_FCST_CONV_RADIUS': {'sec': 'config', 'alt': 'FCST_MTD_CONV_RADIUS'}, + 'MTD_FCST_CONV_THRESH': {'sec': 'config', 'alt': 'FCST_MTD_CONV_THRESH'}, + 'MTD_OBS_CONV_RADIUS': {'sec': 'config', 'alt': 'OBS_MTD_CONV_RADIUS'}, + 'MTD_OBS_CONV_THRESH': {'sec': 'config', 'alt': 'OBS_MTD_CONV_THRESH'}, + 'RM_EXE': {'sec': 'exe', 'alt': 'RM'}, + 'CUT_EXE': {'sec': 'exe', 'alt': 'CUT'}, + 'TR_EXE': {'sec': 'exe', 'alt': 'TR'}, + 'NCAP2_EXE': {'sec': 'exe', 'alt': 'NCAP2'}, + 'CONVERT_EXE': {'sec': 'exe', 'alt': 'CONVERT'}, + 'NCDUMP_EXE': {'sec': 'exe', 'alt': 'NCDUMP'}, + 'EGREP_EXE': {'sec': 'exe', 'alt': 'EGREP'}, + 'ADECK_TRACK_DATA_DIR': {'sec': 'config', 'alt': 'TC_PAIRS_ADECK_INPUT_DIR'}, + 'BDECK_TRACK_DATA_DIR': {'sec': 'config', 'alt': 'TC_PAIRS_BDECK_INPUT_DIR'}, + 'MISSING_VAL_TO_REPLACE': {'sec': 'config', + 'alt': 'TC_PAIRS_MISSING_VAL_TO_REPLACE'}, + 'MISSING_VAL': {'sec': 'config', 'alt': 'TC_PAIRS_MISSING_VAL'}, + 'TRACK_DATA_SUBDIR_MOD': {'sec': 'config', 'alt': None}, + 'ADECK_FILE_PREFIX': {'sec': 'config', 'alt': 'TC_PAIRS_ADECK_TEMPLATE', + 'copy': False}, + 'BDECK_FILE_PREFIX': {'sec': 'config', 'alt': 'TC_PAIRS_BDECK_TEMPLATE', + 'copy': False}, + 'TOP_LEVEL_DIRS': {'sec': 'config', 'alt': 'TC_PAIRS_READ_ALL_FILES'}, + 'TC_PAIRS_DIR': {'sec': 'config', 'alt': 'TC_PAIRS_OUTPUT_DIR'}, + 'CYCLONE': {'sec': 'config', 'alt': 'TC_PAIRS_CYCLONE'}, + 'STORM_ID': {'sec': 'config', 'alt': 'TC_PAIRS_STORM_ID'}, + 'BASIN': {'sec': 'config', 'alt': 'TC_PAIRS_BASIN'}, + 'STORM_NAME': {'sec': 'config', 'alt': 'TC_PAIRS_STORM_NAME'}, + 'DLAND_FILE': {'sec': 'config', 'alt': 'TC_PAIRS_DLAND_FILE'}, + 'TRACK_TYPE': {'sec': 'config', 'alt': 'TC_PAIRS_REFORMAT_DECK'}, + 'FORECAST_TMPL': {'sec': 'config', + 'alt': 'TC_PAIRS_ADECK_TEMPLATE'}, + 'REFERENCE_TMPL': {'sec': 'config', + 'alt': 'TC_PAIRS_BDECK_TEMPLATE'}, + 'TRACK_DATA_MOD_FORCE_OVERWRITE': + {'sec': 'config', 'alt': 'TC_PAIRS_SKIP_IF_REFORMAT_EXISTS', + 'copy': False}, + 'TC_PAIRS_FORCE_OVERWRITE': {'sec': 'config', + 'alt': 'TC_PAIRS_SKIP_IF_OUTPUT_EXISTS', + 'copy': False}, + 'GRID_STAT_CONFIG': {'sec': 'config', 'alt': 'GRID_STAT_CONFIG_FILE'}, + 'MODE_CONFIG': {'sec': 'config', 'alt': 'MODE_CONFIG_FILE'}, + 'FCST_PCP_COMBINE_INPUT_LEVEL': {'sec': 'config', + 'alt': 'FCST_PCP_COMBINE_INPUT_ACCUMS'}, + 'OBS_PCP_COMBINE_INPUT_LEVEL': {'sec': 'config', + 'alt': 'OBS_PCP_COMBINE_INPUT_ACCUMS'}, + 'TIME_METHOD': {'sec': 'config', 'alt': 'LOOP_BY', 'copy': False}, + 'MODEL_DATA_DIR': {'sec': 'config', 'alt': 'EXTRACT_TILES_GRID_INPUT_DIR'}, + 'STAT_LIST': {'sec': 'config', 'alt': 'SERIES_ANALYSIS_STAT_LIST'}, + 'NLAT': {'sec': 'config', 'alt': 'EXTRACT_TILES_NLAT'}, + 'NLON': {'sec': 'config', 'alt': 'EXTRACT_TILES_NLON'}, + 'DLAT': {'sec': 'config', 'alt': 'EXTRACT_TILES_DLAT'}, + 'DLON': {'sec': 'config', 'alt': 'EXTRACT_TILES_DLON'}, + 'LON_ADJ': {'sec': 'config', 'alt': 'EXTRACT_TILES_LON_ADJ'}, + 'LAT_ADJ': {'sec': 'config', 'alt': 'EXTRACT_TILES_LAT_ADJ'}, + 'OVERWRITE_TRACK': {'sec': 'config', + 'alt': 'EXTRACT_TILES_OVERWRITE_TRACK'}, + 'BACKGROUND_MAP': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_BACKGROUND_MAP'}, + 'GFS_FCST_FILE_TMPL': {'sec': 'config', + 'alt': 'FCST_EXTRACT_TILES_INPUT_TEMPLATE'}, + 'GFS_ANLY_FILE_TMPL': {'sec': 'config', + 'alt': 'OBS_EXTRACT_TILES_INPUT_TEMPLATE'}, + 'SERIES_BY_LEAD_FILTERED_OUTPUT_DIR': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, + 'SERIES_BY_INIT_FILTERED_OUTPUT_DIR': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_FILTERED_OUTPUT_DIR'}, + 'SERIES_BY_LEAD_OUTPUT_DIR': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, + 'SERIES_BY_INIT_OUTPUT_DIR': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_OUTPUT_DIR'}, + 'SERIES_BY_LEAD_GROUP_FCSTS': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_GROUP_FCSTS'}, + 'SERIES_ANALYSIS_BY_LEAD_CONFIG_FILE': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_CONFIG_FILE'}, + 'SERIES_ANALYSIS_BY_INIT_CONFIG_FILE': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_CONFIG_FILE'}, + 'ENSEMBLE_STAT_MET_OBS_ERROR_TABLE': {'sec': 'config', + 'alt': 'ENSEMBLE_STAT_MET_OBS_ERR_TABLE'}, + 'VAR_LIST': {'sec': 'config', + 'alt': 'BOTH_VAR_NAME BOTH_VAR_LEVELS or SERIES_ANALYSIS_VAR_LIST', + 'copy': False}, + 'SERIES_ANALYSIS_VAR_LIST': {'sec': 'config', + 'alt': 'BOTH_VAR_NAME BOTH_VAR_LEVELS', + 'copy': False}, + 'EXTRACT_TILES_VAR_LIST': {'sec': 'config', 'alt': ''}, + 'STAT_ANALYSIS_LOOKIN_DIR': {'sec': 'config', + 'alt': 'MODEL1_STAT_ANALYSIS_LOOKIN_DIR'}, + 'VALID_HOUR_METHOD': {'sec': 'config', 'alt': None}, + 'VALID_HOUR_BEG': {'sec': 'config', 'alt': None}, + 'VALID_HOUR_END': {'sec': 'config', 'alt': None}, + 'VALID_HOUR_INCREMENT': {'sec': 'config', 'alt': None}, + 'INIT_HOUR_METHOD': {'sec': 'config', 'alt': None}, + 'INIT_HOUR_BEG': {'sec': 'config', 'alt': None}, + 'INIT_HOUR_END': {'sec': 'config', 'alt': None}, + 'INIT_HOUR_INCREMENT': {'sec': 'config', 'alt': None}, + 'STAT_ANALYSIS_CONFIG': {'sec': 'config', + 'alt': 'STAT_ANALYSIS_CONFIG_FILE'}, + 'JOB_NAME': {'sec': 'config', 'alt': 'STAT_ANALYSIS_JOB_NAME'}, + 'JOB_ARGS': {'sec': 'config', 'alt': 'STAT_ANALYSIS_JOB_ARGS'}, + 'FCST_LEAD': {'sec': 'config', 'alt': 'FCST_LEAD_LIST'}, + 'FCST_VAR_NAME': {'sec': 'config', 'alt': 'FCST_VAR_LIST'}, + 'FCST_VAR_LEVEL': {'sec': 'config', 'alt': 'FCST_VAR_LEVEL_LIST'}, + 'OBS_VAR_NAME': {'sec': 'config', 'alt': 'OBS_VAR_LIST'}, + 'OBS_VAR_LEVEL': {'sec': 'config', 'alt': 'OBS_VAR_LEVEL_LIST'}, + 'REGION': {'sec': 'config', 'alt': 'VX_MASK_LIST'}, + 'INTERP': {'sec': 'config', 'alt': 'INTERP_LIST'}, + 'INTERP_PTS': {'sec': 'config', 'alt': 'INTERP_PTS_LIST'}, + 'CONV_THRESH': {'sec': 'config', 'alt': 'CONV_THRESH_LIST'}, + 'FCST_THRESH': {'sec': 'config', 'alt': 'FCST_THRESH_LIST'}, + 'LINE_TYPE': {'sec': 'config', 'alt': 'LINE_TYPE_LIST'}, + 'STAT_ANALYSIS_DUMP_ROW_TMPL': {'sec': 'config', + 'alt': 'STAT_ANALYSIS_DUMP_ROW_TEMPLATE'}, + 'STAT_ANALYSIS_OUT_STAT_TMPL': {'sec': 'config', + 'alt': 'STAT_ANALYSIS_OUT_STAT_TEMPLATE'}, + 'PLOTTING_SCRIPTS_DIR': {'sec': 'config', 'alt': 'MAKE_PLOTS_SCRIPTS_DIR'}, + 'STAT_FILES_INPUT_DIR': {'sec': 'config', 'alt': 'MAKE_PLOTS_INPUT_DIR'}, + 'PLOTTING_OUTPUT_DIR': {'sec': 'config', 'alt': 'MAKE_PLOTS_OUTPUT_DIR'}, + 'VERIF_CASE': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_CASE'}, + 'VERIF_TYPE': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_TYPE'}, + 'PLOT_TIME': {'sec': 'config', 'alt': 'DATE_TIME'}, + 'MODEL_NAME': {'sec': 'config', 'alt': 'MODEL'}, + 'MODEL_OBS_NAME': {'sec': 'config', 'alt': 'MODEL_OBTYPE'}, + 'MODEL_STAT_DIR': {'sec': 'config', + 'alt': 'MODEL_STAT_ANALYSIS_LOOKIN_DIR'}, + 'MODEL_NAME_ON_PLOT': {'sec': 'config', + 'alt': 'MODEL_REFERENCE_NAME'}, + 'REGION_LIST': {'sec': 'config', 'alt': 'VX_MASK_LIST'}, + 'PLOT_STATS_LIST': {'sec': 'config', 'alt': 'MAKE_PLOT_STATS_LIST'}, + 'CI_METHOD': {'sec': 'config', 'alt': 'MAKE_PLOTS_CI_METHOD'}, + 'VERIF_GRID': {'sec': 'config', 'alt': 'MAKE_PLOTS_VERIF_GRID'}, + 'EVENT_EQUALIZATION': {'sec': 'config', + 'alt': 'MAKE_PLOTS_EVENT_EQUALIZATION'}, + 'MTD_CONFIG': {'sec': 'config', 'alt': 'MTD_CONFIG_FILE'}, + 'CLIMO_GRID_STAT_INPUT_DIR': {'sec': 'config', + 'alt': 'GRID_STAT_CLIMO_MEAN_INPUT_DIR'}, + 'CLIMO_GRID_STAT_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'GRID_STAT_CLIMO_MEAN_INPUT_TEMPLATE'}, + 'CLIMO_POINT_STAT_INPUT_DIR': {'sec': 'config', + 'alt': 'POINT_STAT_CLIMO_MEAN_INPUT_DIR'}, + 'CLIMO_POINT_STAT_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'POINT_STAT_CLIMO_MEAN_INPUT_TEMPLATE'}, + 'GEMPAKTOCF_CLASSPATH': {'sec': 'exe', 'alt': 'GEMPAKTOCF_JAR', + 'copy': False}, + 'CUSTOM_INGEST__OUTPUT_DIR': {'sec': 'config', + 'alt': 'PY_EMBED_INGEST__OUTPUT_DIR'}, + 'CUSTOM_INGEST__OUTPUT_TEMPLATE': {'sec': 'config', + 'alt': 'PY_EMBED_INGEST__OUTPUT_TEMPLATE'}, + 'CUSTOM_INGEST__OUTPUT_GRID': {'sec': 'config', + 'alt': 'PY_EMBED_INGEST__OUTPUT_GRID'}, + 'CUSTOM_INGEST__SCRIPT': {'sec': 'config', + 'alt': 'PY_EMBED_INGEST__SCRIPT'}, + 'CUSTOM_INGEST__TYPE': {'sec': 'config', + 'alt': 'PY_EMBED_INGEST__TYPE'}, + 'TC_STAT_RUN_VIA': {'sec': 'config', 'alt': 'TC_STAT_CONFIG_FILE', + 'copy': False}, + 'TC_STAT_CMD_LINE_JOB': {'sec': 'config', 'alt': 'TC_STAT_JOB_ARGS'}, + 'TC_STAT_JOBS_LIST': {'sec': 'config', 'alt': 'TC_STAT_JOB_ARGS'}, + 'EXTRACT_TILES_OVERWRITE_TRACK': {'sec': 'config', + 'alt': 'EXTRACT_TILES_SKIP_IF_OUTPUT_EXISTS', + 'copy': False}, + 'EXTRACT_TILES_PAIRS_INPUT_DIR': {'sec': 'config', + 'alt': 'EXTRACT_TILES_STAT_INPUT_DIR', + 'copy': False}, + 'EXTRACT_TILES_FILTERED_OUTPUT_TEMPLATE': {'sec': 'filename_template', + 'alt': 'EXTRACT_TILES_STAT_INPUT_TEMPLATE', }, + 'EXTRACT_TILES_GRID_INPUT_DIR': {'sec': 'config', + 'alt': 'FCST_EXTRACT_TILES_INPUT_DIR' + 'and ' + 'OBS_EXTRACT_TILES_INPUT_DIR', + 'copy': False}, + 'SERIES_ANALYSIS_FILTER_OPTS': {'sec': 'config', + 'alt': 'TC_STAT_JOB_ARGS', + 'copy': False}, + 'SERIES_ANALYSIS_INPUT_DIR': {'sec': 'config', + 'alt': 'FCST_SERIES_ANALYSIS_INPUT_DIR ' + 'and ' + 'OBS_SERIES_ANALYSIS_INPUT_DIR'}, + 'FCST_SERIES_ANALYSIS_TILE_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'FCST_SERIES_ANALYSIS_INPUT_TEMPLATE '}, + 'OBS_SERIES_ANALYSIS_TILE_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'OBS_SERIES_ANALYSIS_INPUT_TEMPLATE '}, + 'EXTRACT_TILES_STAT_INPUT_DIR': {'sec': 'config', + 'alt': 'EXTRACT_TILES_TC_STAT_INPUT_DIR', }, + 'EXTRACT_TILES_STAT_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE', }, + 'SERIES_ANALYSIS_STAT_INPUT_DIR': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_TC_STAT_INPUT_DIR', }, + 'SERIES_ANALYSIS_STAT_INPUT_TEMPLATE': {'sec': 'config', + 'alt': 'SERIES_ANALYSIS_TC_STAT_INPUT_TEMPLATE', }, +} + +# template '' : {'sec' : '', 'alt' : '', 'copy': True}, \ No newline at end of file