From 66165c55110aa54f08f719ecf860e7fea413298c Mon Sep 17 00:00:00 2001 From: lb584 <lb584@cam.ac.uk> Date: Thu, 29 Aug 2024 16:19:03 +0100 Subject: [PATCH] making the running of epi plotting dependant on whether config had been provided. Modifying tests to stop using epi outputs which are no longer included --- .gitlab-ci.yml | 2 +- ews/coordinator/processor_epidemiology.py | 183 +++++++++--------- .../integration/test_suites/epi_test_suite.py | 1 - 3 files changed, 95 insertions(+), 91 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74ebd7e..c85ccb3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -85,7 +85,7 @@ half_fat_tests: expire_in: 10 days half_fat_epi_tests: - when: manual + when: always stage: half-fat extends: .before_script diff --git a/ews/coordinator/processor_epidemiology.py b/ews/coordinator/processor_epidemiology.py index 15cf9c8..55305f7 100644 --- a/ews/coordinator/processor_epidemiology.py +++ b/ews/coordinator/processor_epidemiology.py @@ -616,127 +616,132 @@ class ProcessorEpidemiology(ProcessorBase): def process_EWS_plotting_epi(self, job_path, config): - logger.info('started process_EWS_plotting_epi()') + """ + We infer whether to attemp plotting based on the presence or absence of the EWS-Plotting ket in the config. + """ + if 'EWS-Plotting' in config and config['EWS-Plotting'] is not None: - # initalise necessary variables from config + logger.info('started process_EWS_plotting_epi()') - reference_date_str = config['StartString'] - reference_date = datetime.datetime.strptime(reference_date_str,'%Y%m%d') - - start_date, end_date = calc_epi_date_range(reference_date_str,config['CalculationSpanDays']) + # initalise necessary variables from config + reference_date_str = config['StartString'] + reference_date = datetime.datetime.strptime(reference_date_str,'%Y%m%d') - start_string = start_date.strftime('%Y%m%d') - end_string = end_date.strftime('%Y%m%d') + start_date, end_date = calc_epi_date_range(reference_date_str,config['CalculationSpanDays']) - epi_case_operational = config['EWS-Plotting']['EpiCase'] - if epi_case_operational == 'none': - logger.info('Config specifies not to call to EWS-Plotting') - return [] + start_string = start_date.strftime('%Y%m%d') + end_string = end_date.strftime('%Y%m%d') - diseases = config['DiseaseNames'] + epi_case_operational = config['EWS-Plotting']['EpiCase'] - # initialise environment - sys_config = config['EWS-Plotting']['SysConfig'] + if epi_case_operational == 'none': + logger.info('Config specifies not to call to EWS-Plotting') + return [] - chart_config = config['EWS-Plotting']['ChartConfig'] + diseases = config['DiseaseNames'] - # use the first matching epi formulation - # TODO: Is there a more efficient way to select? - epi_filename = [ce['infectionRasterFileName'] for ce in config['Epi'] if ce['model']==epi_case_operational][0] + # initialise environment + sys_config = config['EWS-Plotting']['SysConfig'] - dep_regionnames = ['SouthAsia','Ethiopia'] + chart_config = config['EWS-Plotting']['ChartConfig'] - # TODO get deposition_dir from config['Deposition']['PathTemplate'] - dep_regionname = 'Ethiopia' #SouthAsia + # use the first matching epi formulation + # TODO: Is there a more efficient way to select? + epi_filename = [ce['infectionRasterFileName'] for ce in config['Epi'] if ce['model']==epi_case_operational][0] - deposition_dir = f"{config['WorkspacePath']}DEPOSITION_{reference_date_str}/WR_NAME_{dep_regionname}_{reference_date_str}/" + dep_regionnames = ['SouthAsia','Ethiopia'] - # TODO: handle multiple diseases and regions in Processor as a loop, or in the config - deposition_disease_name = [disease_latin_name_dict[disease]+'_DEPOSITION' for disease in diseases][0] + # TODO get deposition_dir from config['Deposition']['PathTemplate'] + dep_regionname = 'Ethiopia' #SouthAsia - ews_plot_dir = f"{job_path}/plotting/" + deposition_dir = f"{config['WorkspacePath']}DEPOSITION_{reference_date_str}/WR_NAME_{dep_regionname}_{reference_date_str}/" - Path(ews_plot_dir).mkdir(parents=True, exist_ok=True) + # TODO: handle multiple diseases and regions in Processor as a loop, or in the config + deposition_disease_name = [disease_latin_name_dict[disease]+'_DEPOSITION' for disease in diseases][0] - # loop over diseases - ews_plotting_output_globs = [] - for disease in diseases: - disease_short = disease.lower().replace('rust','') + ews_plot_dir = f"{job_path}/plotting/" - # a fudge, guess disease type - # because config['ProcessInJob'] handles disease loop internally - # assumes disease name is the last directory before the filename - # TODO: handle multiple diseases and regions in Processor as a loop, or in the config - disease_to_drop = os.path.dirname(epi_filename).split('/')[-1].replace('Rust','') - disease_to_add = disease.replace('Rust','') - epi_filename = epi_filename.replace(disease_to_drop,disease_to_add) + Path(ews_plot_dir).mkdir(parents=True, exist_ok=True) - map_title = "Integrated prediction of Wheat $\\bf{" + disease_to_add + "}$ Rust infection" - if 'PlottingRegionName' not in config['EWS-Plotting']: - plotting_region_name_lower = config['RegionName'].lower() - else: - plotting_region_name_lower = config['EWS-Plotting']['PlottingRegionName'].lower() + # loop over diseases + ews_plotting_output_globs = [] + for disease in diseases: + disease_short = disease.lower().replace('rust','') - epi_seasonsofar_fn = epi_filename+'_per_ha_wheat_seasonsofar.csv' + # a fudge, guess disease type + # because config['ProcessInJob'] handles disease loop internally + # assumes disease name is the last directory before the filename + # TODO: handle multiple diseases and regions in Processor as a loop, or in the config + disease_to_drop = os.path.dirname(epi_filename).split('/')[-1].replace('Rust','') + disease_to_add = disease.replace('Rust','') + epi_filename = epi_filename.replace(disease_to_drop,disease_to_add) - epi_seasonincforecast_fn = epi_filename+'_per_ha_wheat.csv' + map_title = "Integrated prediction of Wheat $\\bf{" + disease_to_add + "}$ Rust infection" + if 'PlottingRegionName' not in config['EWS-Plotting']: + plotting_region_name_lower = config['RegionName'].lower() + else: + plotting_region_name_lower = config['EWS-Plotting']['PlottingRegionName'].lower() - seasonsofar_run_config = config['EWS-Plotting'].get('RunConfig_seasonsofar',None) + epi_seasonsofar_fn = epi_filename+'_per_ha_wheat_seasonsofar.csv' - # only run season so far (i.e. historic dates) if they exist - if (seasonsofar_run_config is not None) & os.path.exists(epi_seasonsofar_fn): + epi_seasonincforecast_fn = epi_filename+'_per_ha_wheat.csv' - logger.info(f"Running EWS-Plotting with the following configs:\n{sys_config}\n{seasonsofar_run_config}\n{chart_config}") + seasonsofar_run_config = config['EWS-Plotting'].get('RunConfig_seasonsofar',None) - epi_processor_1 = EPIPostPostProcessor() - epi_processor_1.set_param_config_files(sys_params_file_arg=sys_config, + # only run season so far (i.e. historic dates) if they exist + if (seasonsofar_run_config is not None) & os.path.exists(epi_seasonsofar_fn): + + logger.info(f"Running EWS-Plotting with the following configs:\n{sys_config}\n{seasonsofar_run_config}\n{chart_config}") + + epi_processor_1 = EPIPostPostProcessor() + epi_processor_1.set_param_config_files(sys_params_file_arg=sys_config, + chart_params_file_arg=chart_config, + run_params_file_arg=seasonsofar_run_config, + epi_input_csv_arg=epi_seasonsofar_fn, + disease_type_arg=disease_short+'_seasontodate', + issue_date_arg=reference_date_str, + output_dir_arg=ews_plot_dir, + wheat_sources_dir_arg=deposition_dir, + wheat_source_disease_name_arg=deposition_disease_name, + map_title_arg=map_title, + chart_area_prefix=plotting_region_name_lower) + epi_processor_1.process() + + # prepare command for seasonplusforecast + + run_config = config['EWS-Plotting']['RunConfig_seasonplusforecast'] + + logger.info(f"Running EWS-Plotting with the following configs:\n{sys_config}\n{run_config}\n{chart_config}") + + epi_processor_2 = EPIPostPostProcessor() + epi_processor_2.set_param_config_files(sys_params_file_arg=sys_config, chart_params_file_arg=chart_config, - run_params_file_arg=seasonsofar_run_config, - epi_input_csv_arg=epi_seasonsofar_fn, - disease_type_arg=disease_short+'_seasontodate', + run_params_file_arg=run_config, + epi_input_csv_arg=epi_seasonincforecast_fn, # for seasonplusforecast + #epi_input_csv_arg=epi_filename+'_weekahead.csv', # for weekahead + disease_type_arg=disease_short+'_seasonincforecast', issue_date_arg=reference_date_str, output_dir_arg=ews_plot_dir, wheat_sources_dir_arg=deposition_dir, wheat_source_disease_name_arg=deposition_disease_name, map_title_arg=map_title, chart_area_prefix=plotting_region_name_lower) - epi_processor_1.process() - - # prepare command for seasonplusforecast - - run_config = config['EWS-Plotting']['RunConfig_seasonplusforecast'] - - logger.info(f"Running EWS-Plotting with the following configs:\n{sys_config}\n{run_config}\n{chart_config}") - - epi_processor_2 = EPIPostPostProcessor() - epi_processor_2.set_param_config_files(sys_params_file_arg=sys_config, - chart_params_file_arg=chart_config, - run_params_file_arg=run_config, - epi_input_csv_arg=epi_seasonincforecast_fn, # for seasonplusforecast - #epi_input_csv_arg=epi_filename+'_weekahead.csv', # for weekahead - disease_type_arg=disease_short+'_seasonincforecast', - issue_date_arg=reference_date_str, - output_dir_arg=ews_plot_dir, - wheat_sources_dir_arg=deposition_dir, - wheat_source_disease_name_arg=deposition_disease_name, - map_title_arg=map_title, - chart_area_prefix=plotting_region_name_lower) - epi_processor_2.process() - - # check the output - ews_plotting_output_dir = f"{ews_plot_dir}/images/" - # TODO: Make this smarter, connected to the results of EWSPlottingEPIBase.plot_epi() - ews_plotting_output_globs: [str] = [] - ews_plotting_output_globs += [f"{ews_plotting_output_dir}infection_{plotting_region_name_lower}_*{disease_short}*.png"] - - ews_plotting_output_globs = get_only_existing_globs(ews_plotting_output_globs,inplace=False) - - # check there is some output from EWS-plotting - if not ews_plotting_output_globs: - logger.error('EWS-Plotting did not produce any output') - raise RuntimeError + epi_processor_2.process() + + # check the output + ews_plotting_output_dir = f"{ews_plot_dir}/images/" + # TODO: Make this smarter, connected to the results of EWSPlottingEPIBase.plot_epi() + ews_plotting_output_globs: [str] = [] + ews_plotting_output_globs += [f"{ews_plotting_output_dir}infection_{plotting_region_name_lower}_*{disease_short}*.png"] + + ews_plotting_output_globs = get_only_existing_globs(ews_plotting_output_globs,inplace=False) + + # check there is some output from EWS-plotting + if not ews_plotting_output_globs: + logger.error('EWS-Plotting did not produce any output') + raise RuntimeError if __name__ == '__main__': diff --git a/tests/integration/test_suites/epi_test_suite.py b/tests/integration/test_suites/epi_test_suite.py index ee60bc6..54784cf 100644 --- a/tests/integration/test_suites/epi_test_suite.py +++ b/tests/integration/test_suites/epi_test_suite.py @@ -37,7 +37,6 @@ class BaseEpiTestSuite: "*psbeta*gamma*alpha*") self.check_wildcard_exists_and_not_empty(alpha_beta_gamma_root, ".csv") - self.check_wildcard_exists_and_not_empty(alpha_beta_gamma_root, "*comparison.png") self.check_wildcard_exists_and_not_empty(alpha_beta_gamma_root, "*progression.csv") self.check_wildcard_exists_and_not_empty(alpha_beta_gamma_root, ".png") self.check_wildcard_exists_and_not_empty(alpha_beta_gamma_root, ".tif") -- GitLab