def create_c_dict(self): c_dict = super(ModeWrapper, self).create_c_dict() c_dict['CONFIG_FILE'] = self.config.getstr('config', 'MODE_CONFIG') c_dict['OBS_INPUT_DIR'] = \ self.config.getdir('OBS_MODE_INPUT_DIR') c_dict['OBS_INPUT_TEMPLATE'] = \ self.config.getraw('filename_templates', 'OBS_MODE_INPUT_TEMPLATE') c_dict['OBS_INPUT_DATATYPE'] = \ self.config.getstr('config', 'OBS_MODE_INPUT_DATATYPE', '') c_dict['FCST_INPUT_DIR'] = \ self.config.getdir('FCST_MODE_INPUT_DIR') c_dict['FCST_INPUT_TEMPLATE'] = \ self.config.getraw('filename_templates', 'FCST_MODE_INPUT_TEMPLATE') c_dict['FCST_INPUT_DATATYPE'] = \ self.config.getstr('config', 'FCST_MODE_INPUT_DATATYPE', '') c_dict['OUTPUT_DIR'] = self.config.getdir('MODE_OUTPUT_DIR') c_dict['ONCE_PER_FIELD'] = True c_dict['QUILT'] = self.config.getbool('config', 'MODE_QUILT', False) fcst_conv_radius, obs_conv_radius = \ self.handle_fcst_and_obs_field('MODE_CONV_RADIUS', 'FCST_MODE_CONV_RADIUS', 'OBS_MODE_CONV_RADIUS') c_dict['FCST_CONV_RADIUS'] = fcst_conv_radius c_dict['OBS_CONV_RADIUS'] = obs_conv_radius fcst_conv_thresh, obs_conv_thresh = self.handle_fcst_and_obs_field( 'MODE_CONV_THRESH', 'FCST_MODE_CONV_THRESH', 'OBS_MODE_CONV_THRESH') c_dict['FCST_CONV_THRESH'] = fcst_conv_thresh c_dict['OBS_CONV_THRESH'] = obs_conv_thresh fcst_merge_thresh, obs_merge_thresh = \ self.handle_fcst_and_obs_field('MODE_MERGE_THRESH', 'FCST_MODE_MERGE_THRESH', 'OBS_MODE_MERGE_THRESH') c_dict['FCST_MERGE_THRESH'] = fcst_merge_thresh c_dict['OBS_MERGE_THRESH'] = obs_merge_thresh fcst_merge_flag, obs_merge_flag = \ self.handle_fcst_and_obs_field('MODE_MERGE_FLAG', 'FCST_MODE_MERGE_FLAG', 'OBS_MODE_MERGE_FLAG') c_dict['FCST_MERGE_FLAG'] = fcst_merge_flag c_dict['OBS_MERGE_FLAG'] = obs_merge_flag c_dict['ALLOW_MULTIPLE_FILES'] = False c_dict['MERGE_CONFIG_FILE'] = self.config.getstr( 'config', 'MODE_MERGE_CONFIG_FILE', '') # handle window variables [FCST/OBS]_[FILE_]_WINDOW_[BEGIN/END] self.handle_window_variables(c_dict, 'mode') c_dict['VERIFICATION_MASK_TEMPLATE'] = \ self.config.getraw('filename_templates', 'MODE_VERIFICATION_MASK_TEMPLATE') c_dict['VERIFICATION_MASK'] = '' # check that values are valid error_message = 'items must start with a comparison operator '+\ '(>,>=,==,!=,<,<=,gt,ge,eq,ne,lt,le)' if not util.validate_thresholds( util.getlist(c_dict['FCST_CONV_THRESH'])): self.logger.error('MODE_FCST_CONV_THRESH {}'.format(error_message)) exit(1) if not util.validate_thresholds(util.getlist( c_dict['OBS_CONV_THRESH'])): self.logger.error('MODE_OBS_CONV_THRESH {}'.format(error_message)) exit(1) if not util.validate_thresholds( util.getlist(c_dict['FCST_MERGE_THRESH'])): self.logger.error( 'MODE_FCST_MERGE_THRESH {}'.format(error_message)) exit(1) if not util.validate_thresholds( util.getlist(c_dict['OBS_MERGE_THRESH'])): self.logger.error('MODE_OBS_MERGE_THRESH {}'.format(error_message)) exit(1) return c_dict
def test_threshold_lt_symbol(): thresh_list = {"<2.3", "<1."} assert (util.validate_thresholds(thresh_list))
def create_c_dict(self): c_dict = super(ModeWrapper, self).create_c_dict() # set to prevent find_obs from getting multiple files within # a time window. Does not refer to time series of files c_dict['ALLOW_MULTIPLE_FILES'] = False c_dict['OUTPUT_DIR'] = self.config.getdir('MTD_OUTPUT_DIR', self.config.getdir('OUTPUT_BASE')) c_dict['CONFIG_FILE'] = self.config.getstr('config', 'MTD_CONFIG', '') c_dict['MIN_VOLUME'] = self.config.getstr('config', 'MTD_MIN_VOLUME', '2000') c_dict['SINGLE_RUN'] = self.config.getbool('config', 'MTD_SINGLE_RUN', False) c_dict['SINGLE_DATA_SRC'] = self.config.getstr('config', 'MTD_SINGLE_DATA_SRC', 'FCST') # only read FCST conf if processing forecast data if not c_dict['SINGLE_RUN'] or c_dict['SINGLE_DATA_SRC'] == 'FCST': c_dict['FCST_IS_PROB'] = self.config.getbool('config', 'FCST_IS_PROB', False) c_dict['FCST_INPUT_DIR'] = \ self.config.getdir('FCST_MTD_INPUT_DIR', c_dict['INPUT_BASE']) c_dict['FCST_INPUT_TEMPLATE'] = \ self.config.getraw('filename_templates', 'FCST_MTD_INPUT_TEMPLATE') c_dict['FCST_INPUT_DATATYPE'] = \ self.config.getstr('config', 'FCST_MTD_INPUT_DATATYPE', '') if self.config.has_option('config', 'FCST_MTD_CONV_RADIUS'): c_dict['FCST_CONV_RADIUS'] = self.config.getstr('config', 'FCST_MTD_CONV_RADIUS') elif self.config.has_option('config', 'MTD_CONV_RADIUS'): c_dict['FCST_CONV_RADIUS'] = self.config.getstr('config', 'MTD_CONV_RADIUS') else: self.logger.error('[config] FCST_MTD_CONV_RADIUS not set in config') exit(1) if self.config.has_option('config', 'FCST_MTD_CONV_THRESH'): c_dict['FCST_CONV_THRESH'] = self.config.getstr('config', 'FCST_MTD_CONV_THRESH') elif self.config.has_option('config', 'MTD_CONV_THRESH'): c_dict['FCST_CONV_THRESH'] = self.config.getstr('config', 'MTD_CONV_THRESH') else: self.logger.error('[config] FCST_MTD_CONV_THRESH not set in config') exit(1) # check that values are valid if not util.validate_thresholds(util.getlist(c_dict['FCST_CONV_THRESH'])): self.logger.error('FCST_MTD_CONV_THRESH items must start with a comparison operator (>,>=,==,!=,<,<=,gt,ge,eq,ne,lt,le)') exit(1) # only read OBS conf if processing observation data if not c_dict['SINGLE_RUN'] or c_dict['SINGLE_DATA_SRC'] == 'OBS': c_dict['OBS_IS_PROB'] = self.config.getbool('config', 'OBS_IS_PROB', False) c_dict['OBS_INPUT_DIR'] = \ self.config.getdir('OBS_MTD_INPUT_DIR', c_dict['INPUT_BASE']) c_dict['OBS_INPUT_TEMPLATE'] = \ self.config.getraw('filename_templates', 'OBS_MTD_INPUT_TEMPLATE') c_dict['OBS_INPUT_DATATYPE'] = \ self.config.getstr('config', 'OBS_MTD_INPUT_DATATYPE', '') if self.config.has_option('config', 'OBS_MTD_CONV_RADIUS'): c_dict['OBS_CONV_RADIUS'] = self.config.getstr('config', 'OBS_MTD_CONV_RADIUS') elif self.config.has_option('config', 'MTD_CONV_RADIUS'): c_dict['OBS_CONV_RADIUS'] = self.config.getstr('config', 'MTD_CONV_RADIUS') else: self.logger.error('[config] OBS_MTD_CONV_RADIUS not set in config') exit(1) if self.config.has_option('config', 'OBS_MTD_CONV_THRESH'): c_dict['OBS_CONV_THRESH'] = self.config.getstr('config', 'OBS_MTD_CONV_THRESH') elif self.config.has_option('config', 'MTD_CONV_THRESH'): c_dict['OBS_CONV_THRESH'] = self.config.getstr('config', 'MTD_CONV_THRESH') else: self.logger.error('[config] OBS_MTD_CONV_THRESH not set in config') exit(1) # check that values are valid if not util.validate_thresholds(util.getlist(c_dict['OBS_CONV_THRESH'])): self.logger.error('OBS_MTD_CONV_THRESH items must start with a comparison operator (>,>=,==,!=,<,<=,gt,ge,eq,ne,lt,le)') exit(1) # handle window variables [FCST/OBS]_[FILE_]_WINDOW_[BEGIN/END] self.handle_window_variables(c_dict, 'mtd') return c_dict
def test_threshold_eq_symbol(): thresh_list = {"==2.3"} assert (util.validate_thresholds(thresh_list))
def test_threshold_ne_symbol(): thresh_list = {"!=.3"} assert (util.validate_thresholds(thresh_list))
def test_threshold_le(): thresh_list = {"le2.3", "le1.1"} assert (util.validate_thresholds(thresh_list))
def test_threshold_ge_symbol(): thresh_list = {">=2.3", ">=5.5"} assert (util.validate_thresholds(thresh_list))
def test_threshold_eq(): thresh_list = {"eq2.3"} assert (util.validate_thresholds(thresh_list))
def test_threshold_ne(): thresh_list = {"ne2.3"} assert (util.validate_thresholds(thresh_list))
def test_threshold_complex_comparison(): thresh_list = {"<=2.3||>=4.2", "gt2.3&<4.2"} assert (util.validate_thresholds(thresh_list))
def test_threshold_ge(): thresh_list = {"ge2.3", "ge5.5"} assert (util.validate_thresholds(thresh_list))
def test_threshold_only_one_fails(): thresh_list = {"<=2.3", "2.4", "gt2.7"} assert (util.validate_thresholds(thresh_list) == False)
def test_threshold_just_number(): thresh_list = {"2.3"} assert (util.validate_thresholds(thresh_list) == False)
def test_threshold_ge_symbol_no_number(): thresh_list = {">=a"} assert (util.validate_thresholds(thresh_list) == False)
def test_threshold_gt_no_number(): thresh_list = {"gta"} assert (util.validate_thresholds(thresh_list) == False)
def test_threshold_le_symbol(): thresh_list = {"<=2.3", "<=1.1"} assert (util.validate_thresholds(thresh_list))